IPv6 в AWS, Azure и GCP
Включите IPv6 в вашей облачной инфраструктуре. Практические руководства по настройке для AWS, Azure и Google Cloud Platform.
Большинство облачных рабочих нагрузок всё ещё работают только на 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-blockAWS назначает блок /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 dualstackLoad balancer автоматически получает как A, так и AAAA записи.
Route 53 DNS#
Создайте AAAA-записи, указывающие на ваши IPv6-адреса:
aws route53 change-resource-record-sets \
--hosted-zone-id Z1234567890ABC \
--change-batch file://add-aaaa.jsonRoute 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 myPublicIPv6Load 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=EXTERNALGCP назначает /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 ::/0Cloud 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 \
--globalGoogle автоматически предоставляет anycast IPv6-адрес для глобальных load balancers.
Cloud DNS#
Создайте AAAA-записи:
gcloud dns record-sets create www.example.com \
--zone=myzone \
--type=AAAA \
--ttl=300 \
--rrdatas=2001:db8::1Kubernetes и 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 имеют тонкие различия маршрутизации между семействами адресов, которые появляются только под нагрузкой.
Связанные статьи#
- Стратегии миграции IPv6 — Изучите лучшие практики миграции существующей инфраструктуры на IPv6
- Лучшие практики IPv6 — Комплексное руководство по развёртыванию production-ready IPv6-инфраструктуры
Протестируйте ваше облачное развёртывание
Используйте инструмент Ping для проверки IPv6-связности ваших облачных инстансов.