Каждый сервер, который мы разворачиваем на любой из шести площадок, будь то VPS или выделенный, получает адрес IPv4 и маршрутизируемый блок /64 IPv6. Блок /64 — не функция «для галочки»: около 45% трафика, приходящего на веб-серверы наших клиентов, идёт по IPv6, и сервер без него для почти половины интернета открывается медленнее. В этой статье — о том, как доставляется блок, почему важно, что он «маршрутизируемый», и как на деле пользоваться восемнадцатью квинтиллионами адресов.
Маршрутизируемый блок, а не on-link
Хостер может выдать вам IPv6 двумя способами. Ленивый помещает ваши адреса в тот же L2-сегмент, где живут адреса остальных клиентов, и полагается на обнаружение соседей (neighbour discovery), чтобы их находить; для одного адреса это работает, но ломается, как только вы хотите, чтобы у контейнера или виртуальной машины был собственный. Маршрутизируемый способ даёт серверу небольшой двухточечный линк (point-to-point) и направляет на него весь блок /64. Всё, что находится внутри сервера, — контейнер, виртуальная машина, пир WireGuard, — может взять адрес из блока и быть доступным без какого-либо проксирования и фокусов с NDP.
Наши образы настраивают адрес двухточечного линка и маршрут по умолчанию при первой загрузке. Блок принадлежит вам с первой секунды; ничего включать в панели не нужно.
ip -6 addr show dev eth0 # the first address of your /64 is configured
ip -6 route show default # via the site's gateway, on eth0
cat /etc/netplan/*.yaml # Ubuntu: the block and gateway are here
По одному адресу на сервис
Стоит выработать привычку, противоположную той, что сложилась в IPv4. Вместо одного адреса и отдельного порта для каждого сервиса давайте каждому сервису собственный адрес на порту 443. Добавляйте адреса на интерфейс не стесняясь:
ip -6 addr add 2001:db8:1:411::443:1/64 dev eth0 # web
ip -6 addr add 2001:db8:1:411::25:1/64 dev eth0 # mail
ip -6 addr add 2001:db8:1:411::5432:1/64 dev eth0 # database, firewalled to one client
Закрепите их в netplan (список addresses:) и привяжите каждый демон к его собственному адресу. Обратную зону DNS (rDNS) для любого адреса из вашего блока можно настроить в панели управления на вкладке Сеть сервера — это важно для почты и для всего, что пишет в логи имена хостов.
Контейнеры и виртуальные машины
Поддержка IPv6 в Docker по умолчанию выключена. Включите её, выделив подсеть из вашего блока: /80 даёт каждому контейнеру собственный глобальный адрес и обходится без NAT:
cat > /etc/docker/daemon.json <<'EOF'
{ "ipv6": true, "fixed-cidr-v6": "2001:db8:1:411:d0c::/80", "ip6tables": true }
EOF
systemctl restart docker
docker run --rm alpine ping6 -c1 ipv6.google.com
Поскольку /64 маршрутизируется на сервер, пакеты для /80 приходят на хост, а ядро пересылает их в контейнер; больше ничего настраивать не нужно. То же верно для LXC, гостей libvirt и сети туннеля WireGuard: возьмите часть блока, включите форвардинг — и готово.
Файрвол — как и для IPv4
Каждый адрес из блока доступен глобально — в этом и преимущество, и причина держать правила файрвола симметричными. В ufw правила по умолчанию действуют для обоих семейств адресов (IPV6=yes в /etc/default/ufw); командой ufw status убедитесь, что у каждого правила есть «двойник» (v6). В nftables используйте таблицу inet, чтобы один набор правил покрывал оба протокола. Классическая ошибка — база данных, привязанная к ::, при файрволе, который знает только про IPv4.
DNS и те самые 45%
Для каждого имени хоста добавляйте AAAA-запись рядом с A-записью. Современные клиенты сначала пробуют IPv6 (если подключиться не удалось, примерно через 250 ms начинается «гонка» с резервным IPv4), а мобильные сети в особенности нативно работают по IPv6, тогда как IPv4 в них спрятан за NAT оператора. Сайт с AAAA-записью такие клиенты открывают напрямую; сайт без неё — через транслятор оператора, что добавляет задержку и иногда обрывает долгие соединения. Цифра в 45% — это то, что показывают логи nginx наших клиентов по всему парку серверов; для сайтов с преобладанием мобильного трафика она выше.
Проверяйте снаружи
Зелёная галочка в панели говорит о том, что адрес настроен, а не о том, что он доступен. Проверяйте с машины в другой сети:
ping6 2001:db8:1:411::443:1
curl -6 -sI https://example.com | head -1
dig AAAA example.com +short
Или воспользуйтесь Looking Glass на странице /network/looking-glass: он выполняет ping и traceroute по обоим семействам адресов с каждой из наших площадок. Для публичной проверки подойдут обычные онлайн-сервисы для тестирования IPv6: они показывают, согласуются ли между собой AAAA-запись, доступность и TLS-сертификат.
Больше, чем /64
/64 — наименьший блок, с которым работают все возможности IPv6 (SLAAC требует ровно 64 бита хостовой части), и его хватает на целый парк контейнеров. Если вы запускаете гипервизор или VPN-концентратор, которому нужно раздавать собственные /64, для выделенных серверов по запросу доступен /56: откройте тикет с описанием сценария использования, и блок будет замаршрутизирован в течение суток. Мы не берём плату за адресное пространство: IPv6 создавался с расчётом на изобилие адресов, и назначать за них цену — значит лишать его смысла.
