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

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

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

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

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

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

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

网络基础结构示意图。

在本文中,学习如何:

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

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

如果没有 Azure 试用版订阅,请在开始前创建 Azure 试用版订阅

先决条件

  • 如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI

    • 如果使用的是本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录

    • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展

    • 运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade

  • 本文需要 Azure CLI 版本 2.0.4 或更高版本。

设置网络

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

创建资源组

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

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

创建 VNet

此虚拟网络有三个子网。

注意

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

az network vnet create \
  --name Test-FW-VN \
  --resource-group Test-FW-RG \
  --location chinaeast \
  --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 chinaeast \
    --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 chinaeast \
    --image win2016datacenter \
    --nics Srv-Work-NIC \
    --admin-username azureadmin

注意

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

发生以下事件之一时,将禁用默认出站访问 IP:

  • 将公共 IP 地址分配给 VM。
  • 虚拟机被放置在标准负载平衡器的后端池中,有无出站规则均可。
  • 向 VM 的子网分配了 Azure NAT 网关资源。

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

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

部署防火墙

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

az network firewall create \
    --name Test-FW01 \
    --resource-group Test-FW-RG \
    --location chinaeast
az network public-ip create \
    --name fw-pip \
    --resource-group Test-FW-RG \
    --location chinaeast \
    --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 chinaeast \
    --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.qq.com 进行出站访问。

az network firewall application-rule create \
   --collection-name App-Coll01 \
   --firewall-name Test-FW01 \
   --name Allow-QQ \
   --protocols Http=80 Https=443 \
   --resource-group Test-FW-RG \
   --target-fqdns www.qq.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.qq.com
    nslookup www.microsoft.com
    

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

  4. 运行以下命令:

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

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

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

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

清理资源

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

az group delete \
  -n Test-FW-RG

后续步骤