/64 на каждом сервере: наш IPv6 и как им пользоваться

Маршрутизируемый блок, а не on-link: почему это важно для контейнеров, как выдать каждому сервису собственный адрес и как проверить, что всё действительно работает.

СкСетевая команда CheapServАвтор 6 мин чтения
Каскад светящихся блоков адресов
На этой странице7
  1. Маршрутизируемый блок, а не on-link
  2. По одному адресу на сервис
  3. Контейнеры и виртуальные машины
  4. Файрвол — как и для IPv4
  5. DNS и те самые 45%
  6. Проверяйте снаружи
  7. Больше, чем /64

Каждый сервер, который мы разворачиваем на любой из шести площадок, будь то VPS или выделенный, получает адрес IPv4 и маршрутизируемый блок /64 IPv6. Блок /64 — не функция «для галочки»: около 45% трафика, приходящего на веб-серверы наших клиентов, идёт по IPv6, и сервер без него для почти половины интернета открывается медленнее. В этой статье — о том, как доставляется блок, почему важно, что он «маршрутизируемый», и как на деле пользоваться восемнадцатью квинтиллионами адресов.

Хостер может выдать вам 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 создавался с расчётом на изобилие адресов, и назначать за них цену — значит лишать его смысла.

Ск
Сетевая команда CheapServ

Отвечает за магистральную сеть, набор транзитных операторов и защиту от DDoS во всех шести локациях.

Разверните первый сервер меньше чем за минуту.

Пополните баланс от $25 в BTC, ETH, XMR или USDT. Баланс не сгорает, а неиспользованные средства можно вернуть.

Создать аккаунт