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

重要

AKS 上的 Azure HDInsight 已于 2025 年 1 月 31 日停用。 了解此公告的详细信息

需要将工作负荷迁移到 Microsoft Fabric 或等效的 Azure 产品,以避免工作负荷突然终止。

重要

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

当企业想要将自己的虚拟网络用于群集部署时,保护虚拟网络的流量变得非常重要。 本文提供了使用 Azure CLI 通过 Azure 防火墙保护 AKS 群集上的 HDInsight 出站流量的步骤。

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

显示网络流的 关系图。

本文中演示的示例是使用 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. AKS 群集池上具有 HDInsight 子网的虚拟网络

       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 门户在 AKS 群集池上创建 HDInsight

  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"
    

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

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

创建群集

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

以下步骤提供有关每个群集类型所需的特定网络和应用程序规则的详细信息。 可以参考群集创建页面来根据需要创建 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 来限制流量 以允许流量。

提示

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

如何调试

如果发现群集意外工作,可以检查防火墙日志以查找阻止了哪些流量。