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

使用 Azure CLI 部署和配置 Azure 防火墙

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

可以控制 Azure 子网的出站网络访问的一种方法是使用 Azure 防火墙。 使用 Azure 防火墙,可以配置:

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

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

在本文中,你将创建一个包含三个子网的简化 VNet,以便于部署。 对于生产部署,我们建议使用中心辐射模型。 防火墙位于其自身的 VNet 中。 工作负荷服务器在包含一个或多个子网的同一区域中的对等 VNet 内。

  • AzureFirewallSubnet - 防火墙在此子网中。
  • Workload-SN - 工作负荷服务器在此子网中。 此子网的网络流量通过防火墙。
  • Jump-SN -“跳转”服务器在此子网中。 可以使用远程桌面连接到跳转服务器中的公共 IP 地址。 然后,可在跳转服务器中(使用另一个远程桌面)连接到工作负荷服务器。

网络基础结构示意图。

在本文中,学习如何:

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

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

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

先决条件

  • 本文需要 Azure CLI 版本 2.0.4 或更高版本。 如果使用 Azure Cloud Shell,则最新版本已安装。

设置网络

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

创建资源组

资源组包含用于部署的所有资源。

az group create --name Test-FW-RG --location eastus

创建 VNet

此虚拟网络有三个子网。

注意

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

az network vnet create \
  --name Test-FW-VN \
  --resource-group Test-FW-RG \
  --location eastus \
  --address-prefix 10.0.0.0/16 \
  --subnet-name AzureFirewallSubnet \
  --subnet-prefix 10.0.1.0/26
az network vnet subnet create \
  --name Workload-SN \
  --resource-group Test-FW-RG \
  --vnet-name Test-FW-VN   \
  --address-prefix 10.0.2.0/24
az network vnet subnet create \
  --name Jump-SN \
  --resource-group Test-FW-RG \
  --vnet-name Test-FW-VN   \
  --address-prefix 10.0.3.0/24

创建虚拟机

现在,创建跳转虚拟机和工作负荷虚拟机,并将其放入相应的子网。 出现提示时,请键入虚拟机的密码。

创建 Srv-Jump 虚拟机。

az vm create \
    --resource-group Test-FW-RG \
    --name Srv-Jump \
    --location eastus \
    --image win2016datacenter \
    --vnet-name Test-FW-VN \
    --subnet Jump-SN \
    --admin-username azureadmin
az vm open-port --port 3389 --resource-group Test-FW-RG --name Srv-Jump

使用特定的 DNS 服务器 IP 地址为 Srv-Work 创建 NIC,并且不使用公共 IP 地址进行测试。

az network nic create \
    -g Test-FW-RG \
    -n Srv-Work-NIC \
   --vnet-name Test-FW-VN \
   --subnet Workload-SN \
   --public-ip-address "" \
   --dns-servers 209.244.0.3 209.244.0.4

现在,创建工作负荷虚拟机。 出现提示时,请键入虚拟机的密码。

az vm create \
    --resource-group Test-FW-RG \
    --name Srv-Work \
    --location eastus \
    --image win2016datacenter \
    --nics Srv-Work-NIC \
    --admin-username azureadmin

注意

Azure 会为未分配公共 IP 地址的 VM 或位于内部基本 Azure 负载均衡器的后端池中的 VM 提供默认出站访问 IP。 默认出站访问 IP 机制会提供不可配置的出站 IP 地址。

当将公共 IP 地址分配给 VM、将 VM 放置在具有或不具有出站规则的标准负载均衡器的后端池中,或者将 Azure 虚拟网络 NAT 网关资源分配给 VM 的子网时,默认禁用出站访问 IP。

在灵活业务流程模式下由虚拟机规模集创建的 VM 没有默认的出站访问权限。

有关 Azure 中的出站连接的详细信息,请参阅 Azure 中的默认出站访问权限使用用于出站连接的源网络地址转换 (SNAT)

部署防火墙

现在,将防火墙部署到虚拟网络。

az network firewall create \
    --name Test-FW01 \
    --resource-group Test-FW-RG \
    --location eastus
az network public-ip create \
    --name fw-pip \
    --resource-group Test-FW-RG \
    --location eastus \
    --allocation-method static \
    --sku standard
az network firewall ip-config create \
    --firewall-name Test-FW01 \
    --name FW-config \
    --public-ip-address fw-pip \
    --resource-group Test-FW-RG \
    --vnet-name Test-FW-VN
az network firewall update \
    --name Test-FW01 \
    --resource-group Test-FW-RG 
az network public-ip show \
    --name fw-pip \
    --resource-group Test-FW-RG
fwprivaddr="$(az network firewall ip-config list -g Test-FW-RG -f Test-FW01 --query "[?name=='FW-config'].privateIpAddress" --output tsv)"

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

创建默认路由

创建一个禁用 BGP 路由传播的路由表

az network route-table create \
    --name Firewall-rt-table \
    --resource-group Test-FW-RG \
    --location eastus \
    --disable-bgp-route-propagation true

创建路由。

az network route-table route create \
  --resource-group Test-FW-RG \
  --name DG-Route \
  --route-table-name Firewall-rt-table \
  --address-prefix 0.0.0.0/0 \
  --next-hop-type VirtualAppliance \
  --next-hop-ip-address $fwprivaddr

将路由表关联到子网

az network vnet subnet update \
    -n Workload-SN \
    -g Test-FW-RG \
    --vnet-name Test-FW-VN \
    --address-prefixes 10.0.2.0/24 \
    --route-table Firewall-rt-table

配置应用程序规则

此应用程序规则允许对 www.google.com 进行出站访问。

az network firewall application-rule create \
   --collection-name App-Coll01 \
   --firewall-name Test-FW01 \
   --name Allow-Google \
   --protocols Http=80 Https=443 \
   --resource-group Test-FW-RG \
   --target-fqdns www.google.com \
   --source-addresses 10.0.2.0/24 \
   --priority 200 \
   --action Allow

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

配置网络规则

此网络规则允许对端口 53 (DNS) 上的两个 IP 地址进行出站访问。

az network firewall network-rule create \
   --collection-name Net-Coll01 \
   --destination-addresses 209.244.0.3 209.244.0.4 \
   --destination-ports 53 \
   --firewall-name Test-FW01 \
   --name Allow-DNS \
   --protocols UDP \
   --resource-group Test-FW-RG \
   --priority 200 \
   --source-addresses 10.0.2.0/24 \
   --action Allow

测试防火墙

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

  1. 记下 Srv-Work 虚拟机的专用 IP 地址:

    az vm list-ip-addresses \
    -g Test-FW-RG \
    -n Srv-Work
    
  2. 将远程桌面连接到 Srv-Jump 虚拟机,然后登录。 在该虚拟机中,与 Srv-Work 专用 IP 地址建立远程桌面连接并登录。

  3. SRV-Work 上,打开 PowerShell 窗口并运行以下命令:

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

    这两个命令都应返回应答,表明 DNS 查询正在通过防火墙。

  4. 运行以下命令:

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

    www.google.com 请求应成功,并且 www.microsoft.com 请求应失败。 这表明防火墙规则按预期运行。

现已验证防火墙规则可正常工作:

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

清理资源

可以将防火墙资源保留到下一教程使用。不再需要时,请删除 Test-FW-RG 资源组,以删除与防火墙相关的所有资源:

az group delete \
  -n Test-FW-RG

后续步骤