你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Azure PowerShell 部署和配置 Azure 防火墙策略

控制出站网络访问是整个网络安全计划的重要组成部分。 例如,你可能想要限制对网站的访问。 您可能希望限制可以访问的出站 IP 地址和端口。

可以使用 Azure 防火墙和防火墙策略从 Azure 子网控制出站网络访问。 通过使用 Azure 防火墙,可以配置:

  • 应用程序规则,用于定义可从子网访问的完全限定域名 (FQDN)。
  • 网络规则,用于定义源地址、协议、目标端口和目标地址。

将网络流量路由到用作子网默认网关的防火墙时,网络流量受到配置的防火墙规则的控制。

在本文中,你将创建一个简化的单一虚拟网络,其中包含三个子网,以便轻松部署。 对于生产部署,请使用 中心辐射模型,其中防火墙位于其自己的虚拟网络中。 工作负载服务器位于同一区域的对等虚拟网络中,并包含一个或多个子网。

  • AzureFirewallSubnet - 防火墙在此子网中。
  • Workload-SN - 工作负荷服务器在此子网中。 此子网的网络流量通过防火墙。
  • AzureBastionSubnet - 用于连接到工作负载服务器的 Azure Bastion 子网。

有关 Azure Bastion 的详细信息,请参阅什么是 Azure Bastion?

重要

小时定价从部署 Bastion 的时刻开始计算,而无论出站数据使用情况如何。 有关详细信息,请参阅定价SKU。 如果要将 Bastion 部署为教程或测试的一部分,建议在使用完此资源后将其删除。

显示防火墙网络基础结构的示意图。

在本文中,您将学习如何:

  • 设置测试网络环境
  • 部署防火墙
  • 创建默认路由
  • 创建防火墙策略
  • 配置一个应用程序规则以允许访问 www.google.com
  • 配置网络规则,以允许访问外部 DNS 服务器
  • 测试防火墙

如果愿意,可以使用 Azure 门户完成此过程。

如果没有 Azure 订阅,请在开始之前创建一个免费帐户

先决条件

此过程要求在本地运行 PowerShell。 必须安装 Azure PowerShell 模块。 运行 Get-Module -ListAvailable Az 即可查找版本。 如果需要进行升级,请参阅 Install Azure PowerShell module(安装 Azure PowerShell 模块)。 验证 PowerShell 版本以后,请运行 Connect-AzAccount,以便创建与 Azure 的连接。

设置网络

首先,创建一个资源组用于包含部署防火墙所需的资源。 然后创建虚拟网络、子网和测试服务器。

创建资源组

使用 New-AzResourceGroup 为部署创建资源组:

New-AzResourceGroup -Name Test-FW-RG -Location "East US"

创建虚拟网络和 Azure Bastion 主机

此虚拟网络有三个子网。 使用 New-AzVirtualNetworkSubnetConfig 定义它们:

注意

AzureFirewallSubnet 子网的大小为 /26。 有关子网大小的详细信息,请参阅 Azure 防火墙常见问题解答

$Bastionsub = New-AzVirtualNetworkSubnetConfig `
    -Name AzureBastionSubnet `
    -AddressPrefix 10.0.0.0/27
$FWsub = New-AzVirtualNetworkSubnetConfig `
    -Name AzureFirewallSubnet `
    -AddressPrefix 10.0.1.0/26
$Worksub = New-AzVirtualNetworkSubnetConfig `
    -Name Workload-SN `
    -AddressPrefix 10.0.2.0/24

使用 New-AzVirtualNetwork 创建虚拟网络:

$testVnet = New-AzVirtualNetwork `
    -Name Test-FW-VN `
    -ResourceGroupName Test-FW-RG `
    -Location "East US" `
    -AddressPrefix 10.0.0.0/16 `
    -Subnet $Bastionsub, $FWsub, $Worksub

创建 Azure Bastion 主机的公共 IP 地址

使用 New-AzPublicIpAddress 为 Bastion 主机创建静态公共 IP 地址:

$publicip = New-AzPublicIpAddress `
    -ResourceGroupName Test-FW-RG `
    -Location "East US" `
    -Name Bastion-pip `
    -AllocationMethod Static `
    -Sku Standard

创建 Azure Bastion 主机

使用 New-AzBastion 创建 Bastion 主机:

New-AzBastion `
    -ResourceGroupName Test-FW-RG `
    -Name Bastion-01 `
    -PublicIpAddress $publicip `
    -VirtualNetwork $testVnet

创建虚拟机

使用 New-AzVM 创建工作负荷虚拟机。 出现提示时,输入用户名和密码:

# Create the NIC
$wsn = Get-AzVirtualNetworkSubnetConfig `
    -Name Workload-SN `
    -VirtualNetwork $testVnet
$NIC01 = New-AzNetworkInterface `
    -Name Srv-Work `
    -ResourceGroupName Test-FW-RG `
    -Location "East US" `
    -Subnet $wsn

# Define the virtual machine
$VirtualMachine = New-AzVMConfig `
    -VMName Srv-Work `
    -VMSize "Standard_DS2"
$VirtualMachine = Set-AzVMOperatingSystem `
    -VM $VirtualMachine `
    -Windows `
    -ComputerName Srv-Work `
    -ProvisionVMAgent `
    -EnableAutoUpdate
$VirtualMachine = Add-AzVMNetworkInterface `
    -VM $VirtualMachine `
    -Id $NIC01.Id
$VirtualMachine = Set-AzVMSourceImage `
    -VM $VirtualMachine `
    -PublisherName 'MicrosoftWindowsServer' `
    -Offer 'WindowsServer' `
    -Skus '2019-Datacenter' `
    -Version latest

# Create the virtual machine
New-AzVM `
    -ResourceGroupName Test-FW-RG `
    -Location "East US" `
    -VM $VirtualMachine `
    -Verbose

创建防火墙策略

使用 New-AzFirewallPolicy 创建防火墙策略:

$fwpol = New-AzFirewallPolicy `
    -Name fw-pol `
    -ResourceGroupName Test-FW-RG `
    -Location "East US"

配置防火墙策略应用程序规则

使用 New-AzFirewallPolicyApplicationRuleNew-AzFirewallPolicyFilterRuleCollection 创建授予出站访问权限 www.google.com的应用程序规则:

$RCGroup = New-AzFirewallPolicyRuleCollectionGroup `
    -Name AppRCGroup `
    -Priority 100 `
    -FirewallPolicyObject $fwpol
$apprule1 = New-AzFirewallPolicyApplicationRule `
    -Name Allow-google `
    -SourceAddress "10.0.2.0/24" `
    -Protocol "http:80","https:443" `
    -TargetFqdn www.google.com
$appcoll1 = New-AzFirewallPolicyFilterRuleCollection `
    -Name App-coll01 `
    -Priority 100 `
    -Rule $apprule1 `
    -ActionType "Allow"
Set-AzFirewallPolicyRuleCollectionGroup `
    -Name $RCGroup.Name `
    -Priority 100 `
    -RuleCollection $appcoll1 `
    -FirewallPolicyObject $fwpol

Azure 防火墙包含默认情况下允许的基础结构 FQDN 的内置规则集合。 这些 FQDN 特定于平台,不能用于其他目的。 有关详细信息,请参阅基础结构 FQDN

配置防火墙策略网络规则

使用 New-AzFirewallPolicyNetworkRuleNew-AzFirewallPolicyFilterRuleCollection 创建一个网络规则,以授予对端口 53(DNS) 两个 IP 地址的出站访问权限:

$RCGroup = New-AzFirewallPolicyRuleCollectionGroup `
    -Name NetRCGroup `
    -Priority 200 `
    -FirewallPolicyObject $fwpol
$netrule1 = New-AzFirewallPolicyNetworkRule `
    -Name Allow-DNS `
    -Protocol UDP `
    -SourceAddress 10.0.2.0/24 `
    -DestinationAddress 209.244.0.3,209.244.0.4 `
    -DestinationPort 53
$netcoll1 = New-AzFirewallPolicyFilterRuleCollection `
    -Name Net-coll01 `
    -Priority 200 `
    -Rule $netrule1 `
    -ActionType "Allow"
Set-AzFirewallPolicyRuleCollectionGroup `
    -Name $RCGroup.Name `
    -Priority 200 `
    -RuleCollection $netcoll1 `
    -FirewallPolicyObject $fwpol

部署防火墙

使用 New-AzPublicIpAddressNew-AzFirewall 将防火墙部署到虚拟网络中:

# Get a Public IP for the firewall
$FWpip = New-AzPublicIpAddress `
    -Name "fw-pip" `
    -ResourceGroupName Test-FW-RG `
    -Location "East US" `
    -AllocationMethod Static `
    -Sku Standard
# Create the firewall
$Azfw = New-AzFirewall `
    -Name Test-FW01 `
    -ResourceGroupName Test-FW-RG `
    -Location "East US" `
    -VirtualNetwork $testVnet `
    -PublicIpAddress $FWpip `
    -FirewallPolicyId $fwpol.Id

# Save the firewall private IP address for future use

$AzfwPrivateIP = $Azfw.IpConfigurations.privateipaddress
$AzfwPrivateIP

记下专用 IP 地址。 稍后在创建默认路由时需要用到它。

创建默认路由

使用 New-AzRouteTableAdd-AzRouteConfig 创建一个路由表,其中包含指向防火墙的默认路由,然后将其与工作负荷子网相关联:

$routeTableDG = New-AzRouteTable `
    -Name Firewall-rt-table `
    -ResourceGroupName Test-FW-RG `
    -Location "East US" `
    -DisableBgpRoutePropagation

# Create a route
Add-AzRouteConfig `
    -Name "DG-Route" `
    -RouteTable $routeTableDG `
    -AddressPrefix 0.0.0.0/0 `
    -NextHopType "VirtualAppliance" `
    -NextHopIpAddress $AzfwPrivateIP `
    | Set-AzRouteTable

# Associate the route table to the subnet
Set-AzVirtualNetworkSubnetConfig `
    -VirtualNetwork $testVnet `
    -Name Workload-SN `
    -AddressPrefix 10.0.2.0/24 `
    -RouteTable $routeTableDG | Set-AzVirtualNetwork

更改 Srv-Work 网络接口的主要和辅助 DNS 地址

为了在此过程中进行测试,请配置服务器的主要和辅助 DNS 地址。 此配置不是一般 Azure 防火墙要求。

$NIC01.DnsSettings.DnsServers.Add("209.244.0.3")
$NIC01.DnsSettings.DnsServers.Add("209.244.0.4")
$NIC01 | Set-AzNetworkInterface

测试防火墙

现在测试防火墙,以确认它是否按预期方式工作。

  1. 使用 Bastion 连接到 Srv-Work 虚拟机并登录。

    显示使用 Azure Bastion 连接到 Srv-Work 虚拟机的屏幕截图。

  2. 在 Srv-Work 上,打开 PowerShell 窗口并运行以下命令:

    nslookup www.google.com
    nslookup www.microsoft.com
    

    这两个命令都返回答案,显示 DNS 查询通过防火墙。

  3. 运行以下命令:

    Invoke-WebRequest -Uri https://www.google.com
    
    Invoke-WebRequest -Uri https://www.microsoft.com
    

    请求 www.google.com 成功,请求 www.microsoft.com 失败。 此结果演示防火墙规则按预期运行。

现在,你已验证防火墙策略规则是否正常工作:

  • 可以使用配置的外部 DNS 服务器解析 DNS 名称。
  • 您可以浏览到唯一允许的一个 FQDN,但不能浏览到其他任何 FQDN。

清理资源

可以保留防火墙资源以便进行进一步测试。 如果不再需要它们,请删除 Test-FW-RG 资源组以删除所有与防火墙相关的资源:

Remove-AzResourceGroup -Name Test-FW-RG

后续步骤