RE:NODE

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

Как привязать домен к игровому серверу: A, SRV и порты

Игровой сервер живёт по адресу и порту, а домен несёт только адрес. Три способа преодолеть этот разрыв и как доказать, что всё сработало.

Обновлено

0 прочтений

Укажите запись A на адрес, который показывает панель для сервера, дождитесь, пока она разрешится, и дайте игрокам play.example.com вместе с портом. Для почти любой игры это вся работа, и занимает она две минуты. Интересная часть - порт, потому что домен несёт адрес и больше ничего, а лишь немногие игры сами отправляются искать порт.

Есть ровно три способа сделать так, чтобы порт исчез, и один способ жить с ним. Дальше разобраны все четыре, какая игра к какому относится и как проверить результат, прежде чем выкладывать его в Discord.

Разрыв: имя несёт адрес, а игре нужен порт#

Запись A сопоставляет имя адресу IPv4. Запись AAAA делает то же для IPv6. Ни в одной нет поля для номера порта, протокола или пути, и никакие настройки у вашего DNS-провайдера этого не изменят. Так что play.example.com разрешается в 203.0.113.10, а клиент по-прежнему стоит перед машиной с шестьюдесятью тысячами дверей и ждёт, чтобы ему сказали, в какую.

Ваши четыре варианта:

  1. Сказать людям порт. play.example.com:27015. Некрасиво, универсально, работает везде и всё равно намного лучше адреса, который никто не запомнит и который нельзя перевыпустить.
  2. Опубликовать запись `SRV`. Клиент ищет её и узнаёт порт сам. Работает только для игр, клиент которых действительно выполняет этот поиск, а на практике это Minecraft Java и несколько не игровых служб.
  3. Работать на порту, который клиент предполагает. Если игра по умолчанию использует 27015 и вы на 27015, порт никто не набирает. Это самый чистый ответ, когда он доступен.
  4. Поставить перед сервером прокси. Прокси слушает на ожидаемом порту и пересылает на настоящий изнутри. Стандарт для HTTP и доступно для Minecraft через прокси вроде Velocity. Для большинства UDP-игр недоступно.
порт не вводилитолько Minecraft Javaпорт по умолчаниюпорт из записипересылка изнутриИгроквводит имяDNS-запросA или AAAASRV-запроспорт внутриПроксислушает порт по умолчаниюИгровой сервер203.0.113.10:25571
Три пути от введённого имени к работающему серверу

Как найти адрес, на который указывать#

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

Три ловушки на этом шаге:

  • Адрес панели - это не адрес сервера. panel.renode.space - сайт. Это не то место, где слушает ваш игровой сервер, и запись на него ничего не даёт.
  • Общий адрес - это нормально. Несколько серверов могут стоять за одним адресом на разных портах. Поэтому порт и важен, и поэтому нельзя считать, что порт по умолчанию свободен. Два случая, когда выделенный адрес перестаёт быть необязательным, - когда вас вносят в белый список чужие и когда нужен порт по умолчанию, который нельзя делить, - описаны в статье статический адрес и когда он нужен.
  • Порт запросов - не игровой порт. Большинство игр выделяют минимум два. Игроки подключаются к игровому порту; браузеры серверов обращаются к порту запросов. Порт запросов в записи даёт имя, которое разрешается, и подключение, которое никогда не завершается. Полная классификация - в статье порты игровых серверов простыми словами.

RE:NODE не продаёт домены и не ведёт DNS, поэтому сама запись создаётся там, где живёт ваша зона: у регистратора, в Cloudflare или у того, на кого указывают ваши неймсерверы. Ответ на этот вопрос окончательно даёт dig +short NS example.com, а правка записей в панели, которая не авторитетна, - популярный способ потратить впустую день.

Запись A, которая работает всегда#

Это вариант, к которому стоит обращаться, если нет особой причины поступить иначе.

  1. В редакторе вашего DNS-провайдера создайте запись A.
  2. Имя: play, если форма принимает метку, play.example.com, если нужно полное имя. Посмотрите на существующую запись, чтобы понять, какая форма используется.
  3. Значение: адрес IPv4 со страницы сервера.
  4. TTL: 300, пока вы настраиваете, 3600, когда всё устоялось.
  5. Сохраните и разрешите имя снаружи вашей сети, прежде чем кому-то говорить.
The record, in BIND zone format
play    300  IN  A     203.0.113.10node    300  IN  AAAA  2001:db8::10

Если у вашего провайдера есть функция HTTP-прокси - оранжевое облачко Cloudflare встречают чаще всего, - для этой записи её надо выключить. Такой прокси завершает HTTP и HTTPS. Игровой протокол - ни то ни другое, так что проксированная запись отдаёт игрокам адрес из сети прокси, которая никогда не примет игровое подключение. Запись должна быть только DNS, серое облачко. Что именно оранжевое облачко пропустит, а что нет, изложено в статье Cloudflare для сайтов и игровых серверов.

Когда серверов становится больше одного, перестаньте указывать имена служб прямо на адреса. Положите адрес в имя машины и указывайте имена служб на него через CNAME, чтобы переезд был одной правкой, а не девятью; этот приём разобран полностью в статье поддомены для серверов.

Записи SRV и игры, которые их читают#

Запись SRV несёт хост и порт вместе, так что клиенту, который её запрашивает, порт от игрока не нужен. Загвоздка в том, что клиент должен спросить, а почти никто этого не делает.

Minecraft Java делает. Когда игрок вводит имя хоста без порта, клиент сначала запрашивает _minecraft._tcp.<hostname>, и если запись пришла, берёт из неё цель и порт. Если ничего не пришло, он возвращается к обычному запросу A и предполагает 25565.

Two records, not one
_minecraft._tcp.play  300  IN  SRV  0 5 25571 node.example.com.node                  300  IN  A          203.0.113.10

Вторую запись забывают чаще всего. Ничто в записи SRV не является адресом: цель - имя хоста, и этому имени нужна собственная запись A. IP-адрес, введённый в поле цели, недопустим и молча не работает. Каждое поле, три формы, в которых бывают формы у регистраторов, и команды dig, которые всё доказывают, разобраны в статье SRV-записи для Minecraft.

За пределами Minecraft Java считайте SRV недоступной, пока не проверили. Minecraft Bedrock такой запрос не выполняет. Игры на движках Source и GoldSrc - тоже. Valheim, Palworld, Rust, Terraria и весь остальной каталог выживалок - тоже. Заметное исключение - голосовые серверы: TeamSpeak 3 использует _ts3._udp, а Mumble - _mumble._tcp, и это стоит знать, потому что нередко это вторая половина DNS сообщества.

Порты по умолчанию и прокси, убирающие порт#

Если порт может быть портом по умолчанию, сделайте его таким и дальше не читайте. Игрок, который вводит play.example.com и ничего больше, - лучший доступный исход, а для игры на её стандартном порту его даёт одна запись A.

ИграИгровой порт по умолчаниюПротокол
Minecraft Java25565TCP
Minecraft Bedrock19132UDP
Игры на Source и GoldSrc27015UDP
Valheim2456UDP
Palworld8211UDP
FiveM30120TCP и UDP
Project Zomboid16261UDP
7 Days to Die26900TCP и UDP
Terraria7777TCP
Factorio34197UDP
Arma 3 и DayZ2302UDP
Don't Starve Together10999UDP

В некоторых играх порты сдвигаются между версиями, поэтому сверяйтесь с портом, к которому ваш сервер действительно привязался, - его печатает консоль при запуске.

Путь через прокси уже, чем ожидают. Обратный прокси работает, понимая протокол достаточно хорошо, чтобы прочитать запрошенное имя хоста и по нему маршрутизировать, поэтому для HTTP он стандартен, а в остальных случаях редок; последовательность объясняется в статье что делает обратный прокси. У Minecraft есть аналог в виде Velocity и BungeeCord: они слушают 25565 и пересылают игроков на бэкенды на внутренних портах и даже могут маршрутизировать по введённому игроком имени, так что creative.example.com и play.example.com попадают на разные серверы за одним публичным портом. Такая сборка описана в статье сеть прокси Velocity для Minecraft. Для UDP-шутера или выживалки нет аналога, на который можно полагаться, а универсальный пересыльщик TCP или UDP добавляет переход и точку отказа, чтобы сэкономить двоеточие.

В игровых тарифах RE:NODE слота для прокси нет, и это сознательно: HTTP-прокси нечего делать с игровым потоком. В тарифы для приложений и сайтов он входит, потому что HTTP - именно то место, где он оправдывает себя.

Что принимает клиент каждой игры#

Запись полезна, только если клиент примет имя в поле. Большинство примет, а те, что отказываются, имеют консольную команду, которая примет.

КлиентКуда вводить имяПримечания
Minecraft JavaAdd Server, поле адресаПорт не указывайте, чтобы использовалась запись SRV
Minecraft BedrockАдрес и порт в двух поляхПоиска SRV нет. Выдавайте оба значения
Source и GoldSrcconnect play.example.com:27015Консоль, с включённой консолью разработчика
Браузер серверов SteamFavourites, Add a ServerВ большинстве игр имя принимается; если отказывает, используйте консоль
ValheimJoin Game, Add Serverplay.example.com:2456, игровой порт, а не порт запросов
FiveMconnect play.example.com:30120Консоль F8
Игры-выживалки в целомДиалог Direct ConnectПопробуйте имя; для локализации проблемы вернитесь к адресу

Если клиент отвергает имя, которое везде разрешается верно, дело в клиенте, а не в вашем DNS. Дайте таким игрокам адрес и порт и идите дальше: имя всё равно окупается для всех остальных и на случай переезда.

Кроссплей осложняет это ещё сильнее. Игрок Bedrock, заходящий на сервер Java через Geyser, подключается к другому порту по UDP, поэтому ему нужна своя пара адрес-порт, какой бы ни была сторона Java; две «входные двери» описаны в статье Geyser и кроссплей с Bedrock.

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

У неудачного входа слишком много возможных причин, чтобы он считался тестом. Разделите DNS, сеть и игру, именно в таком порядке.

bash
$ dig +short A play.example.com @1.1.1.1203.0.113.10$ dig +short SRV _minecraft._tcp.play.example.com @1.1.1.10 5 25571 node.example.com.$ nc -vz play.example.com 25571Connection to play.example.com 25571 port [tcp/*] succeeded!

Имя резолвера важно. Явный запрос к 1.1.1.1 или 8.8.8.8 обходит всё, что закэшировали ваш роутер и провайдер, и так вы отличаете «не опубликовано» от «не распространилось». В Windows nslookup play.example.com 1.1.1.1 и Test-NetConnection play.example.com -Port 25571 делают те же две работы.

Для UDP-игры нет рукопожатия, которое мог бы завершить nc, так что проверка порта в полезной форме не существует. Убедитесь, что сервер привязался там, где вы думаете, прочитав консоль при запуске - там об этом сказано, - а затем сделайте единственный тест, который считается: зайдите по имени с машины не из вашей сети. Телефон на мобильном интернете - самый быстрый способ доказать, что путь работает для кого-то, кроме вас.

Чего домен для вас не сделает#

Он не скрывает ваш адрес. Любой разрешит имя за две секунды. Домен - слой удобства, а не защита. Между потоком и вашим сервером стоит фильтрация выше по цепочке, и даже она отбрасывает только очевидный объёмный трафик; честная версия - в статье что мы делаем с атаками.

Он не снижает задержку. Пакеты идут тем же путём, что и раньше. Единственное сетевое число, которое меняет имя, - разовый запрос при подключении.

Он не переживает клиента, закэшировавшего адрес. Некоторые клиенты разрешают имя один раз при подключении и держат результат всю сессию, а список избранного Steam в особенности запоминает то, что нашёл. После переезда просите людей удалить и заново добавить запись, а не разбираться, почему кто-то один по-прежнему попадает на старую машину.

Он не чинит закрытый порт. Идеальная запись, указывающая на порт, где никто не слушает, с точки зрения клиента выглядит так же, как сломанная запись. Если имя разрешается, а вход не удаётся, проблема ушла из DNS.

Переезд сервера и что при этом ломается#

Смысл использовать имя - именно в переезде, так что делайте его как следует.

  1. За день снизьте TTL записи - и цели SRV, если она есть, - до 300.
  2. Дождитесь полного истечения прежнего TTL, чтобы каждый кэш подхватил короткое значение.
  3. Перенесите мир или данные, запустите новый сервер и убедитесь, что он работает по адресу.
  4. Измените запись. Одна строка.
  5. Оставьте старый сервер работать на несколько часов. Игроки в середине сессии ничего не разрешают заново, а устаревшие кэши продолжают приходить.
  6. Следите за консолью старого сервера. Когда час никто не подключался, всё.
  7. Верните TTL обратно.

Остальное, включая то, что данные переезжают до DNS, а не после, описано в статье как переехать, не потеряв игроков.

Три вещи обычно ломаются при переключении. Старая запись всё ещё в кэше роутера у игрока, и он настаивает, что сервер лежит, - пусть попробует адрес напрямую. У нового сервера в файрволе открыт игровой порт, но не порт запросов, поэтому он работает и никогда не попадает в список. И у кого-то в ярлыке зашит IP с тех времён, когда у вас не было домена, - это и есть проблема, ради завершения которой домен покупали.

FAQ#

Можно ли избавиться от порта, чтобы игроки вводили только мой домен?

Только в трёх случаях: игра - Minecraft Java и вы публикуете запись SRV, сервер работает на порту игры по умолчанию либо на порту по умолчанию для вас слушает прокси, понимающий протокол. В остальных случаях play.example.com:27015 - верный ответ, и он всё равно лучше голого адреса.

Нужно ли покупать домен у хостера?

Нет, и обычно это невозможно. Домен покупают у регистратора, а его записи живут там, куда указывают его неймсерверы. Хостинг и DNS - отдельные службы, которые встречаются только в значении одной записи. RE:NODE не продаёт домены и не хостит DNS.

Почему имя работает у меня, но не у друзей?

Почти всегда кэширование. У вашего резолвера новый ответ, а у их - старый, до конца прежнего TTL. Проверьте имя через 1.1.1.1, чтобы увидеть опубликованную правду, и убедитесь, что ни у кого не сохранён адрес со старым портом.

Использовать A или CNAME для игрового сервера?

Запись A подходит и короче на один запрос. CNAME, указывающий на имя машины, лучше, когда серверов больше одного, потому что перенос машины становится одной правкой. Не ставьте CNAME на apex домена - это не разрешено.

Даёт ли привязка домена к серверу сертификат?

Не для игрового сервера, и ему он не нужен: игровые протоколы не используют HTTPS. Сертификаты важны для веб-серверов и серверов приложений, доступных по HTTPS, где слот прокси выпускает и продлевает его для вас, как только имя разрешается.


Комментарии

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

0/2000