Ograniczanie ruchu sieciowego za pomocą usługi Azure Firewall w usłudze Azure Kubernetes Service (AKS)

Dowiedz się, jak używać reguł sieci wychodzącej i nazw FQDN dla klastrów usługi AKS do kontrolowania ruchu wychodzącego przy użyciu usługi Azure Firewall w usłudze AKS. Aby uprościć tę konfigurację, usługa Azure Firewall udostępnia tag usługi Azure Kubernetes Service () w pełni kwalifikowanej nazwy domeny (AzureKubernetesServiceFQDN), który ogranicza ruch wychodzący z klastra usługi AKS. W tym artykule pokazano, jak skonfigurować reguły ruchu klastra usługi AKS za pośrednictwem zapory platformy Azure.

Uwaga

Tag FQDN zawiera wszystkie nazwy FQDN wymienione w regułach sieci wychodzącej i nazwy FQDN dla klastrów usługi AKS i są automatycznie aktualizowane.

W przypadku scenariuszy produkcyjnych zalecamy posiadanie co najmniej 20 adresów IP frontonu w usłudze Azure Firewall, aby uniknąć problemów z wyczerpaniem portów SNAT.

Poniższe informacje zawierają przykładową architekturę wdrożenia:

Topologia zablokowana

  • Publiczny ruch przychodzący jest zmuszony do przepływu przez filtry zapory
    • Węzły agenta usługi AKS są izolowane w dedykowanej podsieci
    • Usługa Azure Firewall jest wdrażana we własnej podsieci
    • Reguła DNAT tłumaczy publiczny adres IP zapory na adres IP frontonu modułu równoważenia obciążenia
  • Żądania wychodzące rozpoczynają się od węzłów agenta do wewnętrznego adresu IP usługi Azure Firewall przy użyciu trasy zdefiniowanej przez użytkownika (UDR)
    • Żądania z węzłów agenta usługi AKS są zgodne z trasę zdefiniowaną przez użytkownika, która została umieszczona w podsieci, w której wdrożono klaster usługi AKS
    • Usługa Azure Firewall wychodząca z sieci wirtualnej z frontonu publicznego adresu IP
    • Dostęp do publicznego Internetu lub innych usług platformy Azure przepływa do i z adresu IP frontonu zapory
    • Dostęp do płaszczyzny sterowania usługi AKS może być chroniony przez autoryzowane zakresy adresów IP serwera interfejsu API, w tym publiczny adres IP frontonu zapory
  • Ruch wewnętrzny

Skonfiguruj zmienne środowiskowe

Zdefiniuj zestaw zmiennych środowiskowych, które mają być używane w tworzeniu zasobów.

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"

Tworzenie sieci wirtualnej z wieloma podsieciami

Aprowizuj sieć wirtualną z dwiema oddzielnymi podsieciami: jedną dla klastra i jedną dla zapory. Opcjonalnie możesz utworzyć jeden dla ruchu przychodzącego usługi wewnętrznej.

Pusta topologia sieci

  1. Utwórz grupę zasobów przy użyciu az group create polecenia .

    az group create --name $RG --location $LOC
    
  2. Utwórz sieć wirtualną z dwiema podsieciami do hostowania klastra usługi AKS i usługi Azure Firewall przy użyciu az network vnet create poleceń i 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
    

Tworzenie i konfigurowanie usługi Azure Firewall

Należy skonfigurować reguły ruchu przychodzącego i wychodzącego usługi Azure Firewall. Głównym celem zapory jest umożliwienie organizacjom konfigurowania szczegółowych reguł ruchu przychodzącego i wychodzącego do i z klastra usługi AKS.

Ważne

Jeśli klaster lub aplikacja tworzy dużą liczbę połączeń wychodzących kierowanych do tego samego lub małego podzestawu miejsc docelowych, może być konieczne wymaganie większej liczby adresów IP frontonu zapory, aby uniknąć maksymalnego limitu portów na adres IP frontonu.

Aby uzyskać więcej informacji na temat tworzenia usługi Azure Firewall z wieloma adresami IP, zobacz Tworzenie usługi Azure Firewall z wieloma publicznymi adresami IP przy użyciu Bicep.

Zapora i trasa zdefiniowana przez użytkownika

  1. Utwórz standardowy zasób publicznego adresu IP jednostki SKU przy użyciu az network public-ip create polecenia . Ten zasób będzie używany jako adres frontonu usługi Azure Firewall.

    az network public-ip create -g $RG -n $FWPUBLICIP_NAME -l $LOC --sku "Standard"
    
  2. Zarejestruj rozszerzenie interfejsu wiersza polecenia usługi Azure Firewall, aby utworzyć usługę Azure Firewall przy użyciu az extension add polecenia .

    az extension add --name azure-firewall
    
  3. Utwórz usługę Azure Firewall i włącz serwer proxy DNS przy użyciu az network firewall create polecenia i ustawić wartość --enable-dns-proxy na true.

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

Skonfigurowanie publicznego adresu IP w usłudze Azure Firewall może potrwać kilka minut. Gdy wszystko będzie gotowe, adres IP utworzony wcześniej można przypisać do frontonu zapory.

Uwaga

Aby korzystać z nazwy FQDN w regułach sieci, potrzebujemy włączonego serwera proxy DNS. Po włączeniu serwera proxy DNS zapora nasłuchuje na porcie 53 i przekazuje żądania DNS do serwera DNS określonego powyżej. Dzięki temu zapora może automatycznie przetłumaczyć nazwę FQDN.

  1. Utwórz konfigurację adresu IP usługi Azure Firewall przy użyciu az network firewall ip-config create polecenia .

    az network firewall ip-config create -g $RG -f $FWNAME -n $FWIPCONFIG_NAME --public-ip-address $FWPUBLICIP_NAME --vnet-name $VNET_NAME
    
  2. Po pomyślnym zakończeniu poprzedniego polecenia zapisz adres IP frontonu zapory na potrzeby konfiguracji później.

    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)
    

Uwaga

Jeśli używasz bezpiecznego dostępu do serwera interfejsu API usługi AKS z autoryzowanymi zakresami adresów IP, musisz dodać publiczny adres IP zapory do autoryzowanego zakresu adresów IP.

Tworzenie trasy z przeskokiem do usługi Azure Firewall

Platforma Azure automatycznie kieruje ruchem między podsieciami platformy Azure, sieciami wirtualnymi i sieciami lokalnymi. Jeśli chcesz zmienić domyślny routing platformy Azure, możesz utworzyć tabelę tras.

Ważne

Typ ruchu wychodzącego trasy zdefiniowanej przez użytkownika (userDefinedRouting) wymaga trasy dla 0.0.0.0/0 i miejsca docelowego następnego przeskoku urządzenia WUS w tabeli tras. Tabela tras ma już domyślną 0.0.0.0/0 do Internetu. Bez publicznego adresu IP dla platformy Azure do użycia na potrzeby tłumaczenia adresów sieciowych źródła (SNAT), po prostu dodanie tej trasy nie zapewni wychodzącej łączności z Internetem. Usługa AKS sprawdza, czy nie utworzysz trasy 0.0.0.0/0 wskazującej Internet, ale zamiast bramy, urządzenia WUS itp. W przypadku korzystania z typu ruchu wychodzącego trasy zdefiniowanej przez użytkownika publiczny adres IP modułu równoważenia obciążenia dla żądań przychodzących nie jest tworzony, chyba że skonfigurowano usługę typu loadbalancer. Usługa AKS nigdy nie tworzy publicznego adresu IP dla żądań wychodzących, jeśli ustawisz typ ruchu wychodzącego trasy zdefiniowanej przez użytkownika. Aby uzyskać więcej informacji, zobacz Reguły ruchu wychodzącego dla usługi Azure Load Balancer.

  1. Utwórz pustą tabelę tras, która ma być skojarzona z daną podsiecią az network route-table create przy użyciu polecenia . Tabela tras zdefiniuje następny przeskok jako utworzoną powyżej usługę Azure Firewall. Każda podsieć może mieć skojarzoną ze sobą żadną lub jedną tabelę tras.

    az network route-table create -g $RG -l $LOC --name $FWROUTE_TABLE_NAME
    
  2. Utwórz trasy w tabeli tras dla podsieci przy użyciu az network route-table route create polecenia .

    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
    

Aby uzyskać informacje na temat zastępowania domyślnych tras systemowych platformy Azure lub dodawania dodatkowych tras do tabeli tras podsieci, zobacz dokumentację tabeli tras sieci wirtualnej.

Dodawanie reguł zapory

Uwaga

W przypadku aplikacji spoza przestrzeni nazw kube-system lub gatekeeper-system, które muszą komunikować się z serwerem interfejsu API, wymagana jest dodatkowa reguła sieci umożliwiająca komunikację TCP z portem 443 dla adresu IP serwera interfejsu API oprócz dodawania reguły aplikacji dla tagu fqdn-tag AzureKubernetesService .

W tej sekcji opisano trzy reguły sieciowe i regułę aplikacji, której można użyć do skonfigurowania zapory. Może być konieczne dostosowanie tych reguł na podstawie wdrożenia.

  • Pierwsza reguła sieci umożliwia dostęp do portu 9000 za pośrednictwem protokołu TCP.
  • Druga reguła sieci umożliwia dostęp do portu 1194 i 123 za pośrednictwem protokołu UDP. Jeśli wdrażasz na platformie Microsoft Azure obsługiwanej przez firmę 21Vianet, zapoznaj się z regułami sieci wymaganymi przez platformę Azure obsługiwaną przez firmę 21Vianet. Obie te reguły zezwalają tylko na ruch kierowany do trasy CIDR regionu świadczenia usługi Azure w tym artykule, czyli Wschodnie stany USA.
  • Trzecia reguła sieci otwiera port 123 do ntp.ubuntu.com nazwy FQDN za pośrednictwem protokołu UDP. Dodanie nazwy FQDN jako reguły sieciowej jest jedną z określonych funkcji usługi Azure Firewall, dlatego należy dostosować ją podczas korzystania z własnych opcji.
  • Czwarte i piąte reguły sieci umożliwiają dostęp do ściągania kontenerów z usługi GitHub Container Registry (ghcr.io) i usługi Docker Hub (docker.io).
  1. Utwórz reguły sieci przy az network firewall network-rule create użyciu polecenia .

    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. Utwórz regułę aplikacji przy użyciu az network firewall application-rule create polecenia .

    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
    

Aby dowiedzieć się więcej o usłudze Azure Firewall, zobacz dokumentację usługi Azure Firewall.

Kojarzenie tabeli tras z usługą AKS

Aby skojarzyć klaster z zaporą, dedykowana podsieć dla podsieci klastra musi odwoływać się do tabeli tras utworzonej powyżej. az network vnet subnet update Użyj polecenia , aby skojarzyć tabelę tras z usługą AKS.

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

Wdrażanie klastra usługi AKS zgodnego z regułami ruchu wychodzącego

Teraz możesz wdrożyć klaster usługi AKS w istniejącej sieci wirtualnej. Użyjesz typu ruchu wychodzącegouserDefinedRouting, co gwarantuje, że cały ruch wychodzący zostanie wymuszony przez zaporę, a żadne inne ścieżki ruchu wychodzącego nie będą istnieć. loadBalancer Można również użyć typu ruchu wychodzącego.

aks-deploy

Podsieć docelowa do wdrożenia jest definiowana za pomocą zmiennej środowiskowej $SUBNETID. Ustaw wartość identyfikatora podsieci przy użyciu następującego polecenia:

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

Zdefiniujesz typ ruchu wychodzącego, aby użyć trasy zdefiniowanej przez użytkownika, która już istnieje w podsieci. Ta konfiguracja umożliwi usłudze AKS pominięcie konfiguracji i aprowizacji adresów IP dla modułu równoważenia obciążenia.

Napiwek

Do wdrożenia klastra można dodać dodatkowe funkcje, takie jak klastry prywatne.

Możesz dodać funkcję AKS dla autoryzowanych zakresów adresów IP serwera interfejsu API, aby ograniczyć dostęp serwera interfejsu API tylko do publicznego punktu końcowego zapory. Funkcja autoryzowanych zakresów adresów IP jest oznaczona na diagramie jako opcjonalna. Po włączeniu autoryzowanej funkcji zakresu adresów IP w celu ograniczenia dostępu do serwera interfejsu API narzędzia deweloperskie muszą używać serwera przesiadkowego z sieci wirtualnej zapory lub należy dodać wszystkie punkty końcowe dewelopera do autoryzowanego zakresu adresów IP.


Uwaga

Usługa AKS utworzy tożsamość kubelet przypisaną przez system w grupie zasobów węzła, jeśli nie określisz własnej tożsamości zarządzanej kubelet.

W przypadku routingu zdefiniowanego przez użytkownika tożsamość przypisana przez system obsługuje tylko wtyczkę sieci CNI.

Utwórz klaster usługi AKS przy użyciu tożsamości zarządzanej przypisanej przez system z wtyczką sieciową az aks create CNI przy użyciu polecenia .

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

Włączanie dostępu dewelopera do serwera interfejsu API

Jeśli w poprzednim kroku użyto autoryzowanych zakresów adresów IP dla klastra, należy dodać adresy IP narzędzi deweloperskich do listy zatwierdzonych zakresów adresów IP klastra usługi AKS, aby uzyskać dostęp do serwera interfejsu API z tego miejsca. Możesz również skonfigurować serwer przesiadkowy z wymaganymi narzędziami wewnątrz oddzielnej podsieci w sieci wirtualnej zapory.

  1. Pobierz swój adres IP przy użyciu następującego polecenia:

    CURRENT_IP=$(dig @resolver1.opendns.com ANY myip.opendns.com +short)
    
  2. Dodaj adres IP do zatwierdzonych zakresów przy użyciu az aks update polecenia .

    az aks update -g $RG -n $AKSNAME --api-server-authorized-ip-ranges $CURRENT_IP/32
    
  3. Skonfiguruj kubectl , aby nawiązać połączenie z klastrem az aks get-credentials usługi AKS przy użyciu polecenia .

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

Wdrażanie usługi publicznej w usłudze AKS

Teraz możesz rozpocząć udostępnianie usług i wdrażanie aplikacji w tym klastrze. W tym przykładzie uwidocznimy usługę publiczną, ale możesz również uwidocznić usługę wewnętrzną przy użyciu wewnętrznego modułu równoważenia obciążenia.

DnaT usługi publicznej

  1. Zapoznaj się z manifestem demonstracyjnego pokazu usługi AKS Store, aby wyświetlić wszystkie zasoby, które zostaną utworzone.

  2. Wdróż usługę kubectl apply przy użyciu polecenia .

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

Zezwalaj na ruch przychodzący przez usługę Azure Firewall

Ważne

Jeśli używasz usługi Azure Firewall do ograniczania ruchu wychodzącego i tworzenia trasy zdefiniowanej przez użytkownika w celu wymuszenia całego ruchu wychodzącego, upewnij się, że utworzono odpowiednią regułę DNAT w usłudze Azure Firewall, aby poprawnie zezwalać na ruch przychodzący. Używanie usługi Azure Firewall z trasą zdefiniowaną przez użytkownika przerywa konfigurację ruchu przychodzącego z powodu routingu asymetrycznego. Problem występuje, gdy podsieć usługi AKS ma domyślną trasę, która przechodzi do prywatnego adresu IP zapory, ale używasz publicznego modułu równoważenia obciążenia — ruchu przychodzącego lub usługi Kubernetes typu loadBalancer. W takim przypadku przychodzący ruch modułu równoważenia obciążenia jest odbierany za pośrednictwem publicznego adresu IP, ale ścieżka powrotna przechodzi przez prywatny adres IP zapory. Ponieważ zapora jest stanowa, odrzuca zwracany pakiet, ponieważ zapora nie zna ustalonej sesji. Aby dowiedzieć się, jak zintegrować usługę Azure Firewall z modułem równoważenia obciążenia ruchu przychodzącego lub usługi, zobacz Integrowanie usługi Azure Firewall z usługą Azure usługa Load Balancer w warstwie Standardowa.

Aby skonfigurować łączność przychodzącą, musisz napisać regułę DNAT w usłudze Azure Firewall. Aby przetestować łączność z klastrem, zdefiniowano regułę dla publicznego adresu IP frontonu zapory w celu kierowania do wewnętrznego adresu IP uwidocznionego przez usługę wewnętrzną. Adres docelowy można dostosować. Przetłumaczony adres musi być adresem IP wewnętrznego modułu równoważenia obciążenia. Przetłumaczony port musi być uwidoczniony dla usługi Kubernetes. Należy również określić wewnętrzny adres IP przypisany do modułu równoważenia obciążenia utworzonego przez usługę Kubernetes.

  1. Pobierz wewnętrzny adres IP przypisany do modułu równoważenia obciążenia przy użyciu kubectl get services polecenia .

    kubectl get services
    

    Adres IP zostanie wyświetlony w kolumnie EXTERNAL-IP , jak pokazano w następujących przykładowych danych wyjściowych:

    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. Pobierz adres IP usługi przy użyciu kubectl get svc voting-app polecenia .

    SERVICE_IP=$(kubectl get svc store-front -o jsonpath='{.status.loadBalancer.ingress[*].ip}')
    
  3. Dodaj regułę translatora adresów sieciowych az network firewall nat-rule create przy użyciu polecenia .

    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
    

Weryfikowanie łączności

Przejdź do adresu IP frontonu usługi Azure Firewall w przeglądarce, aby zweryfikować łączność.

Powinna zostać wyświetlona aplikacja ze sklepu AKS. W tym przykładzie publiczny adres IP zapory to 52.253.228.132.

Zrzut ekranu przedstawiający aplikację frontonu sklepu Azure Store otwartą w przeglądarce lokalnej.

Na tej stronie możesz wyświetlać produkty, dodawać je do koszyka, a następnie składać zamówienie.

Czyszczenie zasobów

Aby wyczyścić zasoby platformy Azure, usuń grupę az group delete zasobów usługi AKS przy użyciu polecenia .

az group delete -g $RG

Następne kroki

W tym artykule przedstawiono sposób zabezpieczania ruchu wychodzącego przy użyciu usługi Azure Firewall. W razie potrzeby możesz uogólnić powyższe kroki, aby przekazać ruch do preferowanego rozwiązania ruchu wychodzącego zgodnie z dokumentacją Typu userDefinedRoute ruchu wychodzącego.