Перейти к основному содержимому

Что такое NAT-traversal?

У большинства устройств нет собственного публичного адреса в интернете: они находятся за NAT (Network Address Translation) на роутере, который делит один публичный адрес между многими внутренними устройствами. Для обращения к серверам этого достаточно, но два таких устройства не могут просто связаться друг с другом напрямую. NAT-traversal объединяет техники, которые всё же позволяют им установить прямое соединение.

Кратко

NAT-traversal (обход NAT) объединяет техники, которые позволяют двум устройствам за роутерами (NAT) установить прямое соединение, даже если ни у одного нет публичного адреса, по которому к нему мог бы обратиться другой.

Как работает NAT-traversal

  • 01

    Координирующий (сигнальный) сервис помогает двум узлам узнать внешние адрес и порт друг друга, то есть то, как их видит внешний мир через их NAT.

  • 02

    С помощью STUN узел обычно узнаёт собственные внешние адрес и порт, какими они видны снаружи его NAT.

  • 03

    С этой информацией узлы пытаются выполнить «hole punching»: оба одновременно отправляют пакеты навстречу друг другу, так что каждый NAT открывает путь для трафика другого.

  • 04

    Когда прямой путь открыть нельзя (некоторые строгие NAT его блокируют), трафик может пересылать ретранслятор, который часто называют TURN. Это запасной вариант, и он добавляет лишний переход.

UDP hole punching, шаг за шагом

В типичном сценарии каждый узел обращается к сигнальному серверу и через STUN узнаёт публичные адрес и порт, под которыми его видно из-за NAT. Сервер передаёт каждому узлу внешний адрес другого. Затем оба узла почти одновременно отправляют пакеты на внешний адрес друг друга. Первый исходящий пакет с каждой стороны заставляет её NAT создать временное сопоставление в ожидании ответа; когда приходит пакет с другой стороны, он совпадает с этим сопоставлением и проходит. Когда в обе стороны прошло по несколько пакетов, прямой двусторонний путь открыт, и шифрованный туннель работает поверх него.

Когда нужен ретранслятор

Hole punching работает с большинством типов NAT, но некоторые из них (так называемые симметричные NAT или строгие корпоративные файрволы) назначают непредсказуемые порты или блокируют попытку, и прямой путь не образуется. В этом случае используется ретранслятор: сервер, доступный обоим узлам, который пересылает их трафик. В хорошо спроектированной системе ретранслятор лишь пересылает уже зашифрованные пакеты и не может их прочитать; он добавляет задержку и лишний переход, но данных не видит. Хорошая mesh-сеть прибегает к ретранслятору только в крайнем случае, когда прямой туннель невозможен.

Как это соотносится с Vexaro Mesh (в разработке)

Vexaro Mesh задуман со встроенным обходом NAT: узлы за NAT соединяются напрямую везде, где позволяет сеть, и через ретранслятор только там, где не позволяет. Шлюзы должны поднимать шифрованные туннели поверх любого канала без проброса портов и публичных адресов, поэтому пути между площадками остаются короткими.

Посмотреть планируемые функции

Частые вопросы

Почему два устройства за NAT не могут просто соединиться напрямую?
Потому что ни у одного из них нет публичного адреса, по которому к нему может обратиться другой, а роутеры по умолчанию отбрасывают незапрошенный входящий трафик. NAT-traversal обходит это ограничение: сигнальный сервис сообщает каждой стороне, как другая выглядит снаружи, после чего обе стороны одновременно начинают соединение (hole punching), и каждый роутер открывает путь для пакетов другой стороны.
Требует ли NAT-traversal открытия портов на моём файрволе?
Обычно нет. Техники вроде hole punching как раз и нужны для того, чтобы установить связь без ручного проброса портов: узлы сами создают нужные временные сопоставления, отправляя исходящий трафик. Системы, построенные на этом, рассчитаны на работу за NAT без проброса портов и публичных адресов, и Vexaro Mesh по замыслу обходится без того и другого.

Следите, как создаётся Vexaro Mesh.

Vexaro Mesh в разработке. Расскажите о своих площадках, и мы свяжемся с вами насчёт раннего доступа.