RE:NODE

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

Порты игровых серверов: query-порт, RCON и файрвол

Все порты, которые использует игровой сервер, зачем нужен query-порт, почему работающий сервер не виден в браузере серверов и как проверить порт снаружи.

Обновлено

1 прочтений

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

Три вида портов#

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

  • Игровой порт. То, к чему подключается клиент, когда игрок вводит адрес. Он всегда выделен, всегда опубликован, и если он закрыт, никто не зайдёт. Это число, которое попадает в строку подключения или в SRV-запись.
  • Query-порт. То, у чего браузеры серверов, сайты-каталоги и мониторинговые боты спрашивают имя хоста, карту, число игроков и слоты. Он отвечает крошечным ответом на крошечный запрос и не имеет никакого отношения к самой игре. Если он закрыт, сервер работает прекрасно и остаётся невидимым.
  • Административные порты. RCON, SourceTV или GOTV, веб-панель администратора, консоль telnet, REST API. Каждый из них необязателен, каждый - это способ попасть на ваш сервер, и ни один не должен быть открыт всему миру без веской причины.

Query-порт вообще существует потому, что игровой протокол занят делом. Браузер серверов со списком в две тысячи позиций не может позволить себе начинать настоящую игровую сессию с каждым сервером только ради того, чтобы прочитать число игроков. Поэтому сервер говорит ещё и на дешёвом побочном протоколе без состояния: это протокол запросов Steam A2S для большинства игр на Source и игр из каталога Steam, собственные query и server-list-ping у Minecraft, собственная HTTP-точка игры у FiveM. Один UDP-пакет туда, один пакет обратно, никакого рукопожатия.

Иногда оба порта - одно и то же число. Counter-Strike 2, Team Fortress 2 и Garry's Mod отвечают и на игровой трафик, и на запросы A2S на 27015/udp, поэтому у этих игр так редко бывает проблема невидимого сервера. Иногда порты соседние: Valheim использует 2456 и 2457, и query-порт всегда равен игровому плюс один. Иногда это несвязанные числа из разных диапазонов: Palworld запускает игру на 8211/udp, а query - на 27015/udp. А порой всё наоборот, чем можно предположить: настройка Port в Unturned - это query-порт, а игра работает на Port + 1.

Порты по играм#

Это значения по умолчанию. Почти все они настраиваются, а в панели выделенный номер показан на странице сервера - при составлении строки подключения копируйте его оттуда, а не из этой таблицы.

ИграИгровой портQuery-портПрочее
Minecraft (Java)25565 TCP25565 UDP (необязательно)25575 TCP RCON
Minecraft (Bedrock / Geyser)19132 UDPтот же порт-
Counter-Strike 227015 UDP27015 UDP27015 TCP RCON, 27020 UDP GOTV
Counter-Strike 1.627015 UDP27015 UDPRCON по UDP на 27015, 27020 HLTV
Team Fortress 227015 UDP27015 UDP27015 TCP RCON, 27020 UDP SourceTV
Garry's Mod27015 UDP27015 UDP27015 TCP RCON, 27020 UDP SourceTV
Left 4 Dead 227015 UDP27015 UDP27015 TCP RCON
Valheim2456 UDP2457 UDP-
Palworld8211 UDP27015 UDP25575 TCP RCON, 8212 TCP REST
Project Zomboid16261 UDP16261 UDP16262 UDP второй канал, 27015 TCP RCON
7 Days to Die26900 TCP и UDP2690026901-26902 UDP, 8081 telnet, 8080 веб
Rust28015 UDP28015 UDP28016 TCP RCON, 28082 TCP Rust+
ARK: Survival Ascended7777 UDP27015 UDP27020 TCP RCON
Satisfactory7777 UDP7777 TCP API-
Terraria7777 TCP7777 TCP-
Factorio34197 UDP34197 UDPRCON на порту по вашему выбору
Unturned27016 UDP (Port + 1)27015 UDP (Port)-
FiveM30120 UDP30120 TCP HTTP40120 TCP txAdmin
Arma 32302 UDP2303 UDP2304 Steam master, 2306 BattlEye
DayZ2302 UDP2305 UDP2303-2304 зарезервированы рядом с игровым портом
Don't Starve Together10999 UDP master-10998 пещеры, 27018-27019, 8768-8769
Insurgency: Sandstorm27102 UDP27131 UDP-
Killing Floor 27777 UDP27015 UDP20560 UDP Steam, 8080 TCP веб-админка
SCP: Secret Laboratory7777 UDP7777 UDP-
The Isle (Evrima)7777 UDP27015 UDP8888 TCP RCON, 10000 TCP очередь входа
Sons of the Forest8766 UDP27016 UDP9700 UDP BlobSync
The Forest27015 UDP27016 UDP8766 UDP Steam
Squad7787-7788 UDP27165-27166 UDP15000 UDP beacon, 21114 TCP RCON
Abiotic Factor7777 UDP27015 UDP-
RimWorld (мод для мультиплеера)25555 TCP--
BeamMP30814 TCP и UDP30814 TCP-
Euro Truck Simulator 227015 UDP27016 UDP-
Assetto Corsa9600 TCP и UDP8081 TCP HTTP-

В этой таблице стоит назвать две закономерности. Во-первых, блок 27015-27020 принадлежит Steam, и очень многие игры используют его для запросов независимо от своего игрового порта - именно поэтому запуск двух игр из Steam на одной машине означает, что одну из них придётся сдвинуть. Во-вторых, на удивление много игр на выживание хотят не одно число, а небольшой сплошной блок, потому что движок занимает выданный вами порт плюс один-два выше. Arma 3 и DayZ резервируют пять, 7 Days to Die хочет три, Squad - две пары. Тариф, выделяющий один порт, эти игры не потянет, и поэтому число портов указано на странице каждого тарифа, а не спрятано в таблице характеристик.

Игры, которых нет в таблице, - не загадка, а просто менее распространённые. Сервер печатает, на какие порты он встал, в первых двадцати строках своего лога, и эта строка авторитетнее любой документации, включая эту.

TCP, UDP и правило файрвола, которое ничего не делает#

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

Большинство игр используют для игрового процесса UDP. Игре не нужна повторная отправка: обновление позиции 200 мс давности бесполезно, а TCP настаивал бы на доставке именно его раньше свежего. Поэтому игры шлют датаграммы без гарантий и сами занимаются порядком и потерями. Знаменитое исключение - Minecraft Java: он работает по TCP, потому что это пошаговый протокол, где важен каждый пакет. Terraria - TCP. Мультиплеерный мод RimWorld - TCP. Всё остальное в таблице выше - UDP в той части, что несёт игроков, и протоколы запросов почти всегда тоже UDP.

Практические следствия:

  • Правило, разрешающее tcp/2456 для Valheim, не делает вообще ничего. Оба порта Valheim - UDP.
  • Правило для udp/25565 на Minecraft Java разрешает протокол запросов, но не игру. Игроки по-прежнему не могут зайти.
  • Некоторым играм нужны оба протокола на одном номере. BeamMP использует TCP для установки соединения и передачи модов, а UDP - для состояния машин. Satisfactory использует UDP для игры и TCP для API управления на том же 7777. Откройте оба.
  • «Разрешить любой протокол» на домашнем роутере обычно означает TCP и UDP, но не всегда. Проверьте.

То, что UDP не устанавливает соединение, меняет и то, как выглядит «закрыто». Закрытый TCP-порт отказывает сразу, и вы получаете быструю понятную ошибку. Закрытый или отфильтрованный UDP-порт обычно не даёт ничего: клиент просто ждёт, потом сдаётся. Поэтому проблемы с UDP диагностировать медленнее и туманнее, чем с TCP, и поэтому сканер портов показывает UDP-порты как open|filtered - без ответа он действительно не может отличить одно от другого. Что это значит для прокси и фильтрации, разобрано в статье TCP и UDP для игровых серверов. Если вы пишете правила сами, то правила файрвола, которые действительно важны описывают схему «всё запрещено по умолчанию», оставляющую наименьшую поверхность атаки.

Почему работающий сервер не появляется в браузере#

Три совершенно разные причины снаружи выглядят одинаково: сервер работает, консоль выглядит здоровой, а ни один браузер его не показывает.

Query-порт недоступен. Либо он вообще не был выделен, либо правило файрвола покрывает только игровой порт, либо игра настроена отвечать на запросы на порту, который никуда не проброшен. Проверьте, подключившись напрямую по IP и порту. Если прямое подключение работает, а в списке сервера нет, вы нашли причину.

Игре нужен токен входа, которого вы не указали. Counter-Strike 2, Team Fortress 2, Garry's Mod, Unturned, Insurgency: Sandstorm и Euro Truck Simulator 2 хотят токен входа игрового сервера Steam - GSLT, бесплатный от Valve, выдаваемый на каждый сервер человеку с лицензией на игру. Без него одни из этих игр работают анонимно с ограниченным показом в списке, а другие не показываются вовсе. Создать его за вас никто не может: случайная строка, проходящая проверку поля, отклоняется Steam, и понятная ошибка превращается в сервер, который запускается и которого никто не видит. Там, где игра без токена не запустится, разумный хостер придерживает установку, пока вы его не укажете, вместо того чтобы выдать сломанный сервер. Как создать токен и что значит бан токена, описано в статье токены игровых серверов Steam.

Игра показывается через собственный сервис, а не через Steam. FiveM регистрируется в Cfx.re через свою HTTP-точку на 30120/tcp. У Minecraft нет центрального списка вообще - экран мультиплеера опрашивает адреса, которые ввели ваши игроки. BeamMP регистрируется в бэкенде BeamMP с помощью вашего ключа авторизации. Во всех этих случаях проверять нужно исходящую доступность и ключ, а не входящий query-порт.

Есть и четвёртая, более скучная причина, о которой стоит сказать, потому что она съедает часы: список просто медленный. Общедоступному браузеру Valheim может понадобиться десять минут, чтобы показать новый сервер, а его внутриигровой фильтр слаб. Прежде чем перестраивать файрвол, поищите необычное слово из названия сервера и наберитесь терпения на чашку кофе.

Проверка порта снаружи#

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

bash
# TCP: does something accept a connection?$ nc -vz node.example.com 25565Connection to node.example.com 25565 port [tcp/*] succeeded!# UDP with a real Steam query, which is the only honest UDP test$ nmap -sU -p 27015 -sV --script=discovery node.example.com# What is the server actually listening on, run on the server$ ss -lntup | grep -E '2456|2457'

В Windows команда Test-NetConnection node.example.com -Port 25565 в PowerShell выполняет проверку TCP. Для UDP аналогичной однострочной команды нет, потому что честная проверка UDP означает говорить на собственном протоколе игры и увидеть ответ - именно это делают публичные сайты со статусом серверов. Проверялки запросов A2S для игр Steam и сайты статуса Minecraft для серверов Java - самый быстрый честный ответ, который вы получите по UDP-порту.

ss -lntup - это команда, которая ставит точку в спорах. Она выводит, что именно занято, на каком протоколе, на каком адресе и каким процессом. В её выводе важны две вещи. Если в колонке адреса стоит 127.0.0.1:27015, а не 0.0.0.0:27015 или *:27015, сервер привязан только к loopback, и никакие правки файрвола не помогут - исправляйте адрес привязки в конфиге игры. И если процесс не тот, который вы ожидали, значит, два сервера дерутся за один порт, а проигравший сообщает об этом как «address already in use» где-то в логе, который вы ещё не читали.

Смена или добавление порта#

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

  1. Выделите порт. В панели это вкладка Network; на собственной машине это правило файрвола, а дома - ещё и проброс порта.
  2. Задайте в переменной порта самой игры то же число. В панели она находится на вкладке Startup, а в остальных случаях - в конфиге или аргументах запуска. Это -port для Valheim, server-port в server.properties для Minecraft, Port в ServerConfig.toml для BeamMP, -Port= для нескольких игр на Unreal.
  3. Перезапустите и прочитайте первые двадцать строк консоли. Сервер печатает, на что он встал. Если он печатает старое число, вы отредактировали не тот файл или игра перезаписала ваш конфиг при завершении - некоторые так и делают.
  4. Проверьте снаружи, прежде чем кому-то об этом сообщать.

На RE:NODE каждый тариф указывает число выделенных портов, а добавляются и удаляются они на вкладке Network, причём query и RCON входят в счёт. Игровые переменные лежат на вкладке Startup панели, так что обе половины изменения находятся в двух вкладках друг от друга, а консоль сразу показывает результат - если вывод при запуске вам незнаком, стоит пробежать глазами статью как читать консоль. Смена тарифа не пересоздаёт сервер, поэтому переход на уровень с большим числом портов сохраняет и мир, и уже настроенную конфигурацию.

Если вы хотите, чтобы игрокам вообще не приходилось вводить порт, это задача для DNS, а не для сети. Обычная запись A даёт им имя и тот же порт; запись SRV может полностью скрыть нестандартный порт для Minecraft Java. Простой вариант описан в статье подключение домена к игровому серверу, а тот, что прячет номер, - в статье SRV-записи для Minecraft.

RCON и порты, которые не стоит открывать#

RCON - это удалённая консоль: вы проходите аутентификацию по паролю, а затем отправляете команды так, как будто сидите за сервером. Она по-настоящему полезна для мостов с Discord, ботов статуса и запланированных задач. Но в большинстве реализаций это ещё и протокол в открытом виде с одним общим паролем и без ограничения частоты попыток, что делает открытый порт RCON одним из лучших способов потерять сервер.

Что стоит знать, прежде чем её включать:

  • Source RCON работает по TCP на номере игрового порта, включается через -usercon и rcon_password. Поскольку номер совпадает с UDP-трафиком игры, люди открывают tcp/27015, не понимая, что открыли консоль.
  • GoldSrc - Counter-Strike 1.6 и родственные игры - запускает RCON по UDP на игровом порту, так что отделить его от игрового процесса файрволом невозможно вообще. Единственная защита - пароль.
  • Minecraft RCON - это 25575/tcp, и он выключен, пока не задано enable-rcon=true. Rust отдаёт его как websocket на 28016/tcp. У Palworld есть и RCON на 25575/tcp, и REST API на 8212/tcp, каждый со своим паролем.
  • Веб-панели администратора - Killing Floor 2 на 8080, панель 7 Days to Die на 8080 и telnet на 8081 - это HTTP, по умолчанию без шифрования, и нередко защищены паролем, лежащим в конфиге открытым текстом.

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

Проброс портов дома, NAT и CGNAT#

Хостинг с собственного подключения усложняет порты, а не упрощает, потому что между интернетом и вашей машиной стоит слой трансляции. У роутера один публичный адрес, у сервера - частный, а проброс сообщает роутеру, что трафик, пришедший на заданный порт, принадлежит конкретной внутренней машине.

На практике это ломают три вещи:

  • Меняется внутренний адрес. Сервер получает новую аренду DHCP, проброс по-прежнему указывает на старый адрес, и всё останавливается. Прежде чем что-то пробрасывать, закрепите за машиной резервирование DHCP или статический локальный адрес.
  • Меняется публичный адрес. У большинства домашних подключений динамический адрес, который меняется при переподключении. Запись динамического DNS это прикрывает, но ценой задержки распространения при каждой смене. Что стабильный адрес даёт и чего не даёт, разобрано в статье статический IP-адрес: когда он нужен.
  • Carrier-grade NAT. Если WAN-адрес вашего роутера находится в 100.64.0.0/10, вы делите публичный адрес с другими клиентами, и пробросить порт невозможно вообще, потому что порт вам не принадлежит. Многие провайдеры по запросу переводят с CGNAT; некоторые нет, а некоторые берут за это деньги. IPv6 - настоящий выход, если он есть и у ваших игроков, и в этом загвоздка, - см. IPv6 и игровые серверы.

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

FAQ#

Что такое query-порт и нужно ли его открывать?

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

Почему сервер работает у меня, но не у других?

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

Могут ли два игровых сервера делить один порт?

Нет. Один процесс может занять один порт на одном протоколе за раз, и второй завершится с ошибкой «address already in use». Один номер можно разделить между протоколами - один сервер на TCP, другой на UDP, - но об этом редко спрашивают. Дайте каждому серверу собственный порт и собственный query-порт.

Нужно ли открывать и исходящие порты?

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

Нестандартный порт безопаснее стандартного?

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

Сколько портов нужно моему тарифу?

Считайте игровой порт, query-порт, если это отдельное число, и любой административный порт, которым вы действительно собираетесь пользоваться. Valheim нужны два. Minecraft Java нужен один, если только вам не нужен RCON. Arma 3 и DayZ нужен блок из пяти и трёх. Остальное покрывает таблица по играм выше.


Комментарии

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

0/2000