IPv6 v Azure

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í:

  • Testujete IPv6 nebo se ho potřebujete naučit
  • Potřebujete stroj s IPv6 pro testování vašich webů mimo Azure podporujících IPv6 ať už z důvodu funkčních testů nebo kontrolu zabezpečení
  • Jste ze státní správy, která občas dle zákonných předpisů musí být na IPv6 minimálně připravena nebo ho dokonce plně podporovat

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]

Jaká jsou zatím omezení IPv6

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:

  • IPv6 zatím nepodporuje VNET peering, takže některé složité enterprise topologie nejsou možné.
  • Některá nastavení zatím není možné dělat z portálu.
  • Azure Monitor komponenta Network Watcher už podporuje NSG flow logy a packet tracing s IPv6, ale některé vlastnosti mohou chybět, třeba Connection Monitor.
  • Integrace PaaS služeb přes IPv6 jako je Service Endpoint nebo PaaS firewall v době psaní článku není dostupná. Nicméně nevidím úplně důvod to mít, tady stačí dual-stack a komunikovat s PaaS po IPv4.
  • Centralizovaný Azure Firewall nebo Azure Application Gateway zatím nepodporují IPv6 pravidla a endpointy, nicméně podle všeho je to v plánu.
  • Napojení na on-premises zatím nativními Azure prostředky možné není. Podpora IPv6 pro Azure VPN a Express Route private okruhy se plánuje. Nicméně protože je plná podpora IPv6 ve VNETu, můžete dnes tohle řešit použitím firewall appliance třetí strany.

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.



Privátní napojení vaší vlastní služby v SaaS stylu s Azure Private Link Service Networking
Privátní napojení PaaS služeb do VNETu s Azure Private Link Networking
Automatické získávání IP range PaaS služeb v Azure přes API Networking
Kubernetes praticky: vystavování aplikací s Ingress a Azure App Gateway (WAF) Networking
Testování síťového výkonu v Azure Networking