Nepředpokládám, že většina z vás bude IPv6 potřebovat. A pokud už ano, půjde vám asi o možnost vystavit aplikaci přes IPv6 spíše, než plnohodnotnou podporu IPv6 uvnitř VNETu a to už je delší dobu možné s využitím IPv6 laod balanceru nebo ve službě jako je Azure Front Door. Nicméně jsou situace, kdy se vám něco takového hodí:
Plná podpora IPv6 ve VNETu v Azure chyběla, ale od tohoto roku je možné ji v preview nasadit. Podívejme se dnes na to.
Protože jde o preview, nejprve si musíme provést registraci nové funkčnosti.
az feature register --name AllowIPv6VirtualNetwork --namespace Microsoft.Network
az feature register --name AllowIPv6CAOnStandardLB --namespace Microsoft.Network
Bude to trvat asi 30 minut. Až se vám služba ukáže jako Registered, přeregistrujte si celého resource providera.
az feature show --name AllowIPv6VirtualNetwork --namespace Microsoft.Network
az feature show --name AllowIPv6CAOnStandardLB --namespace Microsoft.Network
az provider register --namespace Microsoft.Network
Vytvořme si resource group.
az group create -n ipv6-rg -l westeurope
V dalším kroku si založíme VNET a subnety. Azure nepodporuje IPv6-only sítě, budeme muset udělat dual-stack, tedy zapnuté jak IPv4 tak IPv6 rozsahy (nicméně nic nám pak nebrání IPv4 přes NSG zakázat - podpora IPv4 je nutná z důvodu některých režijních systému jako jsou DHCP options s konfiguracemi, vnitřní DNS nebo metadata service).
az network vnet create -g ipv6-rg \
-n ipv6-net \
--address-prefix "fd00::/32" "10.0.0.0/16"
az network vnet subnet create -n jump-subnet \
--vnet-name ipv6-net \
-g ipv6-rg \
--address-prefixes "fd00:0:0:1::/64" "10.0.1.0/24"
az network vnet subnet create -n front-subnet \
--vnet-name ipv6-net \
-g ipv6-rg \
--address-prefixes "fd00:0:0:2::/64" "10.0.2.0/24"
az network vnet subnet create -n ngfw-subnet \
--vnet-name ipv6-net \
-g ipv6-rg \
--address-prefixes "fd00:0:0:3::/64" "10.0.4.0/24"
Pojďme si vytvořit NSG povolující SSH přístup a aplikujme na náš jump-subnet.
az network nsg create -n jump-nsg -g ipv6-rg
az network nsg rule create \
-n allowSsh \
--nsg-name jump-nsg \
-g ipv6-rg \
--priority 100 \
--access Allow \
--protocol "*" \
--direction Inbound \
--source-address-prefixes "*" \
--source-port-ranges "*" \
--destination-address-prefixes "*" \
--destination-port-ranges 22
az network nsg rule create \
-n allowOut \
--nsg-name jump-nsg \
-g ipv6-rg \
--priority 100 \
--access Allow \
--protocol "*" \
--direction Outbound \
--source-address-prefixes "*" \
--source-port-ranges "*" \
--destination-address-prefixes "*" \
--destination-port-ranges "*"
az network vnet subnet update -n jump-subnet \
--vnet-name ipv6-net \
-g ipv6-rg \
--network-security-group jump-nsg
Připravme si jump server. Podpora IPv6 už je plnohodnotná, takže před ním nepotřebuje žádný balancer, nicméně musíme mít opět dual-stack. Vytvoříme tedy public IPv4 a IPv6 adresu a následně síťovou kartu IPv4, do které ale přidáme další ip konfiguraci pro IPv6.
az network public-ip create \
-n jump-ipv4 \
-g ipv6-rg \
--sku Standard \
--allocation-method static \
--version IPv4
az network public-ip create \
-n jump-ipv6 \
-g ipv6-rg \
--sku Standard \
--allocation-method static \
--version IPv6
az network nic create \
-n jump-nic \
-g ipv6-rg \
--vnet-name ipv6-net \
--subnet jump-subnet \
--private-ip-address-version IPv4 \
--public-ip-address jump-ipv4
az network nic ip-config create \
--nic-name jump-nic \
-n ipv6-config \
-g ipv6-rg \
--vnet-name ipv6-net \
--subnet jump-subnet \
--private-ip-address-version IPv6 \
--public-ip-address jump-ipv6
az vm create \
-n jump-vm \
-g ipv6-rg \
--nics jump-nic \
--size Standard_B1s \
--image UbuntuLTS \
--authentication-type password \
--admin-username tomas \
--admin-password Azure12345678
A je to! VM naběhla a můžeme s ní komunikovat přes public IPv6.
export jumpipv6=$(az network public-ip show -n jump-ipv6 -g ipv6-rg --query ipAddress -o tsv)
ssh tomas@$jumpipv6
Dál si připravíme NSG pro front-subnet, kde povolíme port 80 odkudkoli, ale port 22 pouze z jump-subnet. Všimněte si, že v zápisu už používám IPv6 - NSG tedy plně podporuje firewall pravidla pro IPv6.
az network nsg create -n front-nsg -g ipv6-rg
az network nsg rule create \
-n allowSshFromJumpSubnet \
--nsg-name front-nsg \
-g ipv6-rg \
--priority 100 \
--access Allow \
--protocol "*" \
--direction Inbound \
--source-address-prefixes "fd00:0:0:1::/64" \
--source-port-ranges "*" \
--destination-address-prefixes "*" \
--destination-port-ranges 22
az network nsg rule create \
-n allowWeb \
--nsg-name front-nsg \
-g ipv6-rg \
--priority 110 \
--access Allow \
--protocol "*" \
--direction Inbound \
--source-address-prefixes "*" \
--source-port-ranges "*" \
--destination-address-prefixes "*" \
--destination-port-ranges 80
az network nsg rule create \
-n allowOut \
--nsg-name front-nsg \
-g ipv6-rg \
--priority 100 \
--access Allow \
--protocol "*" \
--direction Outbound \
--source-address-prefixes "*" \
--source-port-ranges "*" \
--destination-address-prefixes "*" \
--destination-port-ranges "*"
az network vnet subnet update -n front-subnet \
--vnet-name ipv6-net \
-g ipv6-rg \
--network-security-group front-nsg
Vytvoříme si web server a tentokrát bez public IP. Opět založíme síťovku s IPv4 a přidáme konfiguraci IPv6.
az network nic create \
-n web-nic \
-g ipv6-rg \
--vnet-name ipv6-net \
--subnet front-subnet \
--private-ip-address-version IPv4
az network nic ip-config create \
--nic-name web-nic \
-n ipv6-config \
-g ipv6-rg \
--vnet-name ipv6-net \
--subnet front-subnet \
--private-ip-address-version IPv6
az vm create \
-n web-vm \
-g ipv6-rg \
--nics web-nic \
--size Standard_B1s \
--image UbuntuLTS \
--authentication-type password \
--admin-username tomas \
--admin-password Azure12345678
Připojím se do jump serveru a odtamtud do web-vm. Nainstalujeme si NGINX a vyskočíme ven. Z jump-vm ověříme, že web funguje a to na privátní IPv6 adrese web-vm.
ssh tomas@$jumpipv6
ssh tomas@web-vm
sudo apt update && sudo apt install nginx -y
exit
curl [fd00:0:0:2::4]
Představme si, že těchto web-vm máme několik a chceme je vystavit ven přes load balancer s IPv6 public adresou. I to už je v Azure plně podporované, ale zase musíme jít cestou dual-stack, tedy balancer bude aktivní v IPv4 i IPv6.
az network public-ip create \
-n lb-ipv4 \
-g ipv6-rg \
--sku Standard \
--allocation-method static \
--version IPv4
az network public-ip create \
-n lb-ipv6 \
-g ipv6-rg \
--sku Standard \
--allocation-method static \
--version IPv6
az network lb create \
-n lb \
-g ipv6-rg \
--sku Standard \
--frontend-ip-name front-ipv4 \
--public-ip-address lb-ipv4 \
--backend-pool-name backend-ipv4
az network lb frontend-ip create \
--lb-name lb \
-n front-ipv6 \
-g ipv6-rg \
--public-ip-address lb-ipv6
az network lb address-pool create \
--lb-name lb \
-n backend-ipv6 \
-g ipv6-rg
az network lb rule create \
--lb-name lb \
-n webRule-ipv4 \
-g ipv6-rg \
--frontend-ip-name front-ipv4 \
--protocol Tcp \
--frontend-port 80 \
--backend-port 80 \
--backend-pool-name backend-ipv4
az network lb rule create \
--lb-name lb \
-n webRule-ipv6 \
-g ipv6-rg \
--frontend-ip-name front-ipv6 \
--protocol Tcp \
--frontend-port 80 \
--backend-port 80 \
--backend-pool-name backend-ipv6
Vše připraveno, přidejme IPv4 a IPv6 konfigurace síťových karet do backend poolů.
az network nic ip-config update \
--nic-name web-nic \
-n ipconfig1 \
-g ipv6-rg \
--lb-address-pools backend-ipv4 \
--lb-name lb
az network nic ip-config update \
--nic-name web-nic \
-n ipv6-config \
-g ipv6-rg \
--lb-address-pools backend-ipv6 \
--lb-name lb
Ověřme si teď, že nám balancer odpovídá jak na IPv4, tak na IPv6.
export lbipv4=$(az network public-ip show -n lb-ipv4 -g ipv6-rg --query ipAddress -o tsv)
export lbipv6=$(az network public-ip show -n lb-ipv6 -g ipv6-rg --query ipAddress -o tsv)
curl $lbipv4
curl [$lbipv6]
Podpora IPv6 jde ale ještě dál - funguje i routování (UDR). Vytvořme si tedy firewall VM a pro jednoduchost použiji obyčejnou Linux mašinu.
az network nic create \
-n ngfw-nic \
-g ipv6-rg \
--vnet-name ipv6-net \
--subnet ngfw-subnet \
--private-ip-address-version IPv4 \
--ip-forwarding
az network nic ip-config create \
--nic-name ngfw-nic \
-n ipv6-config \
-g ipv6-rg \
--vnet-name ipv6-net \
--subnet ngfw-subnet \
--private-ip-address-version IPv6
az vm create \
-n ngfw-vm \
-g ipv6-rg \
--nics ngfw-nic \
--size Standard_B1s \
--image UbuntuLTS \
--authentication-type password \
--admin-username tomas \
--admin-password Azure12345678
Připojím se do ní, vypnu ufw, zapnu forwarding IPv6 (udělám z Linuxu router) a začnu poslouchat pakety IPv6 na portu 80 (zatím žádné neuvidím).
ssh tomas@$jumpipv6
ssh tomas@ngfw-vm
sudo ufw disable
sudo sysctl -w net.ipv6.conf.all.forwarding=1
sudo tcpdump -i eth0 ip6 and port 80
Vytvořme si route table tak, že vnitřní provoz (fd00::/32) bude směrován na náš firewall VM na jeho adrese fd00:0:0:3::4. Tuto konfiguraci aplikuji na subnety jump-subnet a front-subnet, takže provoz bude hnán přes moje firewall VM.
az network route-table create -g ipv6-rg -n routing
az network route-table route create -g ipv6-rg \
--route-table-name routing \
-n internalToFirewall \
--next-hop-type VirtualAppliance \
--address-prefix "fd00::/32" \
--next-hop-ip-address "fd00:0:0:3::4"
az network vnet subnet update -n jump-subnet \
--vnet-name ipv6-net \
-g ipv6-rg \
--route-table routing
az network vnet subnet update -n front-subnet \
--vnet-name ipv6-net \
-g ipv6-rg \
--route-table routing
V jiném okně se připojím do jump-vm a přistoupím na web přes jeho vnitřní IPv6 adresu. V druhém okně s tcpdump vidím, že pakety opravdu procházejí přes můj Linux router.
ssh tomas@$jumpipv6
curl [fd00:0:0:2::4]
V porovnání se situací před rokem je podpora IPv6 na skvělé úrovni. Funguje uvnitř VNETu, funguje balancing, packet filtering i směrování. Přesto jsou věci, které v rámci aktuálního preview zatím k dispozici nejsou:
Realisticky vzato naprostá většina zákazníků IPv6 nepotřebuje nebo jim stačí schopnost vystavit na tomto protokolu aplikaci, což je možné řešit s Azure Front Foor nebo Azure Load Balancer. Pokud ale z nějakého důvodu širší podporu IPv6 potřebujete, v rámci preview už je toho hodně k dispozici.