Вопрос или проблема
Я пытаюсь устранить возможную проблему с NAT, и чтобы сузить круг поиска, я хочу выяснить, существуют ли какие-либо технологии маршрутизаторов, которые могут обойти NAT, когда на стороне получателя не выполнено перенаправление портов или не включен UPNP. Как объяснили некоторые участники технической поддержки, NAT скрывает внутренний IP-адрес, поэтому, если перенаправление портов не выполнено, отправитель отправляет пакет на машину получателя, но пакет содержит только внешний IP-адрес. Маршрутизатор получателя не знает, на какую машину перенаправить пакет, поэтому сбрасывает его или отвергает. Это правильно? Например, моя машина -> машина друга. Машина друга находится за NAT, перенаправление портов не выполнено и UPNP не включен. В такой ситуации сможет ли мой маршрутизатор обойти NAT и каким-либо образом передать пакет на машину моего друга? Я нашел некоторые ссылки на hole punching, STUN и т. д., но мне трудно понять, являются ли это специфическими для маршрутизатора технологиями или для их использования требуется специальное приложение. Возможная проблема с NAT в двух словах:
Друг находится за NAT, UPNP не включен, перенаправление портов не выполнено. Я не могу правильно подключиться к нему через UDP-соединение с рандомным портом (игра в p2p мультиплеере). Другие могут, хотя все говорят мне, что это должно быть невозможным, так как перенаправление портов не выполняется.
Теория: мой маршрутизатор слишком старый/не поддерживает определенные технологии, которые позволили бы ему обойти NAT и подключиться к нему, в то время как у других более современные маршрутизаторы, которые могут это делать. Вот почему я пытаюсь выяснить, имеют ли маршрутизаторы что-то подобное, что позволит им обойти NAT.
В двух словах, вы не можете это сделать, и это не то, что вы можете исправить со своей стороны.
Чтобы кратко подвести итог / упрощенно объяснить, когда вы обращаетесь к пакету на маршрутизатор друга, он должен знать, что делать с этим пакетом. Если существует запись NAT (т.е. компьютер вашего друга сделал сетевой запрос через маршрутизатор), то маршрутизатор знает, как направить ответный пакет на исходный компьютер, как если бы на время передачи пакета было включено временное перенаправление портов.
Точные механизмы могут различаться между устройствами и если маршрутизатор имеет встроенный файрвол (почти все сейчас таковы), но, по сути, если нет записи NAT или перенаправления портов, тогда пакет был доставлен на устройство (маршрутизатор), которое не настроено для приема пакета на порт, что означает сброс/игнорирование пакета. Это желаемое поведение маршрутизатора/файрвола, в противном случае любой пользователь интернета мог бы получить доступ к внутренней сети.
Маршрутизатор вашего друга либо должен включить перенаправление портов, настроить UPNP (что, по сути, является автоматическим перенаправлением портов), либо использовать сервис, который имеет посредника третьей стороны, через которого вы оба взаимодействуете, что запускает функциональность NAT в маршрутизаторе друга.
Ваше объяснение проблемы с NAT точно. Hole punching не является технологией, это скорее техника. В двух словах, она использует некоторые свойства принципов работы NAT для установки соединения между двумя хостами, находящимися за NAT. STUN – это стандартизированная реализация этой техники. Мне очень нравится ZeroTier. Это децентрализованный VPN. Это означает, что он может делать так, чтобы два или более хоста в интернете выглядели как подключенные в LAN, каждый с выделенным IP-адресом в этой LAN, без какого-либо выделенного сервера. Настроить его довольно просто, а бесплатного плана более чем достаточно для ваших нужд. Hole punching происходит автоматически, а данные отправляются напрямую между участвующими устройствами. Сервер третьей стороны используется только в начале для координации установления соединений. Однако у ZeroTier есть некоторые ограничения. Официально не поддерживается прохождение двойного NAT (устройство за NAT, которое находится за другим NAT). Я пытался использовать его в любом случае, но соединение было нестабильным. У вас могут быть другие результаты. Кроме этого, в поддерживаемых сетях я не сталкивался с какими-либо проблемами до сих пор.
Ответ или решение
Действительно, ваша интерпретация проблем с NAT верна. NAT (Network Address Translation) скрывает внутренние IP-адреса, и в ситуации, когда устройство за NAT не настроено для перенаправления портов и не использует UPnP, отправленные пакеты от вашего компьютера к компьютеру вашего друга будут отброшены, поскольку роутер не знает, как направить их к соответствующему устройству.
Краткое объяснение проблемы с NAT
Когда вы отправляете пакет на внешний IP-адрес вашего друга, и его роутер не имеет записи NAT для этого соединения (то есть его компьютер не инициировал заранее какие-либо соединения), пакет будет сброшен, потому что роутер не имеет возможности определить, куда его отправить. Это ожидаемое поведение, поскольку если бы роутер принимал все пакеты и не фильтровал их, это создало бы огромные риски безопасности.
Технологии обхода NAT
-
Перенаправление портов и UPnP: Это классические методы. Если роутер вашего друга поддерживает перенаправление портов или UPnP, можно настроить его для открытия нужного порта. Однако, если эти функции не включены, мы перейдем к другим методам.
-
Hole Punching: Это техника, которая использует свойства NAT для установления связи между двумя хостами, находящимися за NAT. Она часто используется в P2P-сетях и требуется, чтобы один и тот же NAT-устройством инициировало подключение. Однако оба устройства должны поддерживать эту технику.
-
STUN (Session Traversal Utilities for NAT): STUN – это стандартизированное решение, которое определяет, как NAT может работать, и помогает хостам обнаружить свои публичные адреса и тип NAT. Хотя STUN не может гарантировать успех в каждой ситуации, он может быть полезным для VoIP и других приложений, использующих UDP.
-
VPN и софт для локальной сети: Такие решения, как ZeroTier или Tailscale, могут помочь обойти проблемы с NAT. Они позволяют создать виртуальную локальную сеть, где каждое устройство получает локальный IP-адрес и может взаимодействовать друг с другом, как будто они находятся в одной сети. Используется метод hole punching для установления соединений, что упрощает процесс.
Заключение
В вашем случае, если роутер вашего друга действительно не настроен на перенаправление портов и UPnP, то подключиться напрямую через UDP не получится. В этом случае лучше всего обратиться к решению на основе VPN (например, ZeroTier), которое сможет организовать соединение через NAT. Однако стоит отметить, что если у друга есть двойной NAT (выход через один NAT, а затем через другой), это может усложнить соединение.
Таким образом, обходить NAT на уровне роутеров с использованием специфических технологий нецелесообразно без соответствующей настройки, поэтому важно искать решения, которые могут быть реализованы на уровне приложений или сетевых технологий, таких как VPN.