RE:NODE

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

NAT и CGNAT: почему домашний сервер не работает

Как NAT, CGNAT и DS-Lite блокируют входящие соединения, что значат типы NAT и hole punching для кооператива и какие есть реальные выходы, если порт пробросить нельзя.

0 прочтений

NAT позволяет многим устройствам делить один публичный адрес, переписывая их исходящий трафик, и работает это потому, что каждый разговор начинается изнутри. Игровой сервер - противоположный случай: разговор начинают незнакомцы снаружи. На обычном домашнем подключении это решается пробросом порта на роутере. За NAT операторского уровня (CGNAT) это невозможно, потому что провайдер поставил перед вашим роутером второй NAT, которым вы не управляете: ваш «публичный» адрес общий с другими абонентами, и никакой проброс с вашей стороны не может занять на нём порт. Если WAN-адрес вашего роутера начинается с чисел от 100.64 до 100.127, это ваш случай. Выходы такие: публичный IPv4-адрес от провайдера, IPv6, ретранслятор или туннель либо сервер, который живёт где-то ещё.

Эта статья объясняет почему - подробнее, чем чек-лист: как ведёт себя NAT, что на самом деле означают типы NAT, о которых сообщают консоли и лаунчеры, почему «создать игру и пригласить» работает, когда выделенный сервер не работает, и какой обходной путь подходит для какой ситуации.

Что NAT делает с соединением#

Ваш роутер ведёт таблицу трансляции. Когда ваш ПК с адресом 192.168.1.20 отправляет UDP-пакет с порта 50000 на игровой сервер, роутер переписывает источник на свой публичный адрес и какой-нибудь порт на свой выбор, записывает соответствие и отправляет пакет дальше. Ответ приходит на этот публичный порт, роутер находит соответствие, переписывает адрес назначения обратно на 192.168.1.20:50000 и доставляет пакет.

Для хостинга важны два следствия:

  • Входящие пакеты без соответствия отбрасываются. Первый пакет игрока к вашему серверу приходит на публичный адрес роутера, а в таблице для него ничего нет. Роутер понятия не имеет, какой машине он предназначен.
  • Соответствия истекают. UDP-соответствие живёт, только пока трафик поддерживает его. Роутеры на Linux по умолчанию держат около 30 секунд для разового UDP-потока и несколько минут для установившегося; у бытовых роутеров по-разному. Игра, которая молчит дольше этого, теряет соответствие, и следующий пакет от сервера отбрасывается.

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

Четыре варианта поведения NAT#

Не каждый NAT обращается с трафиком одинаково, и от этих различий зависит, смогут ли два игрока за NAT напрямую достучаться друг до друга. Старые названия (cone и symmetric) до сих пор в ходу; формальные термины из RFC 4787 описывают два отдельных поведения - сопоставление (mapping) и фильтрацию (filtering).

Распространённое названиеСопоставлениеФильтрацияПрямое соединение между двумя игроками
Full coneОдин и тот же публичный порт для любого адресатаСлать на сопоставленный порт может кто угодноЛегко
Restricted coneОдин и тот же публичный порт для любого адресатаТолько адреса, которым вы что-то отправлялиРаботает с hole punching
Port-restricted coneОдин и тот же публичный порт для любого адресатаТолько пары адрес-порт, которым вы что-то отправлялиОбычно работает с hole punching
SymmetricНовый публичный порт для каждого адресатаТолько точный адресатОбычно не работает; нужен ретранслятор

Большинство домашних роутеров ведёт себя как port-restricted cone. Многие развёртывания CGNAT, а также некоторые корпоративные и мобильные сети ведут себя симметрично, и для peer-to-peer игр это худший случай.

Что консоли и лаунчеры называют типом NAT

Консоли упрощают всё это до трёх уровней.

XboxPlayStationЗначение
OpenType 1 / Type 2 с пробросомДругие могут до вас достучаться; вы можете хостить
ModerateType 2Вы можете подключиться к большинству; некоторые не могут подключиться к вам
StrictType 3Вы можете подключаться только к хостам с Open или к серверам

Эти уровни важны для сессий, которые хостят сами игроки, когда хостом выступает машина одного из них. Для выделенных серверов они значат гораздо меньше, потому что игрок, подключающийся к серверу, начинает разговор изнутри своей сети - а исходящий трафик пропускает любой NAT. Игрок со Strict NAT без всяких проблем подключится к выделенному серверу на публичном адресе. Этот единственный факт - главный сетевой аргумент в пользу выделенного сервера для группы, в которой есть люди на мобильном интернете или в студенческих общежитиях. Остальные аргументы - в статье что такое выделенный игровой сервер.

NAT операторского уровня#

Адреса IPv4 у провайдеров закончились много лет назад. CGNAT - это способ растянуть то, что осталось: провайдер ставит большой NAT в своей сети и выдаёт роутеру каждого абонента адрес из общего диапазона вместо публичного. Многие абоненты затем выходят в интернет через один и тот же публичный адрес.

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

для вас нет соответствияэто не проброситьваш проброс не сработаетИгрокснаружиCGNAT провайдераобщий публичный IPv4Ваш роутерWAN 100.x.x.xДомашний сервер192.168.1.20
Два слоя NAT между игроком и домашним сервером

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

Побочные эффекты, которые вы, возможно, уже замечали

  • Общая репутация. Ваш публичный адрес общий с другими абонентами. Если кто-то из них ведёт себя плохо, сайты показывают капчу всем, а игровой сервер, забанивший этот адрес, банит вас всех.
  • Ограничения по портам. NAT оператора часто выдаёт каждому абоненту блок портов, а не весь диапазон. Обычный сёрфинг этого не замечает; программы, открывающие тысячи соединений, иногда замечают.
  • Адрес, который вы видите, не ваш. Ваш публичный IP, который показывает сайт вроде «какой у меня IP», - это адрес NAT оператора. Давать его друзьям, чтобы они подключились к вашему серверу, бесполезно.

Как это определить

  1. Посмотрите WAN-адрес или адрес интернета на странице состояния роутера.
  2. Узнайте свой публичный адрес в браузере на том же подключении.
  3. Если они различаются, перед вашим роутером есть NAT. Если адрес роутера лежит в 100.64.0.0/10, это CGNAT. Если он в 192.168.x.x или 10.x.x.x, скорее всего, это модем провайдера, выполняющий NAT внутри вашего же дома, - двойной NAT, который вы можете исправить сами.

То же покажет traceroute изнутри сети: хоп в диапазоне 100.64 вскоре после вашего роутера - это NAT оператора.

DS-Lite, распространённый вариант

Многие кабельные и оптоволоконные провайдеры, включая крупных в Германии, используют Dual-Stack Lite. Подключение получает настоящий публичный IPv6, а IPv4 туннелируется к провайдеру и делится через NAT оператора. Роутер может вообще не показывать WAN-адрес IPv4. Для владельца игрового сервера эффект тот же, что у CGNAT для IPv4, с одним полезным отличием: входящий IPv6 работает, так что сервер, доступный по IPv6, возможен, если IPv6 есть и у ваших игроков. Насколько далеко это вас заведёт - а для публичного сервера недостаточно далеко, - объясняет статья IPv6 и игровые серверы.

Почему «создать игру и пригласить» работает, а сервер нет#

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

Сессиям, которые хостят игроки, во многих играх открытый порт не нужен. Обе стороны устанавливают исходящие соединения с сервисом-посредником, который сообщает каждой публичный адрес и порт другой. Затем каждая сторона в один и тот же момент отправляет пакеты другой, создавая на своём NAT соответствие, которое впускает пакеты собеседника. Это UDP hole punching, и при NAT типа cone на обоих концах он обычно работает, даже через CGNAT.

Когда он не срабатывает - одна сторона симметричная или обе за строгими операторами, - платформа переходит на ретранслятор. Сетевой слой Steam умеет пускать трафик сессии через ретрансляторы Valve, кроссплей-сессии Valheim идут через ретранслятор PlayFab; у других платформ есть свои. Ретранслируемый трафик идёт в обход и добавляет задержку, но соединение устанавливается.

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

Таймауты и переполненные таблицы: проблемы NAT после подключения#

Не всякая проблема NAT мешает подключиться. Две проявляются, когда игроки уже на сервере.

Соответствия, истекающие посреди сессии. Каждый NAT между игроком и сервером держит UDP-соответствие живым, только пока идут пакеты. Игры отправляют состояние много раз в секунду, поэтому во время игры это никогда не важно. Важно это в тихие моменты: игрок сидит в меню, экран загрузки подвис, игра отправляет обновления только тогда, когда что-то меняется. Если пауза переживёт самый короткий таймаут на пути - у дешёвого домашнего роутера или агрессивно настроенного NAT оператора, - соответствие исчезает, и следующий пакет сервера отбрасывается. Игрок видит отключение по таймауту «без причины», обычно каждый раз в похожий момент. Игры решают это keep-alive-пакетами, и большинство делает это хорошо; если конкретная игра не справляется, исправлять нужно на стороне игрока (роутер с более длинными таймаутами UDP), а не на сервере.

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

code
nf_conntrack: nf_conntrack: table full, dropping packet

После этого новые игроки не могут подключиться, а уже подключённые продолжают играть. Сравните текущее число с лимитом с помощью cat /proc/sys/net/netfilter/nf_conntrack_count и nf_conntrack_max. Увеличение лимита помогает загруженному серверу; против флуда ответ - фильтрация выше по цепочке, а не таблица побольше. Сторона правил описана в статье правила файрвола, которые имеют значение.

Сравнение выходов#

ВариантПодходит дляСтоимостьВлияние на задержку
Попросить у провайдера публичный IPv4ВсегоОт бесплатно до небольшой ежемесячной платы, если предлагаетсяНикакого
Только IPv6Приватных групп, где у всех есть IPv6БесплатноНикакого
Оверлейная сеть (WireGuard, Tailscale, ZeroTier)Приватных групп, готовых поставить клиентБесплатно для небольших группНебольшое или объезд через ретранслятор
Туннельный сервис или ретранслятор на VPSПубличных серверовОт бесплатного тарифа до нескольких долларов в месяцДополнительный объезд
Арендованный сервер или VDSВсегоЕжемесячный тарифЗависит от локации, часто лучше

Сначала спросите провайдера. Многие провайдеры по запросу выводят абонента из-за CGNAT - иногда бесплатно, иногда как платную опцию «публичный IP», иногда только на бизнес-тарифах. Просите именно публичный IPv4-адрес, а не просто «статический IP», и после этого убедитесь, что WAN-адрес роутера сменился на адрес не из 100.64.

IPv6 бесплатен и чист, если он есть на обоих концах, и бесполезен для игроков, у которых его нет. Годится для четырёх друзей, которые проверили; не годится как план для публичного сервера.

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

Туннель или ретранслятор даёт вашему домашнему серверу публичный адрес в чужой сети и пересылает трафик по исходящему соединению из вашего дома. Это единственный способ держать публичный сервер за CGNAT, не меняя провайдера, и у него есть цена: задержка и потеря настоящих адресов игроков. Статья туннели и прокси для игровых серверов рассказывает о playit.gg, frp, WireGuard на VPS и о компромиссах.

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

NAT, которого вы не видите на арендованном сервере#

Арендованные серверы обычно тоже стоят за небольшим NAT, но таким, который настроен за вас. В панели на базе Pterodactyl, на которой работает RE:NODE, каждый сервер живёт в своём контейнере, а узел публикует выделенные порты со своего публичного адреса в этот контейнер. Игроки подключаются к адресу узла и выделенному порту; трансляция в контейнер - это фиксированное соответствие, в точности как проброс порта, который за вас написал и поддерживает кто-то другой.

Изредка всплывают два побочных эффекта:

  • Игра видит у себя частный адрес. Некоторые игры выводят или анонсируют адрес, на котором, как им кажется, они находятся. Внутри контейнера это частный адрес: для подключений это безвредно, но в логах сбивает с толку. Игрокам нужно давать адрес со страницы сервера в панели.
  • Игра видит настоящие адреса игроков. В отличие от туннеля, сопоставление портов сохраняет адрес источника входящих пакетов, поэтому баны, логи и ограничения по IP работают как обычно.

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

FAQ#

Можно ли пробросить порт за CGNAT?

Нет. Порт, который нужно было бы открыть, находится на NAT провайдера, а его вы настроить не можете. Проброс на вашем роутере правильный, но трафик до него никогда не доходит. Решения - публичный IPv4-адрес от провайдера, IPv6, туннель или ретранслятор либо хостинг сервера в другом месте.

CGNAT - это то же самое, что двойной NAT?

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

Почему мой тип NAT - Strict?

Ваше подключение не допускает незапрошенный входящий трафик и сопоставляет порты так, что hole punching не работает, - часто из-за CGNAT или строгого роутера. К выделенным серверам вы по-прежнему подключаетесь нормально; трудности будут с тем, чтобы хостить сессии самому или заходить в некоторые peer-to-peer-лобби.

Решает ли VPN проблему CGNAT для хостинга?

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

Помешает ли тип NAT моих игроков подключиться к моему серверу?

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


Комментарии

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

0/2000