分享方式:


使用 Azure CLI 使用防火牆來限制輸出流量

重要

此功能目前為預覽功能。 Microsoft Azure 預覽版增補使用規定包含適用於 Azure 功能 (搶鮮版 (Beta)、預覽版,或尚未正式發行的版本) 的更多法律條款。 若需此特定預覽版的相關資訊,請參閱 Azure HDInsight on AKS 預覽版資訊。 如有問題或功能建議,請在 AskHDInsight 上提交要求並附上詳細資料,並且在 Azure HDInsight 社群上追蹤我們以獲得更多更新資訊。

當企業想要使用自己的虛擬網路進行叢集部署時,保護虛擬網路的流量變得至關重要。 本文會逐步說明如何使用 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 群組建立命令來建立資源群組。

    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 Firewall 預覽 CLI 延伸模組以建立 Azure 防火牆。

       az extension add --name azure-firewall
    
  3. 建立 Azure 防火牆並啟用 DNS Proxy。

       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 至網際網路,然後您便可以直接連線到叢集。

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 來限制流量 以允許流量。

提示

如果您想要允許更多流量,您可以透過防火牆進行設定。

如何偵錯

如果您發現叢集無法如預期運作,您可以檢查防火牆記錄,以找出哪些流量遭到封鎖。