Pull to refresh

UDP hole pinching: прямое соединение двух хостов за NAT'ом без доступа к роутеру. Как это работает

Как известно, подключиться извне к хосту, находящемуся за NAT'ом невозможно без специальной настройки роутера (проброс порта). В сети провайдера или в корпоративной сети мы обычно лишены такой роскоши. Речь пойдет как раз про такой случай.

Итак, имеем два компа за провайдерским NAT'ом(в разных сетях, ес-сно). Простой способ их сконнектить — использовать посредника с внешним адресом. С обеих машин поднимаем VPN до посредника, и вот он туннель. Такой способ имеет очевидные недостатки: необходимость иметь сервер с «белым» адресом, а в случае использования коммерческих сервисов — проблемы со скоростью и/или небесплатность. С этим приходится мириться как с неизбежным злом.

Но существует способ прямого соединения в таком случае: TCP-туннель через UDP c использованием UDP hole pinching. И сейчас я расскажу, как это работает.

Сначала немного про UDP через NAT. У нас за НАТом спокойно работает аська, скайп, VoIp и ещё куча всего, что использует UDP. Как? Ведь нам нужно не только отправлять дейтаграммы, но ещё и получать их. Все просто: в момнт отправки пакета с myip:22222 на icq.com:50 на роутере создается временное правило: входящие пакеты от icq.com на порт 22222 роутятся на myip. Таким образом сервер может ответить мне. Назовем это UDP-сессией.

Итак, мой компьютер назовем comp1, я сижу за провайдерским натом nat1. У моего друга, находящегося в такой же ситуации, comp2 и nat2. Я начинаю отправлять пакеты с comp1:2222 на nat2:2222. Ну и естественно, ничего не происходит: nat2 просто дропает эти непонятно кому предназначенные пакеты. Хотя нет, все-таки мы чего-то добились: теперь nat1 будет роутить входящие на порт 2222 пакеты от nat2 на comp1.

А теперь следите за руками: мой друг начинает отправлять на мой нат от себя такие же пакеты. На Nat1:2222 приходит пакет от nat2:2222. Nat1 «знает», что comp1 недавно отправлял на nat2 пакет с этого порта, т.е. считает его «ответом». Соответственно Nat1 направляет этот пакет на comp1.

Все! Я получил пакет от своего друга без посредников. Мы оба за НАТом. Как только друг начал отправлять мне пакеты, у него на nat2 также открылась сессия, и он начал получать мои.

Реализаций под Windows я, к сожалению, не встречал. Под линукс и мак samy.pl/pwnat. Собственно этот пост представляет собой вольный пересказ раздела «HOW DOES IT WORK?».
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.