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

通过 Azure CLI 使用防火墙限制出站流量

重要

此功能目前以预览版提供。 Microsoft Azure 预览版的补充使用条款包含适用于 beta 版、预览版或其他尚未正式发布的 Azure 功能的更多法律条款。 有关此特定预览版的信息,请参阅 Azure HDInsight on AKS 预览版信息。 如有疑问或功能建议,请在 AskHDInsight 上提交请求并附上详细信息,并在 Azure HDInsight Community 上关注我们以了解更多更新。

当企业想要使用自己的虚拟网络进行群集部署时,保护虚拟网络的流量就变得非常重要。 本文介绍如何使用 Azure CLI 通过 Azure 防火墙保护来自 HDInsight on AKS 群集的出站流量。

下图演示了本文中用于模拟企业方案的示例:

显示网络流的示意图。

本文中演示的示例使用的是 Azure Could Shell

定义变量

复制并在 Azure Cloud Shell 中执行以设置这些变量的值。

PREFIX="hdiaks-egress"
RG="${PREFIX}-rg"
LOC="eastus"
HDIAKS_CLUSTER_POOL=${PREFIX}
VNET_NAME="${PREFIX}-vnet"
HDIAKS_SUBNET_NAME="${PREFIX}-subnet"
# DO NOT CHANGE FWSUBNET_NAME - This is currently a requirement for Azure Firewall.
FWSUBNET_NAME="AzureFirewallSubnet"
FWNAME="${PREFIX}-fw"
FWPUBLICIP_NAME="${PREFIX}-fwpublicip"
FWIPCONFIG_NAME="${PREFIX}-fwconfig"
FWROUTE_NAME="${PREFIX}-fwrn"
FWROUTE_NAME_INTERNET="${PREFIX}-fwinternet"

显示 Cloud Shell 变量的关系图。

创建虚拟网络和子网

  1. 使用 az group create 命令创建资源组。

    az group create --name $RG --location $LOC
    
  2. 创建一个虚拟网络和两个子网。

    1. 适用于 HDInsight on AKS 群集池的具有子网的虚拟网络

       az network vnet create \
            --resource-group $RG \
            --name $VNET_NAME \
            --location $LOC \
            --address-prefixes 10.0.0.0/8 \
            --subnet-name $HDIAKS_SUBNET_NAME \
            --subnet-prefix 10.1.0.0/16
      
    2. Azure 防火墙的子网。

      az network vnet subnet create \
         --resource-group $RG \
         --vnet-name $VNET_NAME \
         --name $FWSUBNET_NAME \
         --address-prefix 10.2.0.0/16
      

      重要

      1. 如果在子网 HDIAKS_SUBNET_NAME 中添加 NSG ,则需要手动添加某些出站和入站规则。 按照使用 NSG 限制流量操作。
      2. 默认情况下,路由表不会与子网相关联。 如果需要,用户必须创建路由表并将其与群集池相关联。

使用 Azure 门户创建 HDInsight on AKS 群集池

  1. 创建群集池。

    显示群集池基本选项卡的关系图。

    显示安全选项卡的关系图。

  2. 创建路由表。

    创建路由表并将其与群集池相关联。 有关详细信息,请参阅创建路由表

获取在群集池后面创建的 AKS 群集详细信息

按照以下步骤获取 AKS 群集信息,这在后续步骤中很有用。

AKS_MANAGED_RG=$(az network vnet subnet show --name $HDIAKS_SUBNET_NAME --vnet-name $VNET_NAME --resource-group $RG --query routeTable.resourceGroup -o tsv)

AKS_ID=$(az group show --name $AKS_MANAGED_RG --query managedBy -o tsv)

HDIAKS_MANAGED_RG=$(az resource show --ids $AKS_ID --query "resourceGroup" -o tsv)

API_SERVER=$(az aks show --name $HDIAKS_CLUSTER_POOL --resource-group $HDIAKS_MANAGED_RG --query fqdn -o tsv)

创建防火墙

  1. 创建标准 SKU 公共 IP 资源。 此资源用作 Azure 防火墙前端地址。

    az network public-ip create -g $RG -n $FWPUBLICIP_NAME -l $LOC --sku "Standard"
    
  2. 注册 Azure 防火墙预览 CLI 扩展以创建 Azure 防火墙。

       az extension add --name azure-firewall
    
  3. 创建 Azure 防火墙并启用 DNS 代理。

       az network firewall create -g $RG -n $FWNAME -l $LOC --enable-dns-proxy true
    
  4. 创建 Azure 防火墙 IP 配置。

    az network firewall ip-config create -g $RG -f $FWNAME -n $FWIPCONFIG_NAME --public-ip-address $FWPUBLICIP_NAME --vnet-name $VNET_NAME
    
  5. IP 配置命令成功后,请保存防火墙前端 IP 地址以便稍后进行配置。

    FWPUBLIC_IP=$(az network public-ip show -g $RG -n $FWPUBLICIP_NAME --query "ipAddress" -o tsv)
    FWPRIVATE_IP=$(az network firewall show -g $RG -n $FWNAME --query "ipConfigurations[0].privateIPAddress" -o tsv)
    

将网络和应用程序规则添加到防火墙

  1. 创建网络规则。

    az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'apiudp' --protocols 'UDP' --source-addresses '*' --destination-addresses "AzureCloud.$LOC" --destination-ports 1194 --action allow --priority 100
    
    az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'apitcp' --protocols 'TCP' --source-addresses '*' --destination-addresses "AzureCloud.$LOC" --destination-ports 9000
    
    az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'apiserver' --protocols 'TCP' --source-addresses '*' --destination-fqdns "$API_SERVER" --destination-ports 443
    
    #Add below step, in case you are integrating log analytics workspace
    
    az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'azuremonitor' --protocols 'TCP' --source-addresses '*' --destination-addresses "AzureMonitor" --destination-ports 443
    
  2. 创建应用程序规则。

    az network firewall application-rule create -g $RG -f $FWNAME --collection-name 'aksfwar' -n 'aks-fqdn' --source-addresses '*' --protocols 'http=80' 'https=443' --fqdn-tags "AzureKubernetesService" --action allow --priority 100 
    
    az network firewall application-rule create -g $RG -f $FWNAME --collection-name 'aksfwar' -n 'acr' --source-addresses '*' --protocols 'https=443' --target-fqdns "hiloprodrpacr00.azurecr.io"
    
    az network firewall application-rule create -g $RG -f $FWNAME --collection-name 'aksfwar' -n 'blob' --source-addresses '*' --protocols 'https=443' --target-fqdns "*.blob.core.windows.net"
    
    az network firewall application-rule create -g $RG -f $FWNAME --collection-name 'aksfwar' -n 'servicebus' --source-addresses '*' --protocols 'https=443' --target-fqdns "*.servicebus.windows.net"
    
    az network firewall application-rule create -g $RG -f $FWNAME --collection-name 'aksfwar' -n 'gsm' --source-addresses '*' --protocols 'https=443' --target-fqdns "*.table.core.windows.net"
    
    az network firewall application-rule create -g $RG -f $FWNAME --collection-name 'aksfwar' -n 'gcsmonitoring' --source-addresses '*' --protocols 'https=443' --target-fqdns "gcs.prod.monitoring.core.windows.net"
    
    az network firewall application-rule create -g $RG -f $FWNAME --collection-name 'aksfwar' -n 'graph' --source-addresses '*' --protocols 'https=443' --target-fqdns "graph.microsoft.com"
    

在路由表中创建路由,以将流量重定向到防火墙

创建要关联到 HDInsight on AKS 群集池的路由表。 有关详细信息,请参阅创建路由表命令

创建群集

在前面的步骤中,我们将网络流量路由到了防火墙。

以下步骤提供有关每种群集类型所需的特定网络和应用程序规则的详细信息。 可以参考群集创建页来根据需要创建 Apache FlinkTrinoApache Spark 群集。

重要

在创建群集之前,请确保运行以下群集特定的规则来允许流量。

Trino

  1. 为 Trino 群集添加以下网络和应用程序规则。

     az network firewall application-rule create -g $RG -f $FWNAME --collection-name 'aksfwar' -n 'dfs' --source-addresses '*' --protocols 'https=443' --target-fqdns "*.dfs.core.windows.net"
    
     az network firewall application-rule create -g $RG -f $FWNAME --collection-name 'aksfwar' -n 'mysql' --source-addresses '*' --protocols 'mssql=1433' --target-fqdns "*.database.windows.net"  
    

    根据要求将以下语法中的 Sql.<Region> 更改为你所在的区域。 例如:Sql.EastUS

     az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'mysql' --protocols 'TCP' --source-addresses '*' --destination-addresses Sql.<Region> --destination-ports "11000-11999"
    
  1. 为 Apache Flink 群集添加以下应用程序规则。

    az network firewall application-rule create -g $RG -f $FWNAME --collection-name 'aksfwar' -n 'dfs' --source-addresses '*' --protocols 'https=443' --target-fqdns "*.dfs.core.windows.net"
    

Apache Spark

  1. 为 Spark 群集添加以下网络和应用程序规则。

    根据要求将以下语法中的 Storage.<Region> 更改为你所在的区域。 例如:Storage.EastUS

     az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'smb' --protocols 'TCP' --source-addresses '*' --destination-addresses "Storage.<Region>" --destination-ports 445
    
     az network firewall application-rule create -g $RG -f $FWNAME --collection-name 'aksfwar' -n 'dfs' --source-addresses '*' --protocols 'https=443' --target-fqdns "*.dfs.core.windows.net"
    

    根据要求将以下语法中的 Sql.<Region> 更改为你所在的区域。 例如:Sql.EastUS

     az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'mysql' --protocols 'TCP' --source-addresses '*' --destination-addresses "Sql.<Region>" --destination-ports '11000-11999'
    
     az network firewall application-rule create -g $RG -f $FWNAME --collection-name 'aksfwar' -n 'mysql' --source-addresses '*' --protocols 'mssql=1433' --target-fqdns "*.database.windows.net"
    

解决对称路由问题

以下步骤允许你通过群集负载均衡器流入量服务请求群集,并确保网络响应流量不会流向防火墙。 在路由表中添加一个路由,以将响应流量分别重定向到客户端 IP 和 Internet,然后你便可以直接访问群集。

az network route-table route create -g $AKS_MANAGED_RG --name clientip --route-table-name $ROUTE_TABLE_NAME --address-prefix {Client_IPs} --next-hop-type Internet

如果在配置 NSG 后无法访问群集,请按照使用 NSG 限制流量的说明来允许流量。

提示

如果你想要允许更多流量,可以通过防火墙进行配置。

如何调试

如果你发现群集工作异常,可以检查防火墙日志以确定哪些流量被阻止。