本教程介绍如何将 NAT 网关与中心辐射网络中的 Azure 防火墙集成,以提高出站连接性和可伸缩性。
对于为每个后端虚拟机规模集实例(最少两个实例)配置的每个公共 IP 地址,Azure 防火墙将提供 2,496 个 SNAT 端口。 最多可将 250 个公共 IP 地址关联到 Azure 防火墙。 根据体系结构要求和流量模式,可能需要更多的 SNAT 端口,而不是 Azure 防火墙可以提供的端口。 你可能还需要使用更少的公共 IP,同时需要更多的 SNAT 端口。 更好的出站连接方法是使用 NAT 网关。 NAT 网关为每个公共 IP 地址提供 64,512 个 SNAT 端口,最多可与 16 个公共 IP 地址一起使用。
NAT 网关可以通过将 NAT 网关直接配置为 Azure 防火墙子网来与 Azure 防火墙集成。 该关联提供了一种更具伸缩性的出站连接方式。 对于生产部署,建议使用中心辐射型网络,其中的防火墙位于其自身的虚拟网络中。 工作负载服务器是与防火墙所在的中心虚拟网络位于同一区域的对等互连虚拟网络。 在此体系结构设置中,NAT 网关可为对等互连的所有分支虚拟网络提供从中心虚拟网络的出站连接。
注意
安全虚拟网络(vWAN)体系结构目前不支持 Azure NAT 网关。 必须按照本教程中所述使用中心虚拟网络体系结构进行部署。 有关 Azure 防火墙体系结构选项的详细信息,请参阅什么是 Azure 防火墙管理器体系结构选项?。
本教程介绍如何执行下列操作:
- 在部署期间创建中心虚拟网络并部署 Azure 防火墙和 Azure Bastion
- 创建 NAT 网关并将其与中心虚拟网络中的防火墙子网相关联
- 创建分支虚拟网络
- 创建虚拟网络对等互连
- 为分支虚拟网络创建路由表
- 为中心虚拟网络创建防火墙策略
- 创建虚拟机以测试通过 NAT 网关进行的出站连接
必备条件
本文需要 Azure PowerShell 模块 1.0.0 或更高版本。 运行 Get-Module -ListAvailable Az
查找已安装的版本。 如果需要升级,请参阅安装 Azure PowerShell 模块。 此外,还需要运行 Connect-AzAccount -Environment AzureChinaCloud
以创建与 Azure 的连接。
创建中心虚拟网络
中心虚拟网络包含与 Azure 防火墙和 NAT 网关关联的防火墙子网。 使用以下示例创建中心虚拟网络。
登录到 Azure 门户。
在门户顶部的搜索框中,输入“虚拟网络”。 在搜索结果中,选择“虚拟网络”。
选择“+ 新建”。
在“创建虚拟网络的”基本信息“选项卡中,输入或选择以下信息:
设置 |
值 |
项目详细信息 |
|
订阅 |
选择订阅。 |
资源组 |
选择“新建”。
输入 test-rg。
选择“确定”。 |
实例详细信息 |
|
名称 |
输入 vnet-hub。 |
区域 |
选择“中国北部 3”。 |
选择下一步,转到安全性选项卡。
在“安全性”选项卡的“Azure Bastion”部分,选择“启用 Azure Bastion”。
Azure Bastion 使用浏览器通过安全外壳 (SSH) 或远程桌面协议 (RDP),通过使用其专用 IP 地址连接虚拟网络中的虚拟机。 虚拟机不需要公共 IP 地址、客户端软件或特殊配置。 有关 Azure Bastion 的详细信息,请参阅 Azure Bastion
注意
每小时定价从部署 Bastion 的时刻开始计算,无论出站数据的使用情况如何。 有关详细信息,请参阅定价和 SKU。 如果要将 Bastion 部署为教程或测试的一部分,建议在此资源使用完成后将其删除。
在“Azure Bastion”中,输入或选择以下信息:
设置 |
值 |
Azure Bastion 主机名 |
输入“堡垒”。 |
Azure Bastion 公共 IP 地址 |
选择“创建公共 IP 地址”。
在名称中输入 public-ip-bastion。
选择“确定”。 |
在“安全”选项卡的“Azure 防火墙”部分选择“启用 Azure 防火墙”。
Azure 防火墙是托管的基于云的网络安全服务,可保护 Azure 虚拟网络资源。 它是一个服务形式的完全有状态防火墙,具有内置的高可用性和不受限制的云可伸缩性。 有关 Azure 防火墙的详细信息,请参阅 Azure 防火墙。
在“Azure 防火墙”中,输入或选择以下信息:
设置 |
值 |
Azure 防火墙名称 |
输入 firewall。 |
层 |
选择“标准” 。 |
策略 |
选择“新建”。
在“名称”中输入“firewall-policy”。
选择“确定”。 |
Azure 防火墙公共 IP 地址 |
选择“创建公共 IP 地址”。
在“名称”中输入“public-ip-firewall”。
选择“确定”。 |
选择“下一步”,转到“IP 地址”选项卡。
选择“查看 + 创建”。
选择“创建”。
部署堡垒主机和防火墙需要几分钟时间。 在部署过程中创建虚拟网络时,可以继续执行后续步骤。
使用 New-AzResourceGroup 创建资源组。
# Create resource group
$rgParams = @{
Name = 'test-rg'
Location = 'China North 3'
}
New-AzResourceGroup @rgParams
使用 New-AzVirtualNetwork 创建中心虚拟网络。
# Create hub virtual network
$vnetParams = @{
ResourceGroupName = 'test-rg'
Location = 'China North 3'
Name = 'vnet-hub'
AddressPrefix = '10.0.0.0/16'
}
$hubVnet = New-AzVirtualNetwork @vnetParams
使用 Add-AzVirtualNetworkSubnetConfig 为 Azure 防火墙和 Azure Bastion 创建子网。
# Create default subnet
$subnetParams = @{
Name = 'subnet-1'
AddressPrefix = '10.0.0.0/24'
VirtualNetwork = $hubVnet
}
Add-AzVirtualNetworkSubnetConfig @subnetParams
# Create subnet for Azure Firewall
$subnetParams = @{
Name = 'AzureFirewallSubnet'
AddressPrefix = '10.0.1.64/26'
VirtualNetwork = $hubVnet
}
Add-AzVirtualNetworkSubnetConfig @subnetParams
# Create subnet for Azure Bastion
$subnetParams = @{
Name = 'AzureBastionSubnet'
AddressPrefix = '10.0.1.0/26'
VirtualNetwork = $hubVnet
}
Add-AzVirtualNetworkSubnetConfig @subnetParams
使用 Set-AzVirtualNetwork 更新虚拟网络。
# Create the virtual network
$hubVnet | Set-AzVirtualNetwork
使用 New-AzPublicIpAddress 为 Azure Bastion 创建公共 IP。
# Create public IP for Azure Bastion
$publicIpBastionParams = @{
ResourceGroupName = 'test-rg'
Location = 'China North 3'
Name = 'public-ip-bastion'
Sku = 'Standard'
AllocationMethod = 'Static'
Zone = 1, 2, 3
}
$publicIpBastion = New-AzPublicIpAddress @publicIpBastionParams
使用 New-AzBastion 创建 Azure Bastion。
# Create Azure Bastion
$bastionParams = @{
ResourceGroupName = "test-rg"
Name = "bastion"
VirtualNetworkName = "vnet-hub"
PublicIpAddressName = "public-ip-bastion"
PublicIPAddressRgName = "test-rg"
VirtualNetworkRgName = "test-rg"
}
New-AzBastion @bastionParams
使用 New-AzPublicIpAddress 为 Azure 防火墙创建公共 IP。
# Create public IP for Azure Firewall
$publicIpFirewallParams = @{
ResourceGroupName = 'test-rg'
Location = 'China North 3'
Name = 'public-ip-firewall'
AllocationMethod = 'Static'
Sku = 'Standard'
Zone = 1, 2, 3
}
$publicIpFirewall = New-AzPublicIpAddress @publicIpFirewallParams
使用 New-AzFirewallPolicy 创建防火墙策略。
# Create firewall policy
$firewallPolicyParams = @{
ResourceGroupName = 'test-rg'
Location = 'China North 3'
Name = 'firewall-policy'
}
$firewallPolicy = New-AzFirewallPolicy @firewallPolicyParams
使用 New-AzFirewall 创建 Azure 防火墙。
# Create Azure Firewall
$firewallParams = @{
ResourceGroupName = 'test-rg'
Location = 'China North 3'
Name = 'firewall'
VirtualNetworkName = 'vnet-hub'
PublicIpName = 'public-ip-firewall'
FirewallPolicyId = $firewallPolicy.Id
}
$firewall = New-AzFirewall @firewallParams
使用 az group create 创建资源组。
# Variables
RESOURCE_GROUP="test-rg"
LOCATION="chinanorth3"
az group create \
--name $RESOURCE_GROUP \
--location $LOCATION
使用 az network vnet create 创建中心虚拟网络。
# Variables
RESOURCE_GROUP="test-rg"
VNET_HUB_NAME="vnet-hub"
VNET_HUB_ADDRESS_PREFIX="10.0.0.0/16"
SUBNET_1_NAME="subnet-1"
SUBNET_1_PREFIX="10.0.0.0/24"
az network vnet create \
--resource-group $RESOURCE_GROUP \
--name $VNET_HUB_NAME \
--address-prefix $VNET_HUB_ADDRESS_PREFIX \
--subnet-name $SUBNET_1_NAME \
--subnet-prefix $SUBNET_1_PREFIX
使用 az network vnet subnet create 为 Azure Bastion 创建子网。
# Variables
RESOURCE_GROUP="test-rg"
VNET_HUB_NAME="vnet-hub"
BASTION_SUBNET_NAME="AzureBastionSubnet"
BASTION_SUBNET_PREFIX="10.0.1.0/26"
az network vnet subnet create \
--resource-group $RESOURCE_GROUP \
--vnet-name $VNET_HUB_NAME \
--name $BASTION_SUBNET_NAME \
--address-prefix $BASTION_SUBNET_PREFIX
使用 az network vnet subnet create 为 Azure 防火墙创建子网。
# Variables
RESOURCE_GROUP="test-rg"
VNET_HUB_NAME="vnet-hub"
FIREWALL_SUBNET_NAME="AzureFirewallSubnet"
FIREWALL_SUBNET_PREFIX="10.0.1.64/26"
az network vnet subnet create \
--resource-group $RESOURCE_GROUP \
--vnet-name $VNET_HUB_NAME \
--name $FIREWALL_SUBNET_NAME \
--address-prefix $FIREWALL_SUBNET_PREFIX
使用 az network public-ip create 为 Azure Bastion 创建公共 IP。
# Variables
RESOURCE_GROUP="test-rg"
BASTION_PUBLIC_IP_NAME="public-ip-bastion"
ALLOCATION_METHOD="Static"
SKU="Standard"
az network public-ip create \
--resource-group $RESOURCE_GROUP \
--name $BASTION_PUBLIC_IP_NAME \
--allocation-method $ALLOCATION_METHOD \
--sku $SKU
使用 az network bastion create 创建 Azure Bastion。
# Variables
RESOURCE_GROUP="test-rg"
BASTION_NAME="bastion"
BASTION_PUBLIC_IP_NAME="public-ip-bastion"
VNET_HUB_NAME="vnet-hub"
az network bastion create \
--resource-group $RESOURCE_GROUP \
--name $BASTION_NAME \
--public-ip-address $BASTION_PUBLIC_IP_NAME \
--vnet-name $VNET_HUB_NAME
使用 az network public-ip create 为 Azure 防火墙创建公共 IP。
# Variables
RESOURCE_GROUP="test-rg"
FIREWALL_PUBLIC_IP_NAME="public-ip-firewall"
ALLOCATION_METHOD="Static"
SKU="Standard"
az network public-ip create \
--resource-group $RESOURCE_GROUP \
--name $FIREWALL_PUBLIC_IP_NAME \
--allocation-method $ALLOCATION_METHOD \
--sku $SKU
使用 az network firewall policy create 创建防火墙策略。
# Variables
RESOURCE_GROUP="test-rg"
FIREWALL_POLICY_NAME="firewall-policy"
az network firewall policy create \
--resource-group $RESOURCE_GROUP \
--name $FIREWALL_POLICY_NAME
使用 az network firewall create 创建 Azure 防火墙。
# Variables
RESOURCE_GROUP="test-rg"
FIREWALL_NAME="firewall"
VNET_HUB_NAME="vnet-hub"
FIREWALL_POLICY_NAME="firewall-policy"
FIREWALL_PUBLIC_IP_NAME="public-ip-firewall"
az network firewall create \
--resource-group $RESOURCE_GROUP \
--name $FIREWALL_NAME \
--vnet-name $VNET_HUB_NAME \
--firewall-policy $FIREWALL_POLICY_NAME \
--public-ip $FIREWALL_PUBLIC_IP_NAME
创建 NAT 网关
所有出站 Internet 流量都穿越 NAT 网关传送到 Internet。 使用以下示例为中心辐射型网络创建 NAT 网关,并将其与 AzureFirewallSubnet 相关联。
在门户顶部的搜索框中,输入“NAT 网关”。 在搜索结果中选择“NAT 网关”。
选择“+ 新建”。
在“创建网络地址转换(NAT)网关”的“基本信息”选项卡中,输入或选择以下值:
设置 |
值 |
项目详细信息 |
|
订阅 |
选择订阅。 |
资源组 |
选择“test-rg”。 |
实例详细信息 |
|
NAT 网关名称 |
输入 nat-gateway。 |
区域 |
选择“中国北部 3”。 |
可用性区域 |
选择“区域”或“无区域”。 |
TCP 空闲超时(分钟) |
保留默认值“4”。 |
有关可用性区域的详细信息,请参阅 NAT 网关和可用性区域。
选择“下一步: 出站 IP”。
在“出站 IP”的“公共 IP 地址”中,选择“创建新的公共 IP 地址”。
在“名称”中输入 public-ip-nat。
选择“确定”。
选择“下一步: 子网”。
对于“虚拟网络”,请选择 vnet-hub。
在“子网名称”中选择“AzureFirewallSubnet”。
选择“查看 + 创建”。
选择“创建”。
使用 New-AzPublicIpAddress 为 NAT 网关创建公共 IP。
# Create public IP for NAT gateway
$publicIpNatParams = @{
ResourceGroupName = 'test-rg'
Location = 'chinanorth3'
Name = 'public-ip-nat'
AllocationMethod = 'Static'
Sku = 'Standard'
}
$publicIpNat = New-AzPublicIpAddress @publicIpNatParams
使用 New-AzNatGateway 创建 NAT 网关。
$natGatewayParams = @{
ResourceGroupName = 'test-rg'
Name = 'nat-gateway'
PublicIpAddress = $publicIpNat
Sku = 'Standard'
IdleTimeoutInMinutes = 4
Location = 'China North 3'
}
$natGateway = New-AzNatGateway @natGatewayParams
使用 Set-AzVirtualNetworkSubnetConfig 将 NAT 网关与 AzureFirewallSubnet 相关联。
# Get the AzureFirewallSubnet from the hub virtual network
$subnetParams = @{
VirtualNetwork = $hubVnet
Name = 'AzureFirewallSubnet'
}
$subnet = Get-AzVirtualNetworkSubnetConfig @subnetParams
$subnet.NatGateway = $natGateway
# Associate NAT gateway with AzureFirewallSubnet
$subnetParams = @{
VirtualNetwork = $hubVnet
Name = 'AzureFirewallSubnet'
AddressPrefix = '10.0.1.64/26'
NatGateway = $natGateway
}
Set-AzVirtualNetworkSubnetConfig @subnetParams
使用 Set-AzVirtualNetwork 更新虚拟网络。
# Update the virtual network
$hubVnet | Set-AzVirtualNetwork
使用 az network public-ip create 为 NAT 网关创建公共 IP。
# Variables
RESOURCE_GROUP="test-rg"
NAT_PUBLIC_IP_NAME="public-ip-nat"
ALLOCATION_METHOD="Static"
SKU="Standard"
az network public-ip create \
--resource-group $RESOURCE_GROUP \
--name $NAT_PUBLIC_IP_NAME \
--allocation-method $ALLOCATION_METHOD \
--sku $SKU
使用 az network nat gateway create 创建 NAT 网关。
# Variables
RESOURCE_GROUP="test-rg"
NAT_GATEWAY_NAME="nat-gateway"
NAT_PUBLIC_IP_NAME="public-ip-nat"
IDLE_TIMEOUT="4"
az network nat gateway create \
--resource-group $RESOURCE_GROUP \
--name $NAT_GATEWAY_NAME \
--public-ip-address $NAT_PUBLIC_IP_NAME \
--idle-timeout $IDLE_TIMEOUT
使用 az network vnet subnet update 将 NAT 网关与 AzureFirewallSubnet 相关联。
# Variables
RESOURCE_GROUP="test-rg"
VNET_HUB_NAME="vnet-hub"
FIREWALL_SUBNET_NAME="AzureFirewallSubnet"
NAT_GATEWAY_NAME="nat-gateway"
az network vnet subnet update \
--resource-group $RESOURCE_GROUP \
--vnet-name $VNET_HUB_NAME \
--name $FIREWALL_SUBNET_NAME \
--nat-gateway $NAT_GATEWAY_NAME
创建分支虚拟网络
分支虚拟网络包含用于测试 Internet 流量到 NAT 网关的路由的测试虚拟机。 使用以下示例创建分支网络。
在门户顶部的搜索框中,输入“虚拟网络”。 在搜索结果中,选择“虚拟网络”。
选择“+ 新建”。
在“创建虚拟网络的”基本信息“选项卡中,输入或选择以下信息:
设置 |
值 |
项目详细信息 |
|
订阅 |
选择订阅。 |
资源组 |
选择“test-rg”。 |
实例详细信息 |
|
名称 |
输入 vnet-spoke。 |
区域 |
选择“中国北部 3”。 |
选择下一步,转到安全性选项卡。
选择“下一步”,转到“IP 地址”选项卡。
在“IPv4 地址空间”中的“IP 地址”选项卡中,选择“删除地址空间”以删除自动填充的地址空间。
选择“添加 IPv4 地址空间”。
在“IPv4 地址空间”中,输入“10.1.0.0.”。 在掩码选择中保留默认值 /16(65536 个地址)。
选择“+添加子网”。
在“添加子网”中输入或选择以下信息:
设置 |
值 |
子网用途 |
保留默认值“默认”。 |
名称 |
输入 subnet-private。 |
IPv4 |
|
IPv4 地址范围 |
保留默认值“10.1.0.0/16”。 |
开始地址 |
保留默认值 10.1.0.0。 |
大小 |
保留默认值“/24 (256 个地址)”。 |
选择添加。
选择“查看 + 创建”。
选择“创建”。
使用 New-AzVirtualNetwork 创建分支虚拟网络。
# Create spoke virtual network
$vnetParams = @{
ResourceGroupName = 'test-rg'
Location = 'China North 3'
Name = 'vnet-spoke'
AddressPrefix = '10.1.0.0/16'
}
$spokeVnet = New-AzVirtualNetwork @vnetParams
使用 Add-AzVirtualNetworkSubnetConfig 为分支虚拟网络创建子网。
# Create subnet in spoke virtual network
$subnetParams = @{
Name = 'subnet-private'
AddressPrefix = '10.1.0.0/24'
VirtualNetwork = $spokeVnet
}
Add-AzVirtualNetworkSubnetConfig @subnetParams
使用 Set-AzVirtualNetwork 更新分支虚拟网络。
# Create the virtual network
$spokeVnet | Set-AzVirtualNetwork
使用 az network vnet create 创建分支虚拟网络。
# Variables
RESOURCE_GROUP="test-rg"
VNET_SPOKE_NAME="vnet-spoke"
VNET_SPOKE_ADDRESS_PREFIX="10.1.0.0/16"
SPOKE_SUBNET_NAME="subnet-private"
SPOKE_SUBNET_PREFIX="10.1.0.0/24"
az network vnet create \
--resource-group $RESOURCE_GROUP \
--name $VNET_SPOKE_NAME \
--address-prefix $VNET_SPOKE_ADDRESS_PREFIX \
--subnet-name $SPOKE_SUBNET_NAME \
--subnet-prefix $SPOKE_SUBNET_PREFIX
在中心与分支之间创建对等互连
虚拟网络对等互连用于将中心连接到分支,并将分支连接到中心。 使用以下示例在中心与分支之间创建双向网络对等互连。
在门户顶部的搜索框中,输入“虚拟网络”。 在搜索结果中,选择“虚拟网络”。
选择 vnet-hub。
在“设置”中选择“对等互连”。
选择“+ 添加”。
在“添加对等方”中,输入或选择以下信息:
设置 |
值 |
远程虚拟网络摘要 |
|
对等互连链接名称 |
输入 vnet-spoke-to-vnet-hub。 |
虚拟网络部署模型 |
保留默认值“资源管理器”。 |
订阅 |
选择订阅。 |
虚拟网络 |
选择 vnet-spoke (test-rg)。 |
远程虚拟网络对等互连设置 |
|
允许“vnet-spoke”访问“vnet-hub” |
保留默认值“已选择”。 |
允许“vnet-spoke”接收来自“vnet-hub”的转发流量 |
选中复选框。 |
允许“vnet-spoke”中的网关或路由服务器将流量转发到“vnet-hub” |
保留默认值“未选中”。 |
启用“vnet-spoke”以使用“vnet-hubb”远程网关或路由服务器 |
保留默认值“未选中”。 |
本地虚拟网络摘要 |
|
对等互连链接名称 |
输入 vnet-hub-to-vnet-spoke。 |
本地虚拟网络对等互连设置 |
|
允许“vnet-hub”访问“vnet-spoke” |
保留默认值“已选择”。 |
允许“vnet-hub”接收来自“vnet-spoke”的转发流量 |
选中复选框。 |
允许“vnet-hub”中的网关或路由服务器将流量转发到“vnet-spoke” |
保留默认值“未选中”。 |
启用“vnet-hub”以使用“vnet-spoke”远程网关或路由服务器 |
保留默认值“未选中”。 |
选择添加。
选择“刷新”并确认“对等互连状态”是否为“已连接”。
使用 Add-AzVirtualNetworkPeering 创建从中心到分支的对等互连。
# Create peering from hub to spoke
$peeringParams = @{
Name = 'vnet-hub-to-vnet-spoke'
VirtualNetwork = $hubVnet
RemoteVirtualNetworkId = $spokeVnet.Id
AllowForwardedTraffic = $true
}
Add-AzVirtualNetworkPeering @peeringParams
使用 Add-AzVirtualNetworkPeering 创建从分支到中心的对等互连。
# Create peering from spoke to hub
$peeringParams = @{
Name = 'vnet-spoke-to-vnet-hub'
VirtualNetwork = $spokeVnet
RemoteVirtualNetworkId = $hubVnet.Id
AllowForwardedTraffic = $true
}
Add-AzVirtualNetworkPeering @peeringParams
使用 az network vnet peering create 创建从中心到分支的对等互连。
# Variables
RESOURCE_GROUP="test-rg"
VNET_HUB_NAME="vnet-hub"
HUB_TO_SPOKE_PEERING_NAME="vnet-hub-to-vnet-spoke"
VNET_SPOKE_NAME="vnet-spoke"
az network vnet peering create \
--resource-group $RESOURCE_GROUP \
--vnet-name $VNET_HUB_NAME \
--name $HUB_TO_SPOKE_PEERING_NAME \
--remote-vnet $VNET_SPOKE_NAME \
--allow-forwarded-traffic
使用 az network vnet peering create 创建从分支到中心的对等互连。
# Variables
RESOURCE_GROUP="test-rg"
VNET_SPOKE_NAME="vnet-spoke"
SPOKE_TO_HUB_PEERING_NAME="vnet-spoke-to-vnet-hub"
VNET_HUB_NAME="vnet-hub"
az network vnet peering create \
--resource-group $RESOURCE_GROUP \
--vnet-name $VNET_SPOKE_NAME \
--name $SPOKE_TO_HUB_PEERING_NAME \
--remote-vnet $VNET_HUB_NAME \
--allow-forwarded-traffic
创建分支网络路由表
路由表将离开分支虚拟网络的所有流量强制发送到中心虚拟网络。 路由表中配置了 Azure 防火墙(作为虚拟设备)的专用 IP 地址。
获取防火墙的专用 IP 地址
本文稍后创建的路由表需要防火墙的专用 IP 地址。 使用以下示例获取防火墙的专用 IP 地址。
在门户顶部的搜索框中,输入“防火墙”。 在搜索结果中选择“防火墙”。
选择 firewall。
在“firewall”的“概述”中,记下“防火墙专用 IP”字段中的 IP 地址。 此示例中的 IP 地址为 10.0.1.68。
使用 Get-AzFirewall 获取防火墙的专用 IP 地址。
# Get the private IP address of the firewall
$firewallParams = @{
ResourceGroupName = 'test-rg'
Name = 'firewall'
}
$firewall = Get-AzFirewall @firewallParams
$firewall.IpConfigurations[0].PrivateIpAddress
# Get the private IP address of the firewall
az network firewall show \
--resource-group test-rg \
--name firewall \
--query "ipConfigurations[0].privateIpAddress" \
--output tsv
创建路由表
创建一个路由表,以强制所有分支间流量和 Internet 出口流量通过中心虚拟网络中的防火墙。
在门户顶部的搜索框中,输入“路由表”。 在搜索结果中选择“路由表”。
选择“+ 新建”。
在“创建路由表”中,输入或选择以下信息:
设置 |
值 |
项目详细信息 |
|
订阅 |
选择订阅。 |
资源组 |
选择“test-rg”。 |
实例详细信息 |
|
区域 |
选择“中国北部 3”。 |
名称 |
输入 route-table-spoke。 |
传播网关路由 |
请选择“否”。 |
选择“查看 + 创建”。
选择“创建”。
在门户顶部的搜索框中,输入“路由表”。 在搜索结果中选择“路由表”。
选择 route-table-spoke。
在“设置”中选择“路由”。
在“路由”中选择“+ 添加”。
在“添加路由”中,输入或选择以下信息:
设置 |
值 |
路由名称 |
输入 route-to-hub。 |
目标类型 |
选择“IP 地址”。 |
目标 IP 地址/CIDR 范围 |
输入 0.0.0.0/0。 |
下一跃点类型 |
选择“虚拟设备”。 |
下一跃点地址 |
输入“10.0.1.68”。 |
选择添加。
在“设置”中选择“子网”。
选择“+ 关联”。
在“关联子网”中,输入或选择以下信息:
设置 |
值 |
虚拟网络 |
选择 vnet-spoke (test-rg)。 |
子网 |
选择“subnet-private”。 |
选择“确定”。
使用 New-AzRouteTable 创建路由表。
# Create route table
$routeTableParams = @{
ResourceGroupName = 'test-rg'
Location = 'China North 3'
Name = 'route-table-spoke'
}
$routeTable = New-AzRouteTable @routeTableParams
使用 Add-AzRouteConfig 在路由表中创建路由。
# Create route
$routeConfigParams = @{
Name = 'route-to-hub'
AddressPrefix = '0.0.0.0/0'
NextHopType = 'VirtualAppliance'
NextHopIpAddress = $firewall.IpConfigurations[0].PrivateIpAddress
RouteTable = $routeTable
}
Add-AzRouteConfig @routeConfigParams
使用 Set-AzRouteTable 更新路由表。
# Update the route table
$routeTable | Set-AzRouteTable
使用 Set-AzVirtualNetworkSubnetConfig 将路由表与分支子网相关联。
# Associate route table with subnet
$subnetConfigParams = @{
VirtualNetwork = $spokeVnet
Name = 'subnet-private'
AddressPrefix = '10.1.0.0/24'
RouteTable = $routeTable
}
Set-AzVirtualNetworkSubnetConfig @subnetConfigParams
使用 Set-AzVirtualNetwork 更新分支虚拟网络。
# Update the virtual network
$spokeVnet | Set-AzVirtualNetwork
使用 az network route-table create 创建路由表。
# Variables
RESOURCE_GROUP="test-rg"
ROUTE_TABLE_NAME="route-table-spoke"
LOCATION="chinanorth3"
az network route-table create \
--resource-group $RESOURCE_GROUP \
--name $ROUTE_TABLE_NAME \
--location $LOCATION
使用 az network route-table route create 创建路由。
# Variables
RESOURCE_GROUP="test-rg"
ROUTE_TABLE_NAME="route-table-spoke"
ROUTE_NAME="route-to-hub"
ADDRESS_PREFIX="0.0.0.0/0"
NEXT_HOP_TYPE="VirtualAppliance"
NEXT_HOP_IP="10.0.1.68"
az network route-table route create \
--resource-group $RESOURCE_GROUP \
--route-table-name $ROUTE_TABLE_NAME \
--name $ROUTE_NAME \
--address-prefix $ADDRESS_PREFIX \
--next-hop-type $NEXT_HOP_TYPE \
--next-hop-ip-address $NEXT_HOP_IP
使用 az network vnet subnet update 将路由表与子网相关联。
# Variables
RESOURCE_GROUP="test-rg"
VNET_SPOKE_NAME="vnet-spoke"
SPOKE_SUBNET_NAME="subnet-private"
ROUTE_TABLE_NAME="route-table-spoke"
az network vnet subnet update \
--resource-group $RESOURCE_GROUP \
--vnet-name $VNET_SPOKE_NAME \
--name $SPOKE_SUBNET_NAME \
--route-table $ROUTE_TABLE_NAME
必须通过防火墙策略和网络规则允许来自分支的流量通过中心传送。 使用以下示例创建防火墙策略和网络规则。
在门户顶部的搜索框中,输入“防火墙”。 在搜索结果中选择“防火墙策略”。
选择 firewall-policy。
展开“设置”,然后选择“网络规则”。
选择“+ 添加规则集合”。
在“添加规则集合”中,输入或选择以下信息:
设置 |
值 |
名称 |
输入 spoke-to-internet。 |
规则集合类型 |
选择“网络”。 |
优先级 |
输入 100。 |
规则集合操作 |
选择“允许”。 |
规则集合组 |
选择“DefaultNetworkRuleCollectionGroup”。 |
规则 |
|
名称 |
输入 allow-web. |
源类型 |
IP 地址。 |
源 |
输入 10.1.0.0/24。 |
协议 |
选择“TCP”。 |
目标端口 |
输入 80,443。 |
目标类型 |
选择“IP 地址”。 |
目标 |
输入 * |
选择添加。
使用 Get-AzFirewallPolicy 获取现有的防火墙策略。
# Get the existing firewall policy
$firewallPolicyParams = @{
Name = 'firewall-policy'
ResourceGroupName = 'test-rg'
}
$firewallPolicy = Get-AzFirewallPolicy @firewallPolicyParams
使用 New-AzFirewallPolicyNetworkRule 创建网络规则。
# Create a network rule for web traffic
$networkRuleParams = @{
Name = 'allow-internet'
SourceAddress = '10.1.0.0/24'
Protocol = 'TCP'
DestinationAddress = '*'
DestinationPort = '*'
}
$networkRule = New-AzFirewallPolicyNetworkRule @networkRuleParams
使用 New-AzFirewallPolicyFilterRuleCollection 为网络规则创建规则集合。
# Create a rule collection for the network rule
$ruleCollectionParams = @{
Name = 'spoke-to-internet'
Priority = 100
Rule = $networkRule
ActionType = 'Allow'
}
$ruleCollection = New-AzFirewallPolicyFilterRuleCollection @ruleCollectionParams
使用 New-AzFirewallPolicyRuleCollectionGroup 创建规则集合组。
$newRuleCollectionGroupParams = @{
Name = 'DefaultNetworkRuleCollectionGroup'
Priority = 200
FirewallPolicyObject = $firewallPolicy
RuleCollection = $ruleCollection
}
New-AzFirewallPolicyRuleCollectionGroup @newRuleCollectionGroupParams
使用 az network firewall policy rule-collection-group create 创建规则集合组。
# Variables
RULE_COLLECTION_GROUP_NAME="DefaultNetworkRuleCollectionGroup"
FIREWALL_POLICY_NAME="firewall-policy"
RESOURCE_GROUP="test-rg"
PRIORITY="200"
az network firewall policy rule-collection-group create \
--name $RULE_COLLECTION_GROUP_NAME \
--policy-name $FIREWALL_POLICY_NAME \
--resource-group $RESOURCE_GROUP \
--priority $PRIORITY
使用 az network firewall policy rule-collection-group collection add-filter-collection 创建网络政策规则。
# Variables
COLLECTION_NAME="spoke-to-internet"
ACTION="Allow"
RULE_NAME="allow-web"
RULE_TYPE="NetworkRule"
SOURCE_ADDRESSES="10.1.0.0/24"
IP_PROTOCOLS="TCP"
DESTINATION_ADDRESSES="*"
DESTINATION_PORTS="*"
COLLECTION_PRIORITY="100"
FIREWALL_POLICY_NAME="firewall-policy"
RESOURCE_GROUP="test-rg"
RULE_COLLECTION_GROUP_NAME="DefaultNetworkRuleCollectionGroup"
az network firewall policy rule-collection-group collection add-filter-collection \
--name $COLLECTION_NAME \
--action $ACTION \
--rule-name $RULE_NAME \
--rule-type $RULE_TYPE \
--source-addresses $SOURCE_ADDRESSES \
--ip-protocols $IP_PROTOCOLS \
--destination-addresses $DESTINATION_ADDRESSES \
--destination-ports $DESTINATION_PORTS \
--collection-priority $COLLECTION_PRIORITY \
--policy-name $FIREWALL_POLICY_NAME \
--resource-group $RESOURCE_GROUP \
--rule-collection-group-name $RULE_COLLECTION_GROUP_NAME
创建测试虚拟机
使用 Ubuntu 虚拟机来测试通过 NAT 网关传送出站 Internet 流量。 使用以下示例创建 Ubuntu 虚拟机。
在门户中,搜索并选择“虚拟机”。
在“虚拟机”中,依次选择“+ 创建”、“Azure 虚拟机”。
在“创建虚拟机”的“基本信息”选项卡上,输入或选择以下信息:
设置 |
值 |
项目详细信息 |
|
订阅 |
选择订阅。 |
资源组 |
选择“test-rg”。 |
实例详细信息 |
|
虚拟机名称 |
输入 vm-spoke。 |
区域 |
选择“中国北部 3”。 |
可用性选项 |
选择“无需基础结构冗余”。 |
安全类型 |
保留默认值标准。 |
映像 |
选择“Ubuntu Server 24.04 LTS - Gen2”。 |
大小 |
选择一个大小。 |
管理员帐户 |
|
身份验证类型 |
选择密码。 |
用户名 |
输入“azureuser”。 |
密码 |
输入密码。 |
确认密码 |
重新输入密码。 |
入站端口规则 |
|
公共入站端口 |
选择无。 |
选择页面顶部的“网络”选项卡,或者选择“下一步: 磁盘”,然后选择“下一步: 网络”。
在“网络”选项卡中,输入或选择以下信息:
设置 |
值 |
网络接口 |
|
虚拟网络 |
选择 vnet-spoke。 |
子网 |
选择“subnet-private (10.1.0.0/24)”。 |
公共 IP |
选择无。 |
NIC 网络安全组 |
选择“高级”。 |
配置网络安全组 |
选择“新建”。
在“名称”中输入“nsg-1”。
将其余字段保留默认设置,然后选择“确定”。 |
将其余设置保留为默认值,然后选择“查看 + 创建”。
检查设置,然后选择“创建”。
等待虚拟机完成部署,然后再继续执行后续步骤。
注意
虚拟网络中具有堡垒主机的虚拟机不需要公共 IP 地址。 Bastion 提供公共 IP,虚拟机使用专用 IP 在网络中进行通信。 可以从堡垒托管的虚拟网络的任何虚拟机中删除公共 IP。 有关详细信息,请参阅 将公共 IP 地址与 Azure VM 取消关联。
使用 New-AzNetworkSecurityGroup 创建网络安全组。
$nsgParams = @{
ResourceGroupName = "test-rg"
Name = "nsg-1"
Location = "chinanorth3"
}
New-AzNetworkSecurityGroup @nsgParams
使用 New-AzNetworkInterface 创建网络接口。
$nicParams = @{
ResourceGroupName = "test-rg"
Name = "nic-1"
SubnetId = (Get-AzVirtualNetwork -ResourceGroupName "test-rg" -Name "vnet-spoke").Subnets[0].Id
NetworkSecurityGroupId = (Get-AzNetworkSecurityGroup -ResourceGroupName "test-rg" -Name "nsg-1").Id
Location = "chinanorth3"
}
New-AzNetworkInterface @nicParams
使用 Get-Credential 设置 VM 的用户名和密码,并将其存储在 $cred
变量中。
$cred = Get-Credential
注意
需要为 VM 提供一个用户名。 密码是可选的,如果未设置,则不使用密码。 对于 Linux VM,建议使用 SSH 密钥配置。
使用 New-AzVMConfig 定义 VM。
$vmConfigParams = @{
VMName = "vm-spoke"
VMSize = "Standard_DS4_v2"
}
$vmConfig = New-AzVMConfig @vmConfigParams
使用 Set-AzVMOperatingSystem 和 Set-AzVMSourceImage 创建 VM 配置的其余部分。 以下示例创建 Ubuntu Server 虚拟机:
$osParams = @{
VM = $vmConfig
ComputerName = "vm-spoke"
Credential = $cred
}
$vmConfig = Set-AzVMOperatingSystem @osParams -Linux -DisablePasswordAuthentication
$imageParams = @{
VM = $vmConfig
PublisherName = "Canonical"
Offer = "ubuntu-24_04-lts"
Skus = "server"
Version = "latest"
}
$vmConfig = Set-AzVMSourceImage @imageParams
使用 Add-AzVMNetworkInterface 将之前创建的 NIC 附加到 VM。
# Get the network interface object
$nicParams = @{
ResourceGroupName = "test-rg"
Name = "nic-1"
}
$nic = Get-AzNetworkInterface @nicParams
$vmConfigParams = @{
VM = $vmConfig
Id = $nic.Id
}
$vmConfig = Add-AzVMNetworkInterface @vmConfigParams
使用 New-AzVM 创建 VM。 该命令为虚拟机生成用于登录的 SSH 密钥。 记下该私钥的位置。 在后续步骤中,使用 Azure Bastion 连接到虚拟机时将需要该私钥。
$vmParams = @{
VM = $vmConfig
ResourceGroupName = "test-rg"
Location = "chinanorth3"
SshKeyName = "ssh-key"
}
New-AzVM @vmParams -GenerateSshKey
使用 az network nsg create 创建网络安全组。
# Variables
RESOURCE_GROUP="test-rg"
NSG_NAME="nsg-1"
LOCATION="chinanorth3"
az network nsg create \
--resource-group $RESOURCE_GROUP \
--name $NSG_NAME \
--location $LOCATION
使用 az network nic create 创建网络接口。
# Variables
RESOURCE_GROUP="test-rg"
NIC_NAME="vm-spoke-nic"
VNET_SPOKE_NAME="vnet-spoke"
SPOKE_SUBNET_NAME="subnet-private"
NSG_NAME="nsg-1"
az network nic create \
--resource-group $RESOURCE_GROUP \
--name $NIC_NAME \
--vnet-name $VNET_SPOKE_NAME \
--subnet $SPOKE_SUBNET_NAME \
--network-security-group $NSG_NAME
使用 az vm create 创建虚拟机。
# Variables
RESOURCE_GROUP="test-rg"
VM_NAME="vm-spoke"
LOCATION="chinanorth3"
NIC_NAME="vm-spoke-nic"
VM_IMAGE="Ubuntu2204"
ADMIN_USERNAME="azureuser"
az vm create \
--resource-group $RESOURCE_GROUP \
--name $VM_NAME \
--location $LOCATION \
--nics $NIC_NAME \
--image $VM_IMAGE \
--admin-username $ADMIN_USERNAME \
--generate-ssh-keys
测试 NAT 网关
连接到在前面步骤中创建的 Ubuntu 虚拟机,以验证出站 Internet 流量是否从 NAT 网关传出。
获取 NAT 网关公共 IP 地址
获取 NAT 网关公共 IP 地址,以验证本文稍后的步骤。
在门户顶部的搜索框中,输入“公共 IP”。 在搜索结果中,选择“公共 IP 地址”。
选择“public-ip-nat”。
记下“IP 地址”中的值。 本文中使用的示例为 203.0.113.0.25。
使用 Get-AzPublicIpAddress 获取 NAT 网关的公共 IP 地址。
# Get the public IP address of the NAT gateway
$publicIpNatParams = @{
ResourceGroupName = 'test-rg'
Name = 'public-ip-nat'
}
$publicIpNat = Get-AzPublicIpAddress @publicIpNatParams
$publicIpNat.IpAddress
使用 az network public-ip show 获取 NAT 网关的公共 IP 地址。
# Variables
RESOURCE_GROUP="test-rg"
NAT_PUBLIC_IP_NAME="public-ip-nat"
az network public-ip show \
--resource-group $RESOURCE_GROUP \
--name $NAT_PUBLIC_IP_NAME \
--query "ipAddress" \
--output tsv
从分支测试 NAT 网关
在门户顶部的搜索框中,输入“虚拟机”。 在搜索结果中,选择“虚拟机”。
选择 vm-spoke。
在“概述”中,选择“连接”,然后选择“通过 Bastion 连接”。
选择 SSH 作为连接类型。 上传 SSH 私钥文件。 选择“连接”。
在 bash 提示符下,输入以下命令:
curl ifconfig.me
验证命令返回的 IP 地址是否与 NAT 网关的公共 IP 地址匹配。
azureuser@vm-1:~$ curl ifconfig.me
203.0.113.0.25
关闭堡垒主机与 vm-spoke 的连接。
清理资源
使用创建的资源之后,可以删除资源组及其所有资源:
在 Azure 门户中,搜索并选择“资源组”。
在“资源组”页上,选择“test-rg”资源组。
在“test-rg”页上,选择“删除资源组”。
在“输入资源组名称以确认删除”中输入“test-rg”,然后选择“删除”。
使用 Remove-AzResourceGroup 删除资源组。
# Remove resource group
$rgParams = @{
Name = 'test-rg'
}
Remove-AzResourceGroup @rgParams
使用 az group delete 删除资源组。
# Variables
RESOURCE_GROUP="test-rg"
az group delete \
--name $RESOURCE_GROUP \
--yes \
--no-wait
后续步骤
请继续学习下一篇文章,了解如何将 NAT 网关与 Azure 负载均衡器集成: