Membatasi lalu lintas jaringan dengan Azure Firewall di Azure Kubernetes Service (AKS)

Pelajari cara menggunakan aturan Jaringan keluar dan FQDN untuk kluster AKS untuk mengontrol lalu lintas keluar menggunakan Azure Firewall di AKS. Untuk menyederhanakan konfigurasi ini, Azure Firewall menyediakan tag Azure Kubernetes Service (AzureKubernetesService) Nama Domain yang Sepenuhnya Memenuhi Syarat (FQDN) yang membatasi lalu lintas keluar dari kluster AKS. Artikel ini memperlihatkan bagaimana Anda dapat mengonfigurasi aturan lalu lintas Kluster AKS melalui firewall Azure.

Catatan

Tag FQDN berisi semua FQDN yang tercantum dalam Jaringan keluar dan aturan FQDN untuk kluster AKS dan diperbarui secara otomatis.

Untuk skenario produksi, sebaiknya anda memiliki minimal 20 IP frontend pada Azure Firewall untuk menghindari masalah kelelahan port SNAT.

Informasi berikut menyediakan contoh arsitektur penyebaran:

Topologi terkunci

  • Ingress publik dipaksa mengalir melalui filter firewall
    • Simpul agen AKS diisolasi dalam subnet khusus
    • Azure Firewall disebarkan di subnetnya sendiri
    • Aturan DNAT menerjemahkan IP publik firewall ke ip frontend load balancer
  • Permintaan keluar dimulai dari simpul agen ke IP internal Azure Firewall menggunakan rute yang ditentukan pengguna (UDR)
    • Permintaan dari simpul agen AKS mengikuti UDR yang telah ditempatkan pada subnet tempat kluster AKS disebarkan
    • Azure Firewall keluar dari jaringan virtual dari frontend IP publik
    • Akses ke internet publik atau layanan Azure lainnya mengalir ke dan dari alamat IP frontend firewall
    • Akses ke sarana kontrol AKS dapat dilindungi oleh rentang IP resmi server API, termasuk alamat IP frontend publik firewall
  • Lalu lintas internal
    • Anda dapat menggunakan load balancer internal untuk lalu lintas internal, yang dapat Anda isolasi pada subnetnya sendiri, alih-alih atau bersama load balancer publik

Mengonfigurasi variabel lingkungan

Tentukan sekumpulan variabel lingkungan yang akan digunakan dalam pembuatan sumber daya.

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"

Membuat jaringan virtual dengan beberapa subnet

Provisikan jaringan virtual dengan dua subnet terpisah: satu untuk kluster dan satu untuk firewall. Secara opsional, Anda dapat membuatnya untuk masuknya layanan internal.

Topologi jaringan

  1. Buat grup sumber daya menggunakan az group create perintah .

    az group create --name $RG --location $LOC
    
  2. Buat jaringan virtual dengan dua subnet untuk menghosting kluster AKS dan Azure Firewall menggunakan az network vnet create perintah dan 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
    

Membuat dan menyiapkan Azure Firewall

Anda perlu mengonfigurasi aturan masuk dan keluar Azure Firewall. Tujuan utama firewall adalah untuk memungkinkan organisasi mengonfigurasi aturan lalu lintas masuk dan keluar granular ke dalam dan keluar dari kluster AKS.

Penting

Jika kluster atau aplikasi Anda membuat sejumlah besar koneksi keluar yang diarahkan ke subset tujuan yang sama atau kecil, Anda mungkin memerlukan lebih banyak IP frontend firewall untuk menghindari memaksimalkan port per IP frontend.

Untuk informasi selengkapnya tentang cara membuat Azure Firewall dengan beberapa IP, lihat Membuat Azure Firewall dengan beberapa alamat IP publik menggunakan Bicep.

Firewall dan UDR

  1. Buat sumber daya IP publik SKU standar menggunakan az network public-ip create perintah . Sumber daya ini akan digunakan sebagai alamat frontend Azure Firewall.

    az network public-ip create -g $RG -n $FWPUBLICIP_NAME -l $LOC --sku "Standard"
    
  2. Daftarkan ekstensi Azure Firewall CLI untuk membuat Azure Firewall menggunakan az extension add perintah .

    az extension add --name azure-firewall
    
  3. Buat Azure Firewall dan aktifkan az network firewall create proksi DNS menggunakan perintah dan atur --enable-dns-proxy ke true.

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

Menyiapkan alamat IP publik ke Azure Firewall mungkin memakan waktu beberapa menit. Setelah siap, alamat IP yang dibuat sebelumnya dapat ditetapkan ke ujung depan firewall.

Catatan

Untuk memanfaatkan FQDN pada aturan jaringan, kita memerlukan proksi DNS diaktifkan. Saat proksi DNS diaktifkan, firewall mendengarkan port 53 dan meneruskan permintaan DNS ke server DNS yang ditentukan di atas. Ini memungkinkan firewall untuk menerjemahkan FQDN secara otomatis.

  1. Buat konfigurasi IP Azure Firewall menggunakan az network firewall ip-config create perintah .

    az network firewall ip-config create -g $RG -f $FWNAME -n $FWIPCONFIG_NAME --public-ip-address $FWPUBLICIP_NAME --vnet-name $VNET_NAME
    
  2. Setelah perintah sebelumnya berhasil, simpan alamat IP frontend firewall untuk konfigurasi nanti.

    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)
    

Catatan

Jika Anda menggunakan akses aman ke server API AKS dengan rentang alamat IP resmi,Anda perlu menambahkan IP publik firewall ke dalam rentang IP resmi.

Membuat rute dengan hop ke Azure Firewall

Azure secara otomatis merutekan traffic antara subnet Azure, jaringan virtual, dan jaringan lokal. Jika Anda ingin mengubah perutean default Azure, Anda dapat membuat tabel rute.

Penting

Jenis keluar UDR (userDefinedRouting) memerlukan rute untuk 0.0.0.0/0 dan tujuan hop NVA berikutnya dalam tabel rute. Tabel rute sudah memiliki default 0.0.0.0/0 ke Internet. Tanpa alamat IP publik untuk digunakan Azure untuk Penerjemahan Alamat Jaringan Sumber (SNAT), cukup menambahkan rute ini tidak akan memberi Anda konektivitas Internet keluar. AKS memvalidasi bahwa Anda tidak membuat rute 0.0.0.0/0 yang menunjuk ke Internet tetapi sebaliknya ke gateway, NVA, dll. Saat menggunakan jenis UDR keluar, alamat IP publik load balancer untuk permintaan masuk tidak dibuat kecuali Anda mengonfigurasi layanan jenis loadbalancer. AKS tidak pernah membuat alamat IP publik untuk permintaan keluar jika Anda menetapkan jenis UDR keluar. Untuk informasi selengkapnya, lihat Aturan keluar untuk Azure Load Balancer.

  1. Buat tabel rute kosong untuk dikaitkan dengan subnet tertentu menggunakan az network route-table create perintah . Tabel rute akan menentukan hop berikutnya seperti yang dibuat Azure Firewall di atas. Setiap subnet dapat memiliki nol atau satu tabel rute yang terkait dengannya.

    az network route-table create -g $RG -l $LOC --name $FWROUTE_TABLE_NAME
    
  2. Buat rute dalam tabel rute untuk subnet menggunakan az network route-table route create perintah .

    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
    

Untuk informasi tentang cara mengambil alih rute sistem default Azure atau menambahkan rute tambahan ke tabel rute subnet, lihat dokumentasi tabel rute jaringan virtual.

Tambah aturan firewall

Catatan

Untuk aplikasi di luar namespace layanan sistem kube atau gatekeeper-system yang perlu berbicara dengan server API, aturan jaringan tambahan untuk memungkinkan komunikasi TCP ke port 443 untuk IP server API selain menambahkan aturan aplikasi untuk fqdn-tag AzureKubernetesService diperlukan.

Bagian ini mencakup tiga aturan jaringan dan aturan aplikasi yang dapat Anda gunakan untuk mengonfigurasi pada firewall Anda. Anda mungkin perlu menyesuaikan aturan ini berdasarkan penyebaran Anda.

  • Aturan jaringan pertama memungkinkan akses ke port 9000 melalui TCP.
  • Aturan jaringan kedua memungkinkan akses ke port 1194 dan 123 melalui UDP. Jika Anda menyebarkan ke Microsoft Azure yang dioperasikan oleh 21Vianet, lihat Aturan jaringan yang diperlukan Azure yang dioperasikan oleh 21Vianet. Kedua aturan ini hanya akan memungkinkan lalu lintas yang ditujukan ke CIDR Wilayah Azure dalam artikel ini, yaitu US Timur.
  • Aturan jaringan ketiga membuka port 123 ke ntp.ubuntu.com FQDN melalui UDP. Menambahkan FQDN sebagai aturan jaringan adalah salah satu fitur spesifik Azure Firewall, jadi Anda harus menyesuaikannya saat menggunakan opsi Anda sendiri.
  • Aturan jaringan keempat dan kelima memungkinkan akses untuk menarik kontainer dari GitHub Container Registry (ghcr.io) dan Docker Hub (docker.io).
  1. Buat aturan jaringan menggunakan az network firewall network-rule create perintah .

    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. Buat aturan aplikasi menggunakan az network firewall application-rule create perintah .

    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
    

Untuk mempelajari selengkapnya tentang Azure Firewall, lihat dokumentasi Azure Firewall.

Mengaitkan tabel rute ke AKS

Untuk mengaitkan klaster dengan firewall, subnet khusus untuk subnet klaster harus mereferensikan tabel rute yang dibuat di atas. az network vnet subnet update Gunakan perintah untuk mengaitkan tabel rute ke AKS.

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

Menyebarkan kluster AKS yang mengikuti aturan keluar Anda

Sekarang, Anda dapat menyebarkan kluster AKS ke jaringan virtual yang ada. Anda akan menggunakan userDefinedRouting jenis keluar, yang memastikan bahwa setiap lalu lintas keluar dipaksa melalui firewall dan tidak ada jalur keluar lainnya yang akan ada. loadBalancer Jenis keluar juga dapat digunakan.

aks-deploy

Subnet target yang akan digunakan didefinisikan dengan variabel lingkungan, $SUBNETID. Atur nilai untuk ID subnet menggunakan perintah berikut:

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

Anda akan menentukan tipe keluar untuk menggunakan UDR yang sudah ada pada subjaringan. Konfigurasi ini akan memungkinkan AKS untuk melewati penyiapan dan penyediaan IP untuk load balancer.

Tip

Anda dapat menambahkan fitur tambahan ke penyebaran kluster, seperti kluster privat.

Anda dapat menambahkan fitur AKS untuk rentang IP resmi server API untuk membatasi akses server API hanya ke titik akhir publik firewall. Fitur rentang IP resmi ditandai dalam diagram sebagai opsional. Saat mengaktifkan fitur rentang IP resmi untuk membatasi akses server API, alat pengembang Anda harus menggunakan jumpbox dari jaringan virtual firewall, atau Anda harus menambahkan semua titik akhir pengembang ke rentang IP resmi.


Catatan

AKS akan membuat identitas kubelet yang ditetapkan sistem di grup sumber daya simpul jika Anda tidak menentukan identitas terkelola kubelet Anda sendiri.

Untuk perutean yang ditentukan pengguna, identitas yang ditetapkan sistem hanya mendukung plugin jaringan CNI.

Buat kluster AKS menggunakan identitas terkelola yang ditetapkan sistem dengan plugin jaringan CNI menggunakan az aks create perintah .

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

Aktifkan akses pengembang ke server API

Jika Anda menggunakan rentang IP resmi untuk kluster Anda pada langkah sebelumnya, Anda perlu menambahkan alamat IP alat pengembang Ke daftar kluster AKS rentang IP yang disetujui sehingga Anda mengakses server API dari sana. Anda juga dapat mengonfigurasi jumpbox dengan alat yang diperlukan di dalam subnet terpisah di jaringan virtual firewall.

  1. Ambil alamat IP Anda menggunakan perintah berikut:

    CURRENT_IP=$(dig @resolver1.opendns.com ANY myip.opendns.com +short)
    
  2. Tambahkan alamat IP ke rentang yang disetujui menggunakan az aks update perintah .

    az aks update -g $RG -n $AKSNAME --api-server-authorized-ip-ranges $CURRENT_IP/32
    
  3. Konfigurasikan kubectl untuk menyambungkan ke kluster AKS Anda menggunakan az aks get-credentials perintah .

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

Menyebarkan layanan publik di AKS

Anda sekarang dapat mulai mengekspos layanan dan menyebarkan aplikasi ke klaster ini. Dalam contoh ini, kami akan mengekspos layanan publik, tetapi Anda juga mungkin ingin mengekspos layanan internal menggunakan load balancer internal.

DNAT Pelayanan Publik

  1. Tinjau manifes mulai cepat Demo Penyimpanan AKS untuk melihat semua sumber daya yang akan dibuat.

  2. Sebarkan layanan menggunakan kubectl apply perintah .

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

Mengizinkan lalu lintas masuk melalui Azure Firewall

Penting

Saat Anda menggunakan Azure Firewall untuk membatasi lalu lintas keluar dan membuat UDR untuk memaksa semua lalu lintas keluar, pastikan Anda membuat aturan DNAT yang sesuai di Azure Firewall untuk mengizinkan lalu lintas masuk dengan benar. Menggunakan Azure Firewall dengan UDR melanggar pengaturan masuk karena perutean asimetris. Masalah ini terjadi jika subnet AKS memiliki rute default yang masuk ke alamat IP privat firewall, tetapi Anda menggunakan load balancer publik - ingress atau layanan Kubernetes jenis loadBalancer. Pada kasus ini, lalu lintas penyeimbang beban yang masuk diterima melalui alamat IP publiknya, tetapi jalur kembalinya melewati alamat IP privat firewall. Karena firewall bersifat stateful, firewall mengabaikan paket yang kembali karena firewall tidak mengetahui sesi yang dibuat. Untuk mempelajari cara mengintegrasikan Azure Firewall dengan ingress atau load balancer layanan Anda, lihat Mengintegrasikan Azure Firewall dengan Azure Standard Load Balancer.

Untuk mengonfigurasi konektivitas masuk, Anda perlu menulis aturan DNAT ke Azure Firewall. Untuk menguji konektivitas ke klaster Anda, aturan didefinisikan untuk alamat IP publik frontend firewall untuk merutekan ke IP internal yang diekspos oleh layanan internal. Alamat tujuan dapat disesuaikan. Alamat yang diterjemahkan harus alamat IP dari penyeimbang beban internal. Port yang diterjemahkan harus menjadi port yang diekspos untuk layanan Kubernetes Anda. Anda juga perlu menentukan alamat IP internal yang ditetapkan ke load balancer yang dibuat oleh layanan Kubernetes.

  1. Dapatkan alamat IP internal yang ditetapkan ke load balancer menggunakan kubectl get services perintah .

    kubectl get services
    

    Alamat IP akan tercantum di kolom, seperti yang EXTERNAL-IP ditunjukkan dalam contoh output berikut:

    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. Dapatkan IP layanan menggunakan kubectl get svc voting-app perintah .

    SERVICE_IP=$(kubectl get svc store-front -o jsonpath='{.status.loadBalancer.ingress[*].ip}')
    
  3. Tambahkan aturan NAT menggunakan az network firewall nat-rule create perintah .

    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
    

Memvalidasi konektivitas

Navigasi ke alamat IP frontend Azure Firewall di browser untuk memvalidasi konektivitas.

Anda akan melihat aplikasi penyimpanan AKS. Dalam contoh ini, IP publik firewall adalah 52.253.228.132.

Cuplikan layar memperlihatkan Azure Store Front App dibuka di browser lokal.

Di halaman ini, Anda dapat melihat produk, menambahkannya ke kelir Anda, lalu melakukan pemesanan.

Membersihkan sumber daya

Untuk membersihkan sumber daya Azure, hapus grup sumber daya AKS menggunakan az group delete perintah .

az group delete -g $RG

Langkah berikutnya

Dalam artikel ini, Anda mempelajari cara mengamankan lalu lintas keluar menggunakan Azure Firewall. Jika diperlukan, Anda dapat menggeneralisasi langkah-langkah di atas untuk meneruskan lalu lintas ke solusi keluar pilihan Anda mengikuti dokumentasi Jenis userDefinedRoute Keluar.