UDP hole pinching: прямое соединение двух хостов за NAT'ом без доступа к роутеру. Как это работает
Invite pending
Как известно, подключиться извне к хосту, находящемуся за 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?».
Итак, имеем два компа за провайдерским 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?».