Begränsa nätverkstrafik med Azure Firewall i Azure Kubernetes Service (AKS)

Lär dig hur du använder reglerna för utgående nätverk och FQDN för AKS-kluster för att styra utgående trafik med hjälp av Azure Firewall i AKS. För att förenkla den här konfigurationen tillhandahåller Azure Firewall en Azure Kubernetes Service-tagg (AzureKubernetesService) fullständigt kvalificerade domännamn (FQDN) som begränsar utgående trafik från AKS-klustret. Den här artikeln visar hur du kan konfigurera dina TRAFIKregler för AKS-kluster via Azure-brandväggen.

Kommentar

FQDN-taggen innehåller alla FQDN som anges i Regler för utgående nätverk och FQDN för AKS-kluster och uppdateras automatiskt.

För produktionsscenarier rekommenderar vi att du har minst 20 ip-adresser på klientdelen i Azure Firewall för att undvika problem med SNAT-portöverbelastning.

Följande information innehåller ett exempel på distributionens arkitektur:

Låst topologi

  • Offentlig ingress tvingas flöda genom brandväggsfilter
    • AKS-agentnoder isoleras i ett dedikerat undernät
    • Azure Firewall distribueras i ett eget undernät
    • En DNAT-regel översätter brandväggens offentliga IP-adress till lastbalanserarens klientdels-IP
  • Utgående begäranden börjar från agentnoder till den interna IP-adressen för Azure Firewall med hjälp av en användardefinierad väg (UDR)
    • Begäranden från AKS-agentnoder följer en UDR som har placerats i undernätet som AKS-klustret distribuerades till
    • Azure Firewall tar sig ut ur det virtuella nätverket från en offentlig IP-klientdel
    • Åtkomst till det offentliga Internet eller andra Azure-tjänster flödar till och från brandväggens IP-adress för klientdelen
    • Åtkomst till AKS-kontrollplanet kan skyddas av API-serverauktoriserade IP-intervall, inklusive brandväggens offentliga IP-adress för klientdelen
  • Intern trafik

Konfigurera miljövariabler

Definiera en uppsättning miljövariabler som ska användas i resursskapanden.

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"

Skapa ett virtuellt nätverk med flera undernät

Etablera ett virtuellt nätverk med två separata undernät: ett för klustret och ett för brandväggen. Du kan också skapa en för intern ingress för tjänsten.

Tom nätverkstopologi

  1. Skapa en resursgrupp med kommandot az group create .

    az group create --name $RG --location $LOC
    
  2. Skapa ett virtuellt nätverk med två undernät som värd för AKS-klustret och Azure Firewall med hjälp av az network vnet create kommandona och az network vnet subnet create .

    # 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
    

Skapa och konfigurera en Azure Firewall

Du måste konfigurera regler för inkommande och utgående trafik i Azure Firewall. Huvudsyftet med brandväggen är att göra det möjligt för organisationer att konfigurera detaljerade regler för inkommande och utgående trafik till och från AKS-klustret.

Viktigt!

Om klustret eller programmet skapar ett stort antal utgående anslutningar som dirigeras till samma eller en liten delmängd av mål, kan du behöva fler IP-adresser för brandväggsklientdelen för att undvika att maxa portarna per klientdels-IP.

Mer information om hur du skapar en Azure-brandvägg med flera IP-adresser finns i Skapa en Azure-brandvägg med flera offentliga IP-adresser med Bicep.

Brandvägg och UDR

  1. Skapa en offentlig IP-standard-IP-resurs för SKU med kommandot az network public-ip create . Den här resursen används som Azure Firewall-klientdelsadress.

    az network public-ip create -g $RG -n $FWPUBLICIP_NAME -l $LOC --sku "Standard"
    
  2. Registrera AZURE Firewall CLI-tillägget för att skapa en Azure Firewall med kommandot az extension add .

    az extension add --name azure-firewall
    
  3. Skapa en Azure Firewall och aktivera DNS-proxy med kommandot az network firewall create och ange --enable-dns-proxy till true.

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

Det kan ta några minuter att konfigurera den offentliga IP-adressen till Azure Firewall. När den är klar kan ip-adressen som skapades tidigare tilldelas brandväggens klientdel.

Kommentar

För att kunna använda FQDN på nätverksregler behöver vi DNS-proxy aktiverat. När DNS-proxyn är aktiverad lyssnar brandväggen på port 53 och vidarebefordrar DNS-begäranden till DEN DNS-server som anges ovan. Detta gör att brandväggen kan översätta FQDN automatiskt.

  1. Skapa en IP-konfiguration för az network firewall ip-config create Azure Firewall med kommandot .

    az network firewall ip-config create -g $RG -f $FWNAME -n $FWIPCONFIG_NAME --public-ip-address $FWPUBLICIP_NAME --vnet-name $VNET_NAME
    
  2. När föregående kommando har slutförts sparar du IP-adressen för brandväggens klientdel för konfiguration senare.

    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)
    

Kommentar

Om du använder säker åtkomst till AKS API-servern med auktoriserade IP-adressintervall måste du lägga till brandväggens offentliga IP-adress i det auktoriserade IP-intervallet.

Skapa en väg med ett hopp till Azure Firewall

Azure dirigerar automatiskt trafik mellan Azure-undernät, virtuella nätverk och lokala nätverk. Om du vill ändra någon av Azures standardroutning kan du skapa en routningstabell.

Viktigt!

Utgående typ av UDR (userDefinedRouting) kräver en väg för 0.0.0.0/0 och ett nästa hoppmål för NVA i routningstabellen. Routningstabellen har redan standardvärdet 0.0.0.0/0 till Internet. Utan en offentlig IP-adress som Azure kan använda för SNAT (Source Network Address Translation) ger det dig inte utgående Internetanslutning genom att lägga till den här vägen. AKS verifierar att du inte skapar en 0.0.0.0/0-väg som pekar på Internet utan i stället till en gateway, NVA osv. När du använder en utgående typ av UDR skapas inte en offentlig IP-adress för lastbalanserare för inkommande begäranden om du inte konfigurerar en tjänst av typen loadbalancer. AKS skapar aldrig en offentlig IP-adress för utgående begäranden om du anger en utgående typ av UDR. Mer information finns i Utgående regler för Azure Load Balancer.

  1. Skapa en tom routningstabell som ska associeras med ett visst undernät med kommandot az network route-table create . Routningstabellen definierar nästa hopp som Azure Firewall som skapades ovan. Varje undernät kan ha noll eller en associerad routningstabell.

    az network route-table create -g $RG -l $LOC --name $FWROUTE_TABLE_NAME
    
  2. Skapa vägar i routningstabellen för undernäten az network route-table route create med kommandot .

    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
    

Information om hur du åsidosätter Azures standardsystemvägar eller lägger till ytterligare vägar i ett undernäts routningstabell finns i dokumentationen för routningstabellen för virtuella nätverk.

Lägga till brandväggsregler

Kommentar

För program utanför kube-system- eller gatekeeper-system-namnrymderna som behöver prata med API-servern krävs ytterligare en nätverksregel för att tillåta TCP-kommunikation till port 443 för API-server-IP förutom att lägga till programregel för fqdn-tagg AzureKubernetesService .

Det här avsnittet beskriver tre nätverksregler och en programregel som du kan använda för att konfigurera i brandväggen. Du kan behöva anpassa dessa regler baserat på din distribution.

  • Den första nätverksregeln tillåter åtkomst till port 9000 via TCP.
  • Den andra nätverksregeln tillåter åtkomst till port 1194 och 123 via UDP. Om du distribuerar till Microsoft Azure som drivs av 21Vianet läser du de Azure-nätverksregler som drivs av 21Vianet. Båda dessa regler tillåter endast trafik till Azure Region CIDR i den här artikeln, som är USA, östra.
  • Den tredje nätverksregeln öppnar port 123 till ntp.ubuntu.com FQDN via UDP. Att lägga till ett FQDN som en nätverksregel är en av de specifika funktionerna i Azure Firewall, så du måste anpassa det när du använder dina egna alternativ.
  • De fjärde och femte nätverksreglerna tillåter åtkomst till att hämta containrar från GitHub Container Registry (ghcr.io) och Docker Hub (docker.io).
  1. Skapa nätverksregler med kommandot az network firewall network-rule create .

    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. Skapa programregeln med kommandot az network firewall application-rule create .

    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
    

Mer information om Azure Firewall finns i dokumentationen om Azure Firewall.

Associera routningstabellen med AKS

Om du vill associera klustret med brandväggen måste det dedikerade undernätet för klustrets undernät referera till routningstabellen som skapades ovan. az network vnet subnet update Använd kommandot för att associera routningstabellen med AKS.

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

Distribuera ett AKS-kluster som följer dina utgående regler

Nu kan du distribuera ett AKS-kluster till det befintliga virtuella nätverket. Du använder den userDefinedRouting utgående typen, vilket säkerställer att all utgående trafik tvingas genom brandväggen och att inga andra utgående sökvägar finns. Utgående loadBalancer typ kan också användas.

aks-deploy

Målundernätet som ska distribueras till definieras med miljövariabeln . $SUBNETID Ange värdet för undernäts-ID:t med hjälp av följande kommando:

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

Du definierar den utgående typen för att använda den UDR som redan finns i undernätet. Den här konfigurationen gör det möjligt för AKS att hoppa över konfigurationen och IP-etableringen för lastbalanseraren.

Dricks

Du kan lägga till ytterligare funktioner i klusterdistributionen, till exempel privata kluster.

Du kan lägga till AKS-funktionen för API-serverauktoriserade IP-intervall för att begränsa API-serveråtkomsten till endast brandväggens offentliga slutpunkt. Funktionen för auktoriserade IP-intervall anges i diagrammet som valfri. När du aktiverar den auktoriserade IP-intervallfunktionen för att begränsa API-serveråtkomsten måste utvecklarverktygen använda en jumpbox från brandväggens virtuella nätverk, eller så måste du lägga till alla utvecklarslutpunkter i det auktoriserade IP-intervallet.


Kommentar

AKS skapar en systemtilldelad kubelet-identitet i nodresursgruppen om du inte anger din egen kubelet-hanterade identitet.

För användardefinierad routning stöder systemtilldelad identitet endast CNI-nätverkets plugin-program.

Skapa ett AKS-kluster med hjälp av en systemtilldelad hanterad identitet med plugin-programmet för CNI-nätverket med kommandot az aks create .

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

Aktivera utvecklaråtkomst till API-servern

Om du använde auktoriserade IP-intervall för klustret i föregående steg måste du lägga till dina IP-adresser för utvecklarverktyg i AKS-klusterlistan över godkända IP-intervall så att du kommer åt API-servern därifrån. Du kan också konfigurera en jumpbox med de verktyg som behövs i ett separat undernät i brandväggens virtuella nätverk.

  1. Hämta DIN IP-adress med hjälp av följande kommando:

    CURRENT_IP=$(dig @resolver1.opendns.com ANY myip.opendns.com +short)
    
  2. Lägg till IP-adressen till de godkända intervallen az aks update med kommandot .

    az aks update -g $RG -n $AKSNAME --api-server-authorized-ip-ranges $CURRENT_IP/32
    
  3. Konfigurera kubectl för att ansluta till ditt AKS-kluster med hjälp av az aks get-credentials kommandot .

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

Distribuera en offentlig tjänst på AKS

Nu kan du börja exponera tjänster och distribuera program till det här klustret. I det här exemplet exponerar vi en offentlig tjänst, men du kanske också vill exponera en intern tjänst med hjälp av en intern lastbalanserare.

Public Service DNAT

  1. Granska snabbstartsmanifestet för AKS Store Demo för att se alla resurser som kommer att skapas.

  2. Distribuera tjänsten med hjälp av kubectl apply kommandot .

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

Tillåt inkommande trafik via Azure Firewall

Viktigt!

När du använder Azure Firewall för att begränsa utgående trafik och skapa en UDR för att tvinga all utgående trafik måste du skapa en lämplig DNAT-regel i Azure Firewall för att tillåta inkommande trafik korrekt. Användning av Azure Firewall med en UDR bryter ingresskonfigurationen på grund av asymmetrisk routning. Problemet uppstår om AKS-undernätet har en standardväg som går till brandväggens privata IP-adress, men du använder en offentlig lastbalanserare – ingress eller Kubernetes-tjänst av typen loadBalancer. I det här fallet tas den inkommande lastbalanserarens trafik emot via dess offentliga IP-adress, men retursökvägen går igenom brandväggens privata IP-adress. Eftersom brandväggen är tillståndskänslig släpper den det returnerade paketet eftersom brandväggen inte är medveten om en etablerad session. Information om hur du integrerar Azure Firewall med din ingress- eller tjänstlastbalanserare finns i Integrera Azure Firewall med Azure Standard Load Balancer.

För att konfigurera inkommande anslutning måste du skriva en DNAT-regel till Azure Firewall. För att testa anslutningen till klustret definieras en regel för brandväggens offentliga IP-adress på klientdelen för att dirigera till den interna IP-adress som exponeras av den interna tjänsten. Måladressen kan anpassas. Den översatta adressen måste vara IP-adressen för den interna lastbalanseraren. Den översatta porten måste vara den exponerade porten för Kubernetes-tjänsten. Du måste också ange den interna IP-adress som tilldelats lastbalanseraren som skapats av Kubernetes-tjänsten.

  1. Hämta den interna IP-adressen som tilldelats lastbalanseraren med hjälp av kubectl get services kommandot .

    kubectl get services
    

    IP-adressen visas i EXTERNAL-IP kolumnen enligt följande exempelutdata:

    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. Hämta tjänstens IP-adress med kommandot kubectl get svc voting-app .

    SERVICE_IP=$(kubectl get svc store-front -o jsonpath='{.status.loadBalancer.ingress[*].ip}')
    
  3. Lägg till NAT-regeln med kommandot az network firewall nat-rule create .

    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
    

Validera anslutningen

Gå till IP-adressen för Azure Firewall-klientdelen i en webbläsare för att verifiera anslutningen.

Du bör se AKS Store-appen. I det här exemplet var 52.253.228.132brandväggens offentliga IP-adress .

Skärmbild som visar Azure Store Front App som öppnats i en lokal webbläsare.

På den här sidan kan du visa produkter, lägga till dem i kundvagnen och sedan göra en beställning.

Rensa resurser

Om du vill rensa Azure-resurser tar du bort AKS-resursgruppen med kommandot az group delete .

az group delete -g $RG

Nästa steg

I den här artikeln har du lärt dig hur du skyddar utgående trafik med hjälp av Azure Firewall. Om det behövs kan du generalisera stegen ovan för att vidarebefordra trafiken till önskad utgående lösning enligt dokumentationen för utgående typuserDefinedRoute.