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.
Anteckning
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:
- 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
- Du kan använda en intern lastbalanserare för intern trafik, som du kan isolera på ett eget undernät, i stället för eller tillsammans med en offentlig lastbalanserare
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"
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.
Skapa en resursgrupp med kommandot
az group create
.az group create --name $RG --location $LOC
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 ochaz 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
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.
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 --resource-group $RG -n $FWPUBLICIP_NAME --location $LOC --sku "Standard"
Registrera AZURE Firewall CLI-tillägget för att skapa en Azure Firewall med kommandot
az extension add
.az extension add --name azure-firewall
Skapa en Azure Firewall och aktivera DNS-proxy med kommandot
az network firewall create
och ange--enable-dns-proxy
tilltrue
.az network firewall create --resource-group $RG --name $FWNAME --location $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.
Anteckning
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.
Skapa en IP-konfiguration för
az network firewall ip-config create
Azure Firewall med kommandot .az network firewall ip-config create --resource-group $RG --firewall-name $FWNAME --name $FWIPCONFIG_NAME --public-ip-address $FWPUBLICIP_NAME --vnet-name $VNET_NAME
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 --resource-group $RG --name $FWPUBLICIP_NAME --query "ipAddress" -o tsv) FWPRIVATE_IP=$(az network firewall show --resource-group $RG --name $FWNAME --query "ipConfigurations[0].privateIPAddress" -o tsv)
Anteckning
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.
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.
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 --resource-group $RG --location $LOC --name $FWROUTE_TABLE_NAME
Skapa vägar i routningstabellen för undernäten
az network route-table route create
med kommandot .az network route-table route create --resource-group $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 --resource-group $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.
Anteckning
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).
Skapa nätverksregler med kommandot
az network firewall network-rule create
.az network firewall network-rule create --resource-group $RG --firewall-name $FWNAME --collection-name 'aksfwnr' --name 'apiudp' --protocols 'UDP' --source-addresses '*' --destination-addresses "AzureCloud.$LOC" --destination-ports 1194 --action allow --priority 100 az network firewall network-rule create --resource-group $RG --firewall-name $FWNAME --collection-name 'aksfwnr' --name 'apitcp' --protocols 'TCP' --source-addresses '*' --destination-addresses "AzureCloud.$LOC" --destination-ports 9000 az network firewall network-rule create --resource-group $RG --firewall-name $FWNAME --collection-name 'aksfwnr' --name 'time' --protocols 'UDP' --source-addresses '*' --destination-fqdns 'ntp.ubuntu.com' --destination-ports 123 az network firewall network-rule create --resource-group $RG --firewall-name $FWNAME --collection-name 'aksfwnr' --name 'ghcr' --protocols 'TCP' --source-addresses '*' --destination-fqdns ghcr.io pkg-containers.githubusercontent.com --destination-ports '443' az network firewall network-rule create --resource-group $RG --firewall-name $FWNAME --collection-name 'aksfwnr' --name 'docker' --protocols 'TCP' --source-addresses '*' --destination-fqdns docker.io registry-1.docker.io production.cloudflare.docker.com --destination-ports '443'
Skapa programregeln med kommandot
az network firewall application-rule create
.az network firewall application-rule create --resource-group $RG --firewall-name $FWNAME --collection-name 'aksfwar' --name '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.
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 --resource-group $RG --vnet-name $VNET_NAME --name $AKSSUBNET_NAME --route-table $FWROUTE_TABLE_NAME
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.
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 --resource-group $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.
Tips
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.
- Skapa ett AKS-kluster med systemtilldelade identiteter
- Skapa ett AKS-kluster med användartilldelade identiteter
Anteckning
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 --resource-group $RG --name $AKSNAME --location $LOC \
--node-count 3 \
--network-plugin azure \
--outbound-type userDefinedRouting \
--vnet-subnet-id $SUBNETID \
--api-server-authorized-ip-ranges $FWPUBLIC_IP \
--generate-ssh-keys
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.
Hämta DIN IP-adress med hjälp av följande kommando:
CURRENT_IP=$(dig @resolver1.opendns.com ANY myip.opendns.com +short)
Lägg till IP-adressen till de godkända intervallen
az aks update
med kommandot .az aks update --resource-group $RG --name $AKSNAME --api-server-authorized-ip-ranges $CURRENT_IP/32
Konfigurera
kubectl
för att ansluta till ditt AKS-kluster med hjälp avaz aks get-credentials
kommandot .az aks get-credentials --resource-group $RG --name $AKSNAME
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.
Granska snabbstartsmanifestet för AKS Store Demo för att se alla resurser som kommer att skapas.
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
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.
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
Hämta tjänstens IP-adress med kommandot
kubectl get svc store-front
.SERVICE_IP=$(kubectl get svc store-front -o jsonpath='{.status.loadBalancer.ingress[*].ip}')
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
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.132
brandväggens offentliga IP-adress .
På den här sidan kan du visa produkter, lägga till dem i kundvagnen och sedan göra en beställning.
Om du vill rensa Azure-resurser tar du bort AKS-resursgruppen med kommandot az group delete
.
az group delete --name $RG
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
.
Feedback om Azure Kubernetes Service
Azure Kubernetes Service är ett öppen källkod projekt. Välj en länk för att ge feedback: