RE:NODE

Сеть12 мин чтения

IPv6 и игровые серверы: где он помогает, а где кусается

Поддержка неравномерна у игр, лаунчеров и инструментов. Что работает по IPv6, что молча не работает и почему сегодня разумен только dual-stack.

Обновлено

1 прочтений

Запускайте оба стека или оставайтесь на IPv4. Сервер, доступный только по IPv6, недоступен для значительной части игроков, которые так и не поймут почему, а сервер с записью AAAA и ничем за ней хуже, чем сервер без AAAA вообще, потому что превращает «не могу подключиться» в «подключается иногда, у некоторых, из некоторых сетей».

Это вся рекомендация. Дальше подробности: что IPv6 меняет на самом деле, какие части игровой индустрии уже подтянулись, три ошибки конфигурации, которые дают плавающие сбои, и несколько ситуаций, где IPv6 не просто желателен, а обязателен.

Что IPv6 меняет, а что нет#

IPv6 - тот же интернет с более длинным полем адреса. Маршрутизация, TCP, UDP, DNS и все игровые протоколы поверх них работают одинаково. Что меняется, стоит знать точно, потому что половина фольклора вокруг него неверна.

  • Адреса имеют 128 бит вместо 32. Дефицит закончился. Одному домашнему подключению обычно делегируют /56 или /48, а это больше адресов, чем во всём интернете IPv4.
  • NAT, как правило, нет. Каждое устройство получает глобально маршрутизируемый адрес, а значит, между ним и интернетом стоит только файрвол. В IPv4 эту работу случайно выполнял NAT домашнего роутера. В IPv6 её случайно не выполняет ничто.
  • ARP исчез, его заменило Neighbour Discovery, работающее поверх ICMPv6. Поэтому блокировка ICMPv6 ломает то, чего блокировка ICMP в IPv4 никогда не ломала.
  • Маршрутизаторы не фрагментируют. В IPv4 промежуточный маршрутизатор мог разрезать слишком большой пакет. В IPv6 он отправляет обратно сообщение Packet Too Big, и от отправителя ждут реакции. Если это сообщение отфильтровано, большие пакеты исчезают, а маленькие нет.
  • Минимальный MTU - 1280 байт, против 576 в IPv4.

Что не меняется: задержка, пропускная способность, джиттер и расстояние до ваших игроков. Пакеты IPv6 идут по тому же оптическому волокну с той же скоростью. Если кто-то говорит, что IPv6 быстрее, он описывает путь, который оказался лучше по пирингу, а не свойство протокола. Три числа, которые на самом деле определяют ощущения от игры, разобраны в статье задержка, джиттер и потеря пакетов.

Как читать и вводить адрес IPv6#

Восемь групп по четыре шестнадцатеричные цифры, разделённые двоеточиями, и два сокращения: ведущие нули в группе можно опускать, а одну серию нулевых групп можно заменить на ::, один раз на адрес.

code
2001:0db8:0000:0000:0000:0000:0000:0010   full form2001:db8::10                              the same address, written sanely

Префиксы, которые вам действительно встретятся:

ПрефиксЧто этоГде встречается
2000::/3Глобальный unicastНастоящие маршрутизируемые адреса
2001:db8::/32Только для документацииПримеры, включая эту статью
fe80::/10Link-localНастраивается автоматически на каждом интерфейсе
fc00::/7Unique localЧастные диапазоны, грубый аналог 10.0.0.0/8
ff00::/8MulticastЗаменяет broadcast, которого в IPv6 нет
::ffff:0:0/96IPv4-mappedАдрес IPv4, который видит сокет dual-stack

Деталь синтаксиса, ломающая файлы конфигурации: когда адрес стоит рядом с портом, его заключают в квадратные скобки. [2001:db8::10]:25565 - это сервер, а 2001:db8::10:25565 - совсем другой адрес и, скорее всего, опечатка, на которую вы будете смотреть десять минут. То же правило скобок действует в URL, в большинстве директив bind и в строках подключения.

И ещё: /64 - стандартный размер одного сегмента сети. Всё, с чего подключается клиент, обычно живёт внутри одного /64, и этот факт определяет весь раздел про баны и журналы ниже.

Какая сторона реально поддерживает#

Поддержка - это не один вопрос, а четыре: слушает ли серверный бинарник IPv6, набирает ли его клиент, принимает ли его мастер-сервер или подбор игроков, понимают ли его ваши инструменты. Все четыре ответа должны быть «да», а сбои молчаливы.

КомпонентПоложение дел
Сервер и клиент Minecraft JavaРаботает. Netty привязывается к обоим стекам, если этому не мешает флаг JVM
Выделенный сервер Minecraft BedrockЕсть отдельный server-portv6 в server.properties, по умолчанию 19133
Игры на движках Source и GoldSrcНа практике IPv4. Не планируйте сервер Source только на IPv6
Большинство серверов выживания на Unity и UnrealРазработчики не тестировали. Считайте, что это IPv4, пока не докажете обратное
Браузер серверов Steam и избранноеПостроены вокруг адресации IPv4
Веб, API и службы баз данныхПолностью в порядке. Здесь IPv6 скучен и работает
Мониторинг, проверки доступности, боты статусаОчень по-разному. Многие проверяют только записи A

Случай Minecraft Java содержит одну конкретную ловушку. Сокет, привязанный к ::, на Linux принимает и подключения IPv4, потому что sysctl net.ipv6.bindv6only по умолчанию равен 0, а клиенты IPv4 приходят как адреса IPv4-mapped. Но JVM, запущенная с -Djava.net.preferIPv4Stack=true, вообще не создаёт сокеты IPv6, так что сервер работает только по IPv4, что бы ни делала остальная машина. Этот флаг встречается во множестве скопированных стартовых скриптов. Если вы запускаетесь со списком флагов, который писали не вы, проверьте его, прежде чем заключать, что игра не поддерживает IPv6.

Dual-stack по-настоящему: привязка, запись, файрвол#

Одновременно должны выполняться три условия, а обычно делают одно или два.

  1. Служба слушает IPv6. Проверяйте через ss, а не надеждой. Адрес 0.0.0.0:25565 - только IPv4. [::]:25565 - оба, на стандартном ядре Linux.
  2. DNS его публикует. Запись AAAA для того же имени, где стоит запись A. Типы записей разобраны в статье DNS-записи простыми словами, а как хранить адрес в одном месте, чтобы добавление второй записи не означало вторую вещь, о которой можно забыть, рассказано в статье поддомены для серверов.
  3. Файрвол это разрешает. Правила IPv6 - отдельный набор правил в iptables и ip6tables, и классический итог - служба, которая прекрасно работает по IPv4 и молча отбрасывается по IPv6.
bash
$ ss -ltnp | grep 25565LISTEN 0 128 *:25565 *:*$ dig +short AAAA play.example.com @1.1.1.12001:db8::10$ ip6tables -L INPUT -n --line-numbers

В ufw обработкой IPv6 управляет одна строка в /etc/default/ufw, и добавленное вами правило применяется к обоим стекам, только когда она включена:

/etc/default/ufw
IPV6=yes

Если вы используете nftables, семейство inet покрывает оба протокола одним набором правил, что убирает всю эту категорию ошибок. Полный набор правил в обоих синтаксисах есть в статье правила файрвола, которые действительно важны, а более подробный разбор самого инструмента - в руководстве по ufw.

Контейнеры - ещё один частый пробел. Docker исторически поставлялся с выключенным IPv6, поэтому контейнер с опубликованным портом отвечает по IPv4, но не по IPv6, даже если хост полностью dual-stack. Включение означает "ipv6": true и fixed-cidr-v6 в /etc/docker/daemon.json, а также перезапуск демона; окружающая настройка описана в статье Docker на VDS.

asks for bothpicks AAAA firstdropped if no v6 ruleIPv4 only if bound to 0.0.0.0Игроксеть IPv6DNSA и AAAAФайрволотдельные v6-правилаСокет сервера:: или 0.0.0.0Игровой сервер
Где может сломаться dual-stack подключение

ICMPv6 и MTU: сбой, который выглядит как потеря пакетов#

Этот тратит дни. В IPv4 можно заблокировать весь ICMP, раздражить сетевых инженеров и в основном сойти с рук. В IPv6 нельзя, потому что протокол от него зависит.

Neighbour Discovery, находящий канальный адрес следующего узла, - это ICMPv6. Router Advertisement, благодаря которым большинство хостов вообще получает адрес, - это ICMPv6. А Packet Too Big, тип 2, - это то, как отправитель узнаёт, что нужно уменьшить размер пакета, потому что ни один маршрутизатор IPv6 не станет фрагментировать за него.

Заблокируйте ICMPv6 типа 2 в любом месте пути, и получите очень характерный симптом: маленькие пакеты проходят, рукопожатия завершаются, соединение устанавливается, а затем всё, для чего нужен полноразмерный пакет, исчезает. Игра подключится и зависнет на первом же большом обновлении состояния. Веб-страница вернёт заголовки и повиснет на теле. Выглядит это в точности как потеря пакетов, но ею не является: см. раздел об отделении потерь от других проблем в статье задержка, джиттер и потеря пакетов, потому что диагностика та же, а лечение нет.

Правило, которое стоит запомнить, простое: разрешайте входящий ICMPv6, при желании с ограничением частоты, и никогда не отбрасывайте его целиком. Туннелированные подключения IPv6, которые некоторые домашние провайдеры всё ещё выдают, уменьшают полезный MTU ниже 1500 и делают этот сбой гораздо вероятнее как раз для тех игроков, которым труднее всего его диагностировать.

Баны, белые списки и журналы: правило /64#

Бан IPv4 попадает на один адрес и обычно на одно домохозяйство. Бан IPv6 на одном /128 попадает на один адрес, который клиент вполне может сменить в течение часа, потому что расширения приватности по замыслу дают хостам временные адреса внутри их собственного префикса.

Практическое правило: единица идентичности в IPv6 - это /64, а не адрес.

  • Банить `/64`. 2001:db8:1234:5678::/64 - так выглядит одно клиентское подключение. Бан 2001:db8:1234:5678::a1b2 банит один идентификатор интерфейса, пока он не сменится.
  • Вносить в белый список тоже `/64`, иначе администратор, которого вы утром впустили, после обеда станет посторонним.
  • Журналировать префикс. Хранение полных адресов и группировка по ним даёт бесполезную статистику; группируйте по первым 64 битам.
  • Проверьте, что ваши инструменты вообще принимают префикс. Удивительно много систем банов, написанных для IPv4, принимают только чистый адрес, а значит, баны IPv6 не работают, и месяцами никто этого не замечает.
  • Не укрупняйте выше `/64` без нужды. /48 может быть целым регионом провайдера, а /32 - часто целым провайдером.

То же относится и к ограничению частоты, которое и есть настоящая защита от злоупотреблений на уровне приложения: считать по адресам бессмысленно, когда у атакующего 18 квинтиллионов их в одной подсети. Форму работающих ограничений описывает статья ограничения частоты и злоупотребления, а что мы делаем с атаками честно говорит, какие части проблемы фильтрация решает, а какие нет.

Проверка и что значит «работает»#

Проверка с машины dual-stack почти ничего не доказывает, потому что она тихо откатывается на IPv4, как только IPv6 не срабатывает. Большинство клиентов пробуют оба и предпочитают IPv6 с небольшой форой, поэтому сломанный путь IPv6 проявляется долей секунды задержки, а не ошибкой. Для пользователей это превосходно, для проверки ужасно.

Принудительно выберите протокол:

bash
$ ping6 play.example.com$ curl -6 -sI https://api.example.com$ mtr -6 play.example.com$ dig AAAA play.example.com @2606:4700:4700::1111

Для игры единственная настоящая проверка - клиент в сети с поддержкой IPv6 при отключённом IPv4 либо мобильное подключение у оператора, работающего только на IPv6 с NAT64. Если этот клиент подключается и остаётся подключённым через смену карты и большую синхронизацию состояния, путь работает. Если подключается и зависает, вернитесь и перечитайте раздел про ICMPv6.

Есть ещё одна проверка, которая ловит очень частый сбой: сертификаты. Если у имени есть запись AAAA, валидатор удостоверяющего центра может попробовать адрес IPv6, а запись, указывающая на адрес, по которому ничего не слушает, - классическая причина неудачного выпуска для имени, которое по IPv4 выглядит идеально настроенным. Если сертификат не выпускается, а запись A верна, проверьте запись AAAA; остальной путь выпуска описан в статье привязка домена к серверу.

Где IPv6 действительно оправдывает себя#

Большая часть этой статьи - предупреждения, так что вот другая сторона. Есть три ситуации, где IPv6 - лучший ответ, и одна, где единственный.

Хостинг из дома за CGNAT. Если провайдер ставит вас за NAT операторского уровня, у вас нет публичного адреса IPv4, на который можно пробросить порт, и никакая настройка роутера его не создаст. Многие из таких же подключений выдают настоящий маршрутизируемый префикс IPv6. Домашний сервер только на IPv6 не годится для широкой аудитории, но это реальный вариант для закрытой группы, у которой у всех есть IPv6. Как это соотносится с другими затратами на сервер на вашей собственной линии, разобрано в статье свой игровой сервер дома или аренда.

Внесение в белый список на чужой стороне. Если API, платёжному провайдеру или корпоративному файрволу нужно разрешить ваш сервер, IPv6 даёт стабильный префикс без дефицитных цен, которые сопровождают адреса IPv4. Более общий вопрос о том, когда выделенный адрес стоит своих денег, рассматривается в статье статический адрес и нужен ли он вам.

Всё, что является обычным HTTP или подключением к базе данных. Веб, API и трафик баз данных по IPv6 ничем не примечательны уже годы. Если ваше приложение обращается к службе, публикующей записи AAAA, оно, вероятно, уже использует IPv6, а вы этого не замечали. Это и есть целевое состояние.

Доступ к игрокам в мобильных сетях только на IPv6. Некоторые операторы работают только на IPv6, а на границе транслируют через NAT64. Такие игроки достигают серверов IPv4 через транслятор, что работает для TCP и большей части UDP и добавляет один переход плюс таблицу состояний трансляции, которая иногда сбрасывает простаивающие сессии. Публикация записи AAAA убирает транслятор с пути именно для этих игроков.

На RE:NODE каждый сервер публикуется с адресом IPv4 и портом, и именно они идут в ваши записи DNS. IPv6 мы стандартной возможностью не объявляем, так что если ваш проект действительно от него зависит, спросите до того, как строить на нём проект, а не после. Поддержка - это тикет из панели или Discord, и ответ будет прямым «да» или «нет», а не «возможно».

FAQ#

Стоит ли публиковать запись AAAA для игрового сервера?

Только если вы сами подключались к серверу по IPv6 с отключённым IPv4 на клиенте. Запись AAAA, за которой ничего не слушает, вызывает плавающие сбои именно у игроков, чьи сети предпочитают IPv6, и об этих сбоях очень трудно внятно сообщить.

Можно ли запустить игровой сервер только на IPv6?

Технически для некоторых игр, практически ни для одной с публичной аудиторией. У заметной части игроков IPv6 нет вообще, на их роутерах он выключен или их игровой клиент им не пользуется. Реальных выбора два: dual-stack или только IPv4.

Делает ли IPv6 мой сервер быстрее?

Нет. Это тот же путь с той же скоростью. Единственная измеримая разница проявляется при установке соединения, и только для клиентов, которые иначе шли бы через шлюз NAT64 оператора.

Как правильно забанить игрока по IPv6?

Баньте /64, а не отдельный адрес. Клиенты по замыслу меняют последние 64 бита своего адреса, поэтому бан на /128 истекает сам. Сначала проверьте, что ваши средства банов вообще принимают префикс, потому что многие, написанные для IPv4, этого не делают.

Почему сервер работает по IPv4, но не по IPv6?

Три обычные причины по порядку: процесс привязан к 0.0.0.0, а не к ::, в наборе правил файрвола IPv6 нет правила, которое вы добавили для IPv4, или в среде выполнения контейнеров IPv6 отключён. На первое ss -ltnp отвечает одной строкой.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000