Что такое 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 соединяются напрямую везде, где позволяет сеть, и через ретранслятор только там, где не позволяет. Шлюзы должны поднимать шифрованные туннели поверх любого канала без проброса портов и публичных адресов, поэтому пути между площадками остаются короткими.
Посмотреть планируемые функции