NAT (Network Address Translation) обладает массой достоинств, но и не лишен недостатков, например, необходимости конфигурировать проброс портов (port forwarding) в случае если мы хотим иметь доступ к серверу, который находится за NAT раутером. Существует несколько способов прохождения через NAT (NAT traversal). В данной статье я попробую рассмотреть один из них, который основан на UDP hole punching (буквально — пробитие дырки с помощью UDP, прошу прощения за кучу терминов на английском, но я просто не знаю как их благозвучно воспроизвести по-русски).
Многие встречали или работали с сервисами типа Hamachi, Skype или TeamViewer. Их работа как раз и основана на алгоритме пробивания дыры с помощью UDP пакетов.
Принцип работы UDP hole punching довольно прост и вот, например, как работает Hamachi:
PC A и Notebook B — два компьютера, находящиеся каждый за частной сети (private network), Hamachi сервис — сервер, доступный по public IP адресу.
Данная техника основана на том, что в UDP пакете содержится только IP адрес и порт, в отличие от TCP пакета.
N2N представляет собой виртуальную частную сеть (VPN) с возможностью прхождения через файрвол/NAT c защищенным соединением. Архитекура N2N основана на двух компонентах:
Удаленные узлы общаются друг с другом через виртуальные сетевые интерфейсы (tap interfaces). Каждый компьютер может принадлежать множеству виртуальных сетей (по одному виртуальному сетевому интерфейсу на виртуальную частную сеть).
Для OS X надо установить tap устройство, я ставил вот это — TUNTAP.
Собрать n2n под винды тоже довольно легко, файл проекта находится в исходных текстах, но 1) в проекте пути не правильные, надо будет скопировать файлы в поддиректорию и 2) отсутствует файл version.c, можно просто создать пустой и вставить туда:
UDP hole punching
Многие встречали или работали с сервисами типа Hamachi, Skype или TeamViewer. Их работа как раз и основана на алгоритме пробивания дыры с помощью UDP пакетов.
Принцип работы UDP hole punching довольно прост и вот, например, как работает Hamachi:
PC A и Notebook B — два компьютера, находящиеся каждый за частной сети (private network), Hamachi сервис — сервер, доступный по public IP адресу.
- A и B устанавливают UDP соединение с сервером Hamachi, раутеры назначают внешние порты каждому соединению и при этом создается как бы «туннель» (дыру) в раутере
- Hamachi сервер сообщает A и B public IP адреса и порты друг друга
- A и B, используя информацию полученную от сервера, устанавливают соединение друг с другом
Данная техника основана на том, что в UDP пакете содержится только IP адрес и порт, в отличие от TCP пакета.
N2N
N2N представляет собой виртуальную частную сеть (VPN) с возможностью прхождения через файрвол/NAT c защищенным соединением. Архитекура N2N основана на двух компонентах:
- edge node (удаленный узел): приложение, установленное на компьютере пользователя, которое позволяет построить виртуальную частную сеть. Каждый узел создает виртуальную сетевую карту, которая и используется для создания сети.
- supernode (супер узел): сервер с public IP адресом, который используется для установки соединения между удаленными узлами, а также используется как раутер пакетов между узлами, которые не могут общаться напрямую.
Удаленные узлы общаются друг с другом через виртуальные сетевые интерфейсы (tap interfaces). Каждый компьютер может принадлежать множеству виртуальных сетей (по одному виртуальному сетевому интерфейсу на виртуальную частную сеть).
Установка и использование N2N
- Скачать n2n:
svn co svn.ntop.org/svn/ntop/trunk/n2n
- Собрать:
make
- Запустить супер узел на компьютере с public IP, или за NAT, но там где можно сконфигурировать проброс портов:
supernode$ supernode -l xyw
где xyw — порт, на котором суперузел ожидает соединение - Запустить два узла на разных компьютерах за NAT:
node-1$ edge -a 10.1.2.1 -c mynetwork -k encryptme -l a.b.c.d:xyw
node-2$ edge -a 10.1.2.2 -c mynetwork -k encryptme -l a.b.c.d:xyw
где mynetwork — название VPN, encryptme — пароль для доступа в VPN, a.b.c.d:xyw — public IP адрес и порт супер узла - Проверить как работает VPN:
node-1$ ping 10.1.2.2
и
node-2$ ping 10.1.2.2
Мелочи
Для OS X надо установить tap устройство, я ставил вот это — TUNTAP.
Собрать n2n под винды тоже довольно легко, файл проекта находится в исходных текстах, но 1) в проекте пути не правильные, надо будет скопировать файлы в поддиректорию и 2) отсутствует файл version.c, можно просто создать пустой и вставить туда:
char *version = "2.03";
char *osName = "Windows";
char *buildDate = "today";