Hálózati forgalom korlátozása az Azure Firewall használatával az Azure Kubernetes Service-ben (AKS)

Megtudhatja, hogyan vezérelheti a kimenő forgalmat az AKS-fürtök kimenő hálózati és teljes tartománynév-szabályaival az Azure Firewall használatával az AKS-ben. A konfiguráció egyszerűsítése érdekében az Azure Firewall az Azure Kubernetes Service () Teljes tartománynév (AzureKubernetesServiceFQDN) címkét biztosítja, amely korlátozza az AKS-fürt kimenő forgalmát. Ez a cikk bemutatja, hogyan konfigurálhatja az AKS-fürt forgalmi szabályait az Azure-tűzfalon keresztül.

Feljegyzés

Az FQDN-címke tartalmazza az AKS-fürtök kimenő hálózati és FQDN-szabályaiban felsorolt összes teljes tartománynevet, és automatikusan frissül.

Éles helyzetekben azt javasoljuk, hogy az SNAT-portok kimerülési problémáinak elkerülése érdekében legalább 20 előtérbeli IP-címet használjon az Azure Firewallon.

Az alábbi információk egy példaarchitektúrát nyújtanak az üzembe helyezéshez:

Zárolt topológia

  • A nyilvános bejövő forgalom tűzfalszűrőkön keresztül áramlik
    • Az AKS-ügynökcsomópontok egy dedikált alhálózatban vannak elkülönítve
    • Az Azure Firewall a saját alhálózatán van üzembe helyezve
    • A DNST-szabály lefordítja a tűzfal nyilvános IP-címét a terheléselosztó előtérbeli IP-címére
  • A kimenő kérések az ügynökcsomópontokról indulnak az Azure Firewall belső IP-címére egy felhasználó által megadott útvonal (UDR) használatával
    • Az AKS-ügynökcsomópontoktól érkező kérések egy UDR-t követnek, amelyet az AKS-fürt azon alhálózatán helyeztek el, amelybe az AKS-fürtöt telepítették
    • Az Azure Firewall egy nyilvános IP-címelőtérről lép ki a virtuális hálózatból
    • A nyilvános internethez vagy más Azure-szolgáltatásokhoz való hozzáférés a tűzfal előtérbeli IP-címére és onnan áramlik
    • Az AKS vezérlősíkhoz való hozzáférést api-kiszolgáló által engedélyezett IP-tartományok védhetik, beleértve a tűzfal nyilvános előtérbeli IP-címét is
  • Belső forgalom
    • Belső terheléselosztót használhat a belső forgalomhoz, amelyet elkülöníthet a saját alhálózatán a nyilvános terheléselosztó helyett vagy mellett

Környezeti változók konfigurálása

Az erőforrás-létrehozásokban használandó környezeti változók halmazának meghatározása.

PREFIX="aks-egress"
RG="${PREFIX}-rg"
LOC="eastus"
PLUGIN=azure
AKSNAME="${PREFIX}"
VNET_NAME="${PREFIX}-vnet"
AKSSUBNET_NAME="aks-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_TABLE_NAME="${PREFIX}-fwrt"
FWROUTE_NAME="${PREFIX}-fwrn"
FWROUTE_NAME_INTERNET="${PREFIX}-fwinternet"

Több alhálózattal rendelkező virtuális hálózat létrehozása

Virtuális hálózat kiépítése két külön alhálózattal: egy a fürthöz és egy a tűzfalhoz. Igény szerint létrehozhat egyet a belső szolgáltatásbejárathoz.

Üres hálózati topológia

  1. Hozzon létre egy erőforráscsoportot a az group create paranccsal.

    az group create --name $RG --location $LOC
    
  2. Hozzon létre egy virtuális hálózatot két alhálózattal az AKS-fürt és az Azure Firewall üzemeltetéséhez a parancsok és az network vnet subnet create a az network vnet create parancsok használatával.

    # Dedicated virtual network with AKS subnet
    az network vnet create \
        --resource-group $RG \
        --name $VNET_NAME \
        --location $LOC \
        --address-prefixes 10.42.0.0/16 \
        --subnet-name $AKSSUBNET_NAME \
        --subnet-prefix 10.42.1.0/24
    
    # Dedicated subnet for Azure Firewall (Firewall name can't be changed)
    az network vnet subnet create \
        --resource-group $RG \
        --vnet-name $VNET_NAME \
        --name $FWSUBNET_NAME \
        --address-prefix 10.42.2.0/24
    

Azure Firewall létrehozása és beállítása

Konfigurálnia kell az Azure Firewall bejövő és kimenő szabályait. A tűzfal fő célja, hogy lehetővé tegye a szervezetek számára, hogy részletes bejövő és kimenő forgalmi szabályokat konfiguráljanak az AKS-fürtbe és onnan kifelé.

Fontos

Ha a fürt vagy alkalmazás nagy számú kimenő kapcsolatot hoz létre ugyanahhoz vagy a célhelyek egy kis részhalmazához, előfordulhat, hogy több tűzfalelőtéri IP-címre van szükség, hogy elkerülje a portok előtér-IP-címenkénti maximális számát.

További információ az Azure Firewall több IP-címmel való létrehozásáról: Azure Firewall létrehozása több nyilvános IP-címmel a Bicep használatával.

Tűzfal és UDR

  1. Hozzon létre egy szabványos nyilvános termékváltozatú IP-erőforrást a az network public-ip create paranccsal. Ezt az erőforrást fogja használni az Azure Firewall előtérbeli címeként.

    az network public-ip create -g $RG -n $FWPUBLICIP_NAME -l $LOC --sku "Standard"
    
  2. Regisztrálja az Azure Firewall CLI-bővítményt az Azure Firewall parancs használatával az extension add történő létrehozásához.

    az extension add --name azure-firewall
    
  3. Hozzon létre egy Azure Firewall-t, és engedélyezze a DNS-proxyt a az network firewall create parancs használatával, és állítsa a --enable-dns-proxy következőre true: .

    az network firewall create -g $RG -n $FWNAME -l $LOC --enable-dns-proxy true
    

A nyilvános IP-cím Azure Firewallra való beállítása eltarthat néhány percig. Ha elkészült, a korábban létrehozott IP-cím hozzárendelhető a tűzfal előtéréhez.

Feljegyzés

A teljes tartománynév hálózati szabályokon való használatához engedélyezni kell a DNS-proxyt. Ha engedélyezve van a DNS-proxy, a tűzfal figyeli az 53-at, és továbbítja a DNS-kéréseket a fent megadott DNS-kiszolgálónak. Ez lehetővé teszi, hogy a tűzfal automatikusan lefordítsa a teljes tartománynevet.

  1. Hozzon létre egy Azure Firewall IP-konfigurációt a az network firewall ip-config create paranccsal.

    az network firewall ip-config create -g $RG -f $FWNAME -n $FWIPCONFIG_NAME --public-ip-address $FWPUBLICIP_NAME --vnet-name $VNET_NAME
    
  2. Az előző parancs sikeres végrehajtása után mentse a tűzfal előtér-IP-címét később a konfigurációhoz.

    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)
    

Feljegyzés

Ha biztonságos hozzáférést használ az engedélyezett IP-címtartományokkal rendelkező AKS API-kiszolgálóhoz, hozzá kell adnia a tűzfal nyilvános IP-címét az engedélyezett IP-címtartományhoz.

Útvonal létrehozása ugrással az Azure Firewallra

Az Azure automatikusan irányítja a forgalmat az Azure-alhálózatok, a virtuális hálózatok és a helyszíni hálózatok között. Ha módosítani szeretné az Azure egyik alapértelmezett útválasztását, létrehozhat egy útvonaltáblát.

Fontos

A kimenő UDR-típushoz (userDefinedRouting) a 0.0.0.0/0 útvonalra és az NVA következő ugrási céljára van szükség az útvonaltáblában. Az útvonaltáblának már van alapértelmezett 0.0.0.0/0 értéke az internetre. Ha az Azure nem rendelkezik nyilvános IP-címmel a forráshálózati címfordításhoz (SNAT), az útvonal hozzáadása nem biztosít kimenő internetkapcsolatot. Az AKS ellenőrzi, hogy nem az internetre mutató 0.0.0.0/0-s útvonalat hoz létre, hanem átjáróra, NVA-ra stb. Kimenő UDR-típus használatakor a rendszer nem hoz létre terheléselosztó nyilvános IP-címet a bejövő kérésekhez, hacsak nem konfigurál egy loadbalancer típusú szolgáltatást. Az AKS soha nem hoz létre nyilvános IP-címet a kimenő kérésekhez , ha kimenő típusú UDR-t állít be. További információ: Az Azure Load Balancer kimenő szabályai.

  1. Hozzon létre egy üres útvonaltáblát egy adott alhálózathoz a az network route-table create parancs használatával. Az útvonaltábla a következő ugrást a fent létrehozott Azure Firewallként határozza meg. Mindegyik alhálózattal nulla vagy egy útvonaltábla társítható.

    az network route-table create -g $RG -l $LOC --name $FWROUTE_TABLE_NAME
    
  2. Hozzon létre útvonalakat az alhálózatok útvonaltáblájában a az network route-table route create paranccsal.

    az network route-table route create -g $RG --name $FWROUTE_NAME --route-table-name $FWROUTE_TABLE_NAME --address-prefix 0.0.0.0/0 --next-hop-type VirtualAppliance --next-hop-ip-address $FWPRIVATE_IP
    
    az network route-table route create -g $RG --name $FWROUTE_NAME_INTERNET --route-table-name $FWROUTE_TABLE_NAME --address-prefix $FWPUBLIC_IP/32 --next-hop-type Internet
    

Az Azure alapértelmezett rendszerútvonalainak felülbírálásával vagy további útvonalak alhálózati útvonaltáblához való hozzáadásával kapcsolatos információkért tekintse meg a virtuális hálózat útvonaltáblájának dokumentációját.

Tűzfalszabályok hozzáadása

Feljegyzés

A kube-rendszeren vagy a gatekeeper-system névtéren kívüli alkalmazások esetében, amelyeknek az API-kiszolgálóval kell beszélni, egy további hálózati szabályra van szükség, amely lehetővé teszi a TCP-kommunikációt a 443-es porton az API-kiszolgáló IP-címéhez, valamint az fqdn-tag AzureKubernetesService alkalmazásszabályának hozzáadásához.

Ez a szakasz három hálózati szabályt és egy, a tűzfalon konfigurálható alkalmazásszabályt ismerteti. Előfordulhat, hogy ezeket a szabályokat az üzembe helyezés alapján kell módosítania.

  • Az első hálózati szabály lehetővé teszi a 9000-s port tcp-en keresztüli elérését.
  • A második hálózati szabály lehetővé teszi az 1194- és 123-as port elérését UDP-en keresztül. Ha a 21Vianet által üzemeltetett Microsoft Azure-ban végzi az üzembe helyezést, tekintse meg a 21Vianet által előírt hálózati szabályok által üzemeltetett Azure-t. Mindkét szabály csak az Azure Region CIDR felé irányuló forgalmat engedélyezi ebben a cikkben, amely az USA keleti régiója.
  • A harmadik hálózati szabály megnyitja a 123-es portot az ntp.ubuntu.com FQDN felé az UDP-n keresztül. A teljes tartománynév hálózati szabályként való hozzáadása az Azure Firewall egyik sajátos funkciója, ezért a saját beállításainak használatakor hozzá kell igazítania.
  • A negyedik és ötödik hálózati szabály lehetővé teszi a tárolók lekérését a GitHub Container Registryből (ghcr.io) és a Docker Hubból (docker.io).
  1. Hozza létre a hálózati szabályokat a az network firewall network-rule create paranccsal.

    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 'time' --protocols 'UDP' --source-addresses '*' --destination-fqdns 'ntp.ubuntu.com' --destination-ports 123
    
    az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'ghcr' --protocols 'TCP' --source-addresses '*' --destination-fqdns ghcr.io pkg-containers.githubusercontent.com --destination-ports '443'
    
    az network firewall network-rule create -g $RG -f $FWNAME --collection-name 'aksfwnr' -n 'docker' --protocols 'TCP' --source-addresses '*' --destination-fqdns docker.io registry-1.docker.io production.cloudflare.docker.com --destination-ports '443'
    
  2. Hozza létre az alkalmazásszabályt a az network firewall application-rule create paranccsal.

    az network firewall application-rule create -g $RG -f $FWNAME --collection-name 'aksfwar' -n 'fqdn' --source-addresses '*' --protocols 'http=80' 'https=443' --fqdn-tags "AzureKubernetesService" --action allow --priority 100
    

Az Azure Firewallról további információt az Azure Firewall dokumentációjában talál.

Útvonaltábla társítása az AKS-hez

A fürt tűzfalhoz való társításához a fürt alhálózatához tartozó dedikált alhálózatnak hivatkoznia kell a fent létrehozott útvonaltáblára. az network vnet subnet update A parancs használatával társíthatja az útvonaltáblát az AKS-hez.

az network vnet subnet update -g $RG --vnet-name $VNET_NAME --name $AKSSUBNET_NAME --route-table $FWROUTE_TABLE_NAME

A kimenő szabályokat követő AKS-fürt üzembe helyezése

Most üzembe helyezhet egy AKS-fürtöt a meglévő virtuális hálózaton. A kimenő típust userDefinedRoutingfogja használni, amely biztosítja, hogy a kimenő forgalom a tűzfalon keresztül legyen kényszerítve, és nem lesznek más kimenő útvonalak. A loadBalancer kimenő típus is használható.

aks-deploy

A üzembe helyezendő célalhálózatot a környezeti változó határozza meg. $SUBNETID Állítsa be az alhálózat-azonosító értékét a következő paranccsal:

SUBNETID=$(az network vnet subnet show -g $RG --vnet-name $VNET_NAME --name $AKSSUBNET_NAME --query id -o tsv)

Meg fogja határozni a kimenő típust az alhálózaton már létező UDR használatához. Ez a konfiguráció lehetővé teszi, hogy az AKS kihagyja a terheléselosztó beállítását és IP-kiépítését.

Tipp.

A fürt üzembe helyezéséhez további funkciókat is hozzáadhat, például privát fürtöket.

Hozzáadhatja az API-kiszolgáló által engedélyezett IP-tartományok AKS-funkcióját, hogy az API-kiszolgáló hozzáférése csak a tűzfal nyilvános végpontjára legyen korlátozva. Az engedélyezett IP-tartományok funkció a diagramban választhatóként van jelölve. Ha engedélyezi az engedélyezett IP-címtartomány-funkciót az API-kiszolgáló hozzáférésének korlátozásához, a fejlesztői eszközöknek a tűzfal virtuális hálózatából származó jumpboxot kell használniuk, vagy hozzá kell adnia az összes fejlesztői végpontot az engedélyezett IP-tartományhoz.


Feljegyzés

Az AKS rendszer által hozzárendelt kubelet-identitást hoz létre a csomópont erőforráscsoportjában, ha nem adja meg a saját kubelet felügyelt identitását.

Felhasználó által definiált útválasztás esetén a rendszer által hozzárendelt identitás csak a CNI hálózati beépülő modult támogatja.

Hozzon létre egy AKS-fürtöt egy rendszer által hozzárendelt felügyelt identitással a CNI hálózati beépülő modullal a az aks create parancs használatával.

az aks create -g $RG -n $AKSNAME -l $LOC \
  --node-count 3 \
  --network-plugin azure \
  --outbound-type userDefinedRouting \
  --vnet-subnet-id $SUBNETID \
  --api-server-authorized-ip-ranges $FWPUBLIC_IP

Fejlesztői hozzáférés engedélyezése az API-kiszolgálóhoz

Ha az előző lépésben engedélyezett IP-tartományokat használt a fürthöz, hozzá kell adnia a fejlesztői eszköz IP-címeit a jóváhagyott IP-tartományok AKS-fürtlistájához, hogy onnan hozzáférjen az API-kiszolgálóhoz. A jumpboxot a tűzfal virtuális hálózatának egy külön alhálózatán belül is konfigurálhatja a szükséges eszközökkel.

  1. Az IP-cím lekérése a következő paranccsal:

    CURRENT_IP=$(dig @resolver1.opendns.com ANY myip.opendns.com +short)
    
  2. Adja hozzá az IP-címet a jóváhagyott tartományokhoz a az aks update paranccsal.

    az aks update -g $RG -n $AKSNAME --api-server-authorized-ip-ranges $CURRENT_IP/32
    
  3. Konfigurálja kubectl az AKS-fürthöz való csatlakozást a az aks get-credentials paranccsal.

    az aks get-credentials -g $RG -n $AKSNAME
    

Közszolgáltatás üzembe helyezése az AKS-ben

Mostantól megkezdheti a szolgáltatások felfedését és az alkalmazások üzembe helyezését ebben a fürtben. Ebben a példában közzé fogunk tenni egy közszolgáltatást, de érdemes lehet egy belső szolgáltatást egy belső terheléselosztóval is elérhetővé tenni.

Közszolgálati DNAT

  1. Tekintse át az AKS Áruház bemutatójának rövid útmutatóját , amely az összes létrehozandó erőforrás megtekintéséhez szükséges.

  2. Telepítse a szolgáltatást a kubectl apply paranccsal.

    kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/aks-store-demo/main/aks-store-quickstart.yaml
    

Bejövő forgalom engedélyezése az Azure Firewallon keresztül

Fontos

Ha az Azure Firewall használatával korlátozza a kimenő forgalmat, és létrehoz egy UDR-t az összes kimenő forgalom kényszerítéséhez, győződjön meg arról, hogy megfelelő DNST-szabályt hoz létre az Azure Firewallban a bejövő forgalom megfelelő engedélyezéséhez. Az Azure Firewall UDR-vel való használata megszakítja a bejövő forgalom beállítását az aszimmetrikus útválasztás miatt. A probléma akkor fordul elő, ha az AKS-alhálózat alapértelmezett útvonala a tűzfal privát IP-címére kerül, de nyilvános terheléselosztót használ – bejövő vagy Kubernetes típusú szolgáltatást loadBalancer. Ebben az esetben a bejövő terheléselosztó-forgalom a nyilvános IP-címén keresztül érkezik, de a visszatérési útvonal a tűzfal magánhálózati IP-címén halad át. Mivel a tűzfal állapotalapú, a visszaadott csomagot elveti, mert a tűzfal nem tud egy már létrehozott munkamenetről. Ha tudni szeretné, hogyan integrálhatja az Azure Firewallt a bejövő vagy szolgáltatás terheléselosztójával, olvassa el az Azure Firewall integrálása az Azure Standard Load Balancerrel című témakört.

A bejövő kapcsolatok konfigurálásához meg kell írnia egy DNST-szabályt az Azure Firewallba. A fürthöz való kapcsolódás teszteléséhez a tűzfal előtérbeli nyilvános IP-címére egy szabály van meghatározva, amely a belső szolgáltatás által közzétett belső IP-címre irányít. A célcím testre szabható. A lefordított címnek a belső terheléselosztó IP-címének kell lennie. A lefordított portnak a Kubernetes-szolgáltatás közzétett portjának kell lennie. Meg kell adnia a Kubernetes szolgáltatás által létrehozott terheléselosztóhoz rendelt belső IP-címet is.

  1. Kérje le a terheléselosztóhoz rendelt belső IP-címet a kubectl get services paranccsal.

    kubectl get services
    

    Az IP-cím megjelenik az EXTERNAL-IP oszlopban, ahogy az a következő példakimenetben is látható:

    NAME              TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)              AGE
    kubernetes        ClusterIP      10.0.0.1       <none>        443/TCP              9m10s
    order-service     ClusterIP      10.0.104.144   <none>        3000/TCP             11s
    product-service   ClusterIP      10.0.237.60    <none>        3002/TCP             10s
    rabbitmq          ClusterIP      10.0.161.128   <none>        5672/TCP,15672/TCP   11s
    store-front       LoadBalancer   10.0.89.139    20.39.18.6    80:32271/TCP         10s
    
  2. Kérje le a szolgáltatás IP-címét a kubectl get svc voting-app parancs használatával.

    SERVICE_IP=$(kubectl get svc store-front -o jsonpath='{.status.loadBalancer.ingress[*].ip}')
    
  3. Adja hozzá a NAT-szabályt a az network firewall nat-rule create paranccsal.

    az network firewall nat-rule create --collection-name exampleset --destination-addresses $FWPUBLIC_IP --destination-ports 80 --firewall-name $FWNAME --name inboundrule --protocols Any --resource-group $RG --source-addresses '*' --translated-port 80 --action Dnat --priority 100 --translated-address $SERVICE_IP
    

A kapcsolat ellenőrzése

Lépjen az Azure Firewall előtérbeli IP-címére egy böngészőben a kapcsolat ellenőrzéséhez.

Meg kell jelennie az AKS áruházbeli alkalmazásnak. Ebben a példában a tűzfal nyilvános IP-címe volt 52.253.228.132.

Képernyőkép a helyi böngészőben megnyitott Azure Store Front Appról.

Ezen az oldalon megtekintheti a termékeket, hozzáadhatja őket a kosárhoz, majd megrendelheti őket.

Az erőforrások eltávolítása

Az Azure-erőforrások törléséhez törölje az AKS-erőforráscsoportot a az group delete paranccsal.

az group delete -g $RG

Következő lépések

Ebben a cikkben megtanulta, hogyan védheti meg a kimenő forgalmat az Azure Firewall használatával. Szükség esetén általánosíthatja a fenti lépéseket, hogy a forgalmat a kimenő típus userDefinedRoute dokumentációját követve továbbítsa az előnyben részesített kimenő megoldásnak.