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:
- 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
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"
Provisikan jaringan virtual dengan dua subnet terpisah: satu untuk kluster dan satu untuk firewall. Secara opsional, Anda dapat membuatnya untuk masuknya layanan internal.
Buat grup sumber daya menggunakan
az group create
perintah .az group create --name $RG --location $LOC
Buat jaringan virtual dengan dua subnet untuk menghosting kluster AKS dan Azure Firewall menggunakan
az network vnet create
perintah danaz 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
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.
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 --resource-group $RG -n $FWPUBLICIP_NAME --location $LOC --sku "Standard"
Daftarkan ekstensi Azure Firewall CLI untuk membuat Azure Firewall menggunakan
az extension add
perintah .az extension add --name azure-firewall
Buat Azure Firewall dan aktifkan
az network firewall create
proksi DNS menggunakan perintah dan atur--enable-dns-proxy
ketrue
.az network firewall create --resource-group $RG --name $FWNAME --location $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.
Buat konfigurasi IP Azure Firewall menggunakan
az network firewall ip-config create
perintah .az network firewall ip-config create --resource-group $RG --firewall-name $FWNAME --name $FWIPCONFIG_NAME --public-ip-address $FWPUBLICIP_NAME --vnet-name $VNET_NAME
Setelah perintah sebelumnya berhasil, simpan alamat IP frontend firewall untuk konfigurasi nanti.
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)
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.
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.
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 --resource-group $RG --location $LOC --name $FWROUTE_TABLE_NAME
Buat rute dalam tabel rute untuk subnet menggunakan
az network route-table route create
perintah .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
Untuk informasi tentang cara mengambil alih rute sistem default Azure atau menambahkan rute tambahan ke tabel rute subnet, lihat dokumentasi tabel rute jaringan virtual.
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).
Buat aturan jaringan menggunakan
az network firewall network-rule create
perintah .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'
Buat aturan aplikasi menggunakan
az network firewall application-rule create
perintah .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
Untuk mempelajari selengkapnya tentang Azure Firewall, lihat dokumentasi Azure Firewall.
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 --resource-group $RG --vnet-name $VNET_NAME --name $AKSSUBNET_NAME --route-table $FWROUTE_TABLE_NAME
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.
Subnet target yang akan digunakan didefinisikan dengan variabel lingkungan, $SUBNETID
. Atur nilai untuk ID subnet menggunakan perintah berikut:
SUBNETID=$(az network vnet subnet show --resource-group $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.
- Membuat kluster AKS dengan identitas yang ditetapkan sistem
- Membuat kluster AKS dengan identitas yang ditetapkan pengguna
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 --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
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.
Ambil alamat IP Anda menggunakan perintah berikut:
CURRENT_IP=$(dig @resolver1.opendns.com ANY myip.opendns.com +short)
Tambahkan alamat IP ke rentang yang disetujui menggunakan
az aks update
perintah .az aks update --resource-group $RG --name $AKSNAME --api-server-authorized-ip-ranges $CURRENT_IP/32
Konfigurasikan
kubectl
untuk menyambungkan ke kluster AKS Anda menggunakanaz aks get-credentials
perintah .az aks get-credentials --resource-group $RG --name $AKSNAME
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.
Tinjau manifes mulai cepat Demo Penyimpanan AKS untuk melihat semua sumber daya yang akan dibuat.
Sebarkan layanan menggunakan
kubectl apply
perintah .kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/aks-store-demo/main/aks-store-quickstart.yaml
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.
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
Dapatkan IP layanan menggunakan
kubectl get svc store-front
perintah .SERVICE_IP=$(kubectl get svc store-front -o jsonpath='{.status.loadBalancer.ingress[*].ip}')
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
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
.
Di halaman ini, Anda dapat melihat produk, menambahkannya ke kelir Anda, lalu melakukan pemesanan.
Untuk membersihkan sumber daya Azure, hapus grup sumber daya AKS menggunakan az group delete
perintah .
az group delete --name $RG
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.
Umpan balik Azure Kubernetes Service
Azure Kubernetes Service adalah proyek sumber terbuka. Pilih tautan untuk memberikan umpan balik: