VPN с возможностью прохождения через файрвол/NAT

    NAT (Network Address Translation) обладает массой достоинств, но и не лишен недостатков, например, необходимости конфигурировать проброс портов (port forwarding) в случае если мы хотим иметь доступ к серверу, который находится за NAT раутером. Существует несколько способов прохождения через NAT (NAT traversal). В данной статье я попробую рассмотреть один из них, который основан на UDP hole punching (буквально — пробитие дырки с помощью UDP, прошу прощения за кучу терминов на английском, но я просто не знаю как их благозвучно воспроизвести по-русски).

    UDP hole punching

    Многие встречали или работали с сервисами типа Hamachi, Skype или TeamViewer. Их работа как раз и основана на алгоритме пробивания дыры с помощью UDP пакетов.

    Принцип работы UDP hole punching довольно прост и вот, например, как работает Hamachi:

    PC A и Notebook B — два компьютера, находящиеся каждый за частной сети (private network), Hamachi сервис — сервер, доступный по public IP адресу.
    1. A и B устанавливают UDP соединение с сервером Hamachi, раутеры назначают внешние порты каждому соединению и при этом создается как бы «туннель» (дыру) в раутере
    2. Hamachi сервер сообщает A и B public IP адреса и порты друг друга
    3. 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";
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 9

      0
      Данная техника основана на том, что в UDP пакете содержится только IP адрес и порт, в отличие от TCP пакета.


      А что такого содержится в TCP пакете, что не позволяет использовать данную технику?
        0
        TCP соединение основано на первоначальном коннекте и связывает два пира между собой, то есть другой пир это соединение использовать не сможет (без особых ухищрений, которые не всегда возможны), через TCP можно организовать только прозрачный туннелинг
          0
          Это да. А что в пакетах TCP такого есть чего в пакетах UDP нету?
            +1
            Sequence и Acknowledgement numbers
        +1
        Получите плюс в карму, давно мучался с пробиванием PPTP через NAT
          0
          Спасибо!
          0
          A и B устанавливают UDP соединение с сервером Hamachi
          UDP соединения не бывает. UDP — протокол без подтверждения доставки пакета.

          1) A и B устанавливают tcp-соединения с сервером Hamachi (что подтвержается tcpdump'ом или другим снифером).
          2) A и B получают IP адреса от сервера Hamachi (например 10.0.0.5 — A, 10.0.0.6 — B, и Hamachi — сервер 10.0.0.1)
          3) A и B получают маршруты (ходить в сеть 10.0.0./24 через шлюз 10.0.0.1).
          4) Hamachi-сервер в данном случае тупо работает как роутер.
            0
            UDP соединения не бывает.
            Да, спасибо, надо было быть точнее в определениях. Хотя, иногда UDP connection называют p2p диалог.

            4) Hamachi-сервер в данном случае тупо работает как роутер.
            Довольно накладно, если нам надо пересылать кучу информации (аудио, видео) при большом количестве пользователей.
              0
              4) У Хамачи тоже возможно прямое соединение при условии что вы покупаете у них лицензию, которая стоит ~5 енотов в месяц на одну машину

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое