ping6.net
Миграция

IPv6 в AWS, Azure и GCP

Включите IPv6 в вашей облачной инфраструктуре. Практические руководства по настройке для AWS, Azure и Google Cloud Platform.

ping6.net14 декабря 2024 г.7 min read
IPv6AWSAzureGCPоблакоKubernetes

Большинство облачных рабочих нагрузок всё ещё работают только на IPv4. Это становится проблемой.

TL;DR - Краткое резюме

Ключевые моменты:

  • Мобильные сети с приоритетом IPv6: Принуждение к трансляции добавляет задержку для большинства пользователей
  • IPv4-адреса стоят денег в облаке, тогда как IPv6 бесплатен
  • Конфигурация схожа в AWS, Azure и GCP с поддержкой dual-stack
  • Kubernetes-кластеры могут работать dual-stack на всех основных облачных провайдерах

Перейти к: Конфигурация AWS | Конфигурация Azure | Конфигурация GCP | Kubernetes

Зачем включать IPv6 в облаке#

Мобильные сети уже годы работают с приоритетом IPv6. Когда ваши мобильные пользователи обращаются к вашему сервису, они приходят с IPv6-адреса. Работа только на IPv4 означает принудительную трансляцию где-то на пути, добавляя задержку и сложность.

Некоторые провайдеры перешли на IPv6-only сети с NAT64 для устаревших IPv4-сервисов. Если вы недоступны через IPv6, вы добавляете дополнительный шаг трансляции для этих пользователей.

IPv4-адреса теперь стоят денег. Облачные провайдеры берут плату за публичные IPv4-адреса в большинстве регионов. IPv6-адреса бесплатны и изобильны.

Архитектура тоже проще. Нет NAT, нет правил перенаправления портов, нет исчерпания адресов для управления. Каждый экземпляр получает глобально маршрутизируемый адрес.

Конфигурация IPv6 в AWS#

AWS имеет надёжную поддержку IPv6 в большинстве сервисов. Начните с вашего VPC.

Настройка Dual-Stack VPC#

Добавьте IPv6 CIDR-блок к вашему существующему VPC:

aws ec2 associate-vpc-cidr-block \
  --vpc-id vpc-abc123 \
  --amazon-provided-ipv6-cidr-block

AWS назначает блок /56. Свяжите подсети /64 с каждой зоной доступности:

aws ec2 associate-subnet-cidr-block \
  --subnet-id subnet-xyz789 \
  --ipv6-cidr-block 2600:1f13:123:4500::/64

Обновите ваши таблицы маршрутизации. IPv6 нуждается в собственном маршруте к интернет-шлюзу:

aws ec2 create-route \
  --route-table-id rtb-abc123 \
  --destination-ipv6-cidr-block ::/0 \
  --gateway-id igw-xyz789

Адресация IPv6 в EC2#

Существующие экземпляры не получают IPv6 автоматически. Назначьте адреса вручную:

aws ec2 assign-ipv6-addresses \
  --network-interface-id eni-abc123 \
  --ipv6-address-count 1

Новые экземпляры в dual-stack подсетях получают IPv6 автоматически, если вы установите --ipv6-address-count 1 при запуске.

Внутри экземпляра проверьте, что IPv6 настроен. Amazon Linux и Ubuntu обрабатывают это автоматически через cloud-init, но проверьте с помощью ip -6 addr show.

Группы безопасности#

IPv6-трафик использует отдельные правила. Если у вас есть HTTP-правило для 0.0.0.0/0, оно не применится к IPv6. Добавьте ::/0:

aws ec2 authorize-security-group-ingress \
  --group-id sg-abc123 \
  --ip-permissions IpProtocol=tcp,FromPort=443,ToPort=443,Ipv6Ranges='[{CidrIpv6=::/0}]'

Распространённая ошибка: забыть добавить IPv6-правила и удивляться, почему соединения отказывают.

Load Balancers#

Application и Network Load Balancers поддерживают dual-stack. Установите ip-address-type в dualstack:

aws elbv2 set-ip-address-type \
  --load-balancer-arn arn:aws:elasticloadbalancing:... \
  --ip-address-type dualstack

Load balancer автоматически получает как A, так и AAAA записи.

Route 53 DNS#

Создайте AAAA-записи, указывающие на ваши IPv6-адреса:

aws route53 change-resource-record-sets \
  --hosted-zone-id Z1234567890ABC \
  --change-batch file://add-aaaa.json

Route 53 поддерживает IPv6 и для alias-записей, что полезно для load balancers и CloudFront-дистрибутивов.

Egress-Only Internet Gateway#

Если вы хотите, чтобы экземпляры инициировали исходящие IPv6-соединения, но не принимали входящие, используйте egress-only gateway. Это IPv6-эквивалент NAT, но только stateful — нет трансляции адресов.

aws ec2 create-egress-only-internet-gateway \
  --vpc-id vpc-abc123

Обновите таблицу маршрутизации для частных подсетей, чтобы маршрутизировать IPv6-трафик через неё вместо обычного интернет-шлюза.

Конфигурация IPv6 в Azure#

Подход Azure похож, но использует другую терминологию.

Dual-Stack виртуальной сети#

Добавьте адресное пространство IPv6 к вашей VNet. Вы не можете использовать предоставленные Amazon адреса здесь; Azure назначает из своих собственных диапазонов.

az network vnet update \
  --resource-group myResourceGroup \
  --name myVNet \
  --address-prefixes "10.0.0.0/16" "fd00:db8::/56"

Azure использует префиксы fd00::/8 для примеров документации, но вы получите публичные GUA-адреса в production.

Добавьте IPv6 к подсетям:

az network vnet subnet update \
  --resource-group myResourceGroup \
  --vnet-name myVNet \
  --name mySubnet \
  --address-prefixes "10.0.1.0/24" "fd00:db8:1::/64"

Конфигурация IPv6 для VM#

VM нуждаются в конфигурациях сетевого интерфейса как для IPv4, так и для IPv6. Создайте публичный IPv6-адрес:

az network public-ip create \
  --resource-group myResourceGroup \
  --name myPublicIPv6 \
  --version IPv6 \
  --sku Standard

Присоедините его к сетевому интерфейсу:

az network nic ip-config create \
  --resource-group myResourceGroup \
  --nic-name myNIC \
  --name ipv6config \
  --private-ip-address-version IPv6 \
  --vnet-name myVNet \
  --subnet mySubnet \
  --public-ip-address myPublicIPv6

Load Balancer с IPv6#

Azure Load Balancer нуждается в отдельных frontend IP-конфигурациях для IPv4 и IPv6:

az network lb frontend-ip create \
  --resource-group myResourceGroup \
  --lb-name myLoadBalancer \
  --name LoadBalancerFrontEndIPv6 \
  --public-ip-address myPublicIPv6

Настройте backend-пулы, проверки здоровья и правила для обоих стеков. Конфигурация дублируется, что кажется утомительным, но даёт вам полный контроль.

DNS-зоны#

Добавьте AAAA-записи в Azure DNS:

az network dns record-set aaaa add-record \
  --resource-group myResourceGroup \
  --zone-name example.com \
  --record-set-name www \
  --ipv6-address 2001:db8::1

Конфигурация IPv6 в GCP#

Google Cloud медленнее внедрял IPv6, чем AWS и Azure, но поддержка значительно улучшилась.

Конфигурация IPv6 для VPC#

GCP VPC поддерживают dual-stack, но IPv6 всё ещё в preview для некоторых функций. Включите его при создании подсети:

gcloud compute networks subnets create mysubnet \
  --network=myvpc \
  --region=us-central1 \
  --range=10.0.1.0/24 \
  --stack-type=IPV4_IPV6 \
  --ipv6-access-type=EXTERNAL

GCP назначает /64 из своего диапазона 2600:1900::/28.

Экземпляры Compute Engine#

Экземпляры в dual-stack подсетях получают IPv6 автоматически. Проверьте с помощью:

gcloud compute instances describe myinstance \
  --zone=us-central1-a \
  --format="get(networkInterfaces[0].ipv6Address)"

Правила файрвола нуждаются в явных IPv6 CIDR-блоках:

gcloud compute firewall-rules create allow-ipv6-http \
  --network myvpc \
  --allow tcp:80 \
  --source-ranges ::/0

Cloud Load Balancing#

Глобальные load balancers Google поддерживают IPv6. Установите версию IP при создании forwarding rule:

gcloud compute forwarding-rules create ipv6-lb-forwarding-rule \
  --load-balancing-scheme=EXTERNAL \
  --ip-protocol=TCP \
  --ports=443 \
  --address=myipv6address \
  --ip-version=IPV6 \
  --target-https-proxy=mytargetproxy \
  --global

Google автоматически предоставляет anycast IPv6-адрес для глобальных load balancers.

Cloud DNS#

Создайте AAAA-записи:

gcloud dns record-sets create www.example.com \
  --zone=myzone \
  --type=AAAA \
  --ttl=300 \
  --rrdatas=2001:db8::1

Kubernetes и IPv6#

Основные управляемые Kubernetes-сервисы теперь поддерживают dual-stack кластеры.

Dual-Stack кластеры#

EKS, AKS и GKE могут работать в dual-stack. Поды получают как IPv4, так и IPv6 адреса. Включите при создании кластера:

# EKS
eksctl create cluster --name mycluster --ip-family ipv4,ipv6
 
# GKE
gcloud container clusters create mycluster \
  --enable-ip-alias \
  --stack-type=IPV4_IPV6

Сервисы могут предоставлять обе семейства адресов. Установите ipFamilyPolicy: RequireDualStack в вашем манифесте Service.

Адресация IPv6 для подов#

Каждый под получает адреса из обоих семейств. CNI-плагины (VPC CNI, Calico, Cilium) обрабатывают назначение адресов. Проверьте адреса подов:

kubectl get pods -o wide

Приложения внутри подов должны привязываться к :: для прослушивания как IPv4, так и IPv6.

IPv6 сервисов#

Сервисы получают ClusterIP-адреса из обоих семейств. LoadBalancer-сервисы автоматически предоставляют облачные load balancers с dual-stack frontend, если кластер поддерживает это.

Одна загвоздка: не все Ingress-контроллеры поддерживают IPv6 ещё. Проверьте документацию вашего контроллера.

Распространённые проблемы#

Поддержка приложений#

Большинство современных языков и фреймворков поддерживают IPv6, но старые приложения могут не поддерживать. Java-приложениям иногда нужен -Djava.net.preferIPv6Addresses=true для предпочтения IPv6.

Базы данных сложны. MySQL и PostgreSQL поддерживают IPv6, но строки подключения и клиентские библиотеки нуждаются в правильной нотации скобок: psql -h [2001:db8::1] -p 5432.

Пробелы в мониторинге#

Некоторые инструменты мониторинга собирают только IPv4-метрики по умолчанию. CloudWatch, Azure Monitor и Cloud Monitoring поддерживают IPv6, но пользовательские дашборды могут нуждаться в обновлениях.

Сторонние APM-инструменты (Datadog, New Relic) обрабатывают dual-stack, но проверьте, что ваши агенты настроены правильно.

Соображения по стоимости#

IPv6 сам по себе бесплатен, но затраты на egress остаются. Фактически, некоторые облачные провайдеры берут одинаковые тарифы за egress для IPv6 и IPv4, что не даёт экономии затрат — только архитектурные преимущества.

AWS берёт плату за egress-only internet gateways в некоторых регионах. Проверьте страницу цен перед развёртыванием.

Тестирование вашего облачного IPv6#

Не предполагайте, что это работает. Тестируйте из IPv6-only сети.

Временно отключите IPv4 на вашей локальной машине:

# Linux
sudo ip addr del <ваш-ipv4-адрес> dev eth0
 
# macOS
sudo ifconfig en0 inet delete

Попробуйте получить доступ к вашему сервису. Если это не удаётся, у вас проблемы конфигурации.

Используйте онлайн-инструменты, такие как ipv6-test.com, для проверки доступности из разных локаций.

Проверьте распространение DNS с помощью dig AAAA yourdomain.com из нескольких резолверов.

Тестируйте поведение load balancer под dual-stack трафиком. Некоторые load balancers имеют тонкие различия маршрутизации между семействами адресов, которые появляются только под нагрузкой.

Связанные статьи#

Протестируйте ваше облачное развёртывание

Используйте инструмент Ping для проверки IPv6-связности ваших облачных инстансов.

Дополнительные ресурсы#