Comments 46
Спасибо! Раньше использовали Hamachi для игры в Age of Wonders 2, но что-то потом он стал сильно тормозить и ограничивать число людей в созданной сети.
Висит уже месяц проблемка соединить несколько удалённых машин за своими NAT и тут вы со своим обзором. Как раз вовремя.

Спасибо! (Жалко нет кармы проголосовать, но человеческое Спасибо и так вроде ещё ценится :) )
Почему именно его? Чем хорош?
Будут соединяться несколько удалённых серверов и несколько удалённых рабочих машин в одну сеть.
Посмотрел в дистрибутиве. нашел только tinc и n2n.
Про n2n можете что-нибудь сказать?
Бета, есть известные ошибки в безопасности, не рекомендуется для использования.
Сервера нет. Все ноды — клиенты. Одна выпала — ну и что, все остальные работают.
Да, уже понял как оно работает. А есть реальные use-cases и отзывы, как оно по стабильности и latency?
Спасибо! Тоже очень нужно.

Может быть, кто-то сможет подсказать также волшебное решение (среди вышеперечисленных или другое), которое хорошо работает по каналу с 3-5% packet loss, и быстро пересоединяется в случае дисконнекта одной из нод?
Если для сервера, то tinc. Ему пофигу дисконнекты, если использовать udp. Ну и от одной упавшей ноды ничего не поменяется.
Попробую, спасибо. У меня задача — репликация относительно быстро меняющейся базы по ужасному каналу, который даже до мегабита не дотягивает, между несколькими машинами с динамическими IP, в общем, судя по всему, как раз для tinc. :)
Это наверно habrahabr.ru/post/147747/ надо почитать — ставятся два устройства (или две виртуалки) и добавляют избыточность в трафик, чтобы компенсировать потери и всякие беды с пакетами.
Мне интересно, есть ли что-нибудь такое, вроде teamviewer или mikogo, но не для удаленного рабочего стола, а для консоли. Чтобы я мог, например, подключиться с телефона или другого компьютера к моему компьютеру под linux, независимо от NAT.
Если я правильно понял вашу задачу, то вам подойдет любое из перечисленных решений + SSH (подключиться к консоли) + byobu (там может в одной консоли одновременно работать любое количество пользователей, кроме того, можно создавать неограниченное количество новых консолей).
Еще есть Campagnol — P2P VPN с использованием UDP Hole Punching и поддержкой шифрования. Linux, *BSD, Windows (Cygwin). GPLv3.
А почему Hamachi нет в списке? Есть бесплатная версия. У меня кучка серверов на Linux, виндовые десктопы. Пару долларов в год можно потратить. Зато удобно и просто.
GNU Virtual Private Ethernet
OpenSource. Linux. По идее, должен собираться под другие юниксы, но я сам не пробовал

Очень простой в настройке, сервер-ноды нет, тунеллирует L2 разными способами (raw IP, UDP, TCP, HTTPS-proxy-connect, ICMP, DNS), пробивает NAT.
Я правильно понял, что он не является пиринговым в полной мере? Исходя из их описания, каждую ноду надо конфигурировать вручную и указывать ее реальный ip.

Хотелось бы иметь что-нибудь вроде hamachi, чтобы оно само конфигурировалось и определяло оптимальный маршрут до конечной ноды.
Нет, нода может и без реального ипшника быть доступна (требуется лишь чтобы часть нод имели «белый» IP адрес). Для этого он может роутить пакеты транзитом через узлы (src ip и dst ip в пакетах специально идут нешифрованные) и пробивать NAT.

Конфигурируется всё вручную.
Вот ещё нашёл:
  • FreeLAN — (Open Source, Windows, Linux, Mac OS, C++)
    Поддерживает IPv6, авторизация по X.509 сертификатам, пробивает NAT (всё-равно нужна хоть одна нода с внешним IP или проброшенным портом, как и для PeerVPN, GPVE и дальше в моём списке)
    HTTPS сайт использует недоверенный сертификат
  • fastd — (Open Source, Linux, OpenWRT, C++)
    Крайне легковесный (100кб), та же история с NAT, интересные Benchmarks
    HTTPS сайт использует недоверенный сертификат
  • Cjdns — это зашифрованная IPv6 сеть, в которой используются публичные ключи шифрования для присвоения публичного адреса и распределённой таблицы маршрутизации (DHT). Это позволяет создавать сети с очень простой настройкой, которые будут защищены от потенциальных проблем ныне существующих IPv4 и IPv6 сетей.

    Интервью с автором на Хабре


Вот никак не найду подходящий вариант для случая, когда у меня виртуальная машина, которую я мог бы раздать условно кому угодно и при их загрузке они бы просто подключались к моему кластеру по VPN, забирали задачи из очереди и выполняли свою работу. Для этого мне нужно чтобы назначение IP происходило как-то более-менее централизованно или просто гарантированно без коллизий. Или это я себе OpenVPN придумал? :)
А зачем вам вообще VPN для такого случая? Или кластер тоже за NAT? Может, miredo подойдет?
Да, кластер тоже за NAT.

А есть что-то ещё кроме офсайта хорошего про эту miredo? А то у меня от их Miredo/Teredo и просмотренных за сегодня всех найденных альтернатив голова кругом.
Miredo — реализация протокола Teredo для туннелирования IPv6. По сути, это не VPN, это просто даст вам белый IPv6-адрес и доступ в IPv6-сеть через какой-то туннелирующий сервер (renlab, microsoft или какой-то другой).
К Cjdns:

(Open Source, tested on x86, amd64, ARMv5, ARMv7, MIPS, and PowerPC (continually tested on Linux, FreeBSD, OS X, and Illumos systems))
Вот никак не найду подходящий вариант для случая, когда у меня виртуальная машина, которую я мог бы раздать условно кому угодно и при их загрузке они бы просто подключались к моему кластеру по VPN, забирали задачи из очереди и выполняли свою работу.

На чем в итоге остановились?

Ничего 100% подходящего не нашлось, так что взял просто самое стабильное решение с пробрасыванием порта — OpenVPN.

Здравствуйте.
Какие ещё появились альтернативы для соединения двух или более узлов через интернет, гд все они спрятаны за NAT и Firewall, без неободимости пробрасывать порт и без наличия внешнего IP?
Я так понимаю пока что остаются только SocialVPN/GroupVPN и Wippien.
Минутка рекламы :). Год назад в рамках димломного проекта разработал подобное решение на основе libtoxcore. Решение изначально разрабатывалось полностью на C, но потом начал переводить на C++. Поэтому не серчайте касательно качества кода. Билды забрать можно здесь. Был бы благодарен, если бы кто-то помог портировать на Windows. Я видел, что есть devtun driver для windows, который по теории должен помочь в этом.

На данный момент последний билд находится по ссылке https://gitlab.com/denis4net/toxvpn/builds/1166411/artifacts/file/toxvpn, если мне не доверяете, то можете собрать сами. Makefile и .gitlab-ci вам в помощь.


$ wget https://gitlab.com/denis4net/toxvpn/builds/1166411/artifacts/file/toxvpn

Извините, установка доволи не user-friendly, пока нету инсталлера. Все инструкции в make install:


$ export OUTFILE=toxvpn
$ export PREFIX=/usr
$ install -m 0755 $(OUTFILE)  $(PREFIX)/bin/$(OUTFILE)
$ mkdir -p $(PREFIX)/lib/systemd/system/
$ setcap cap_net_admin+ep $(PREFIX)/bin/$(OUTFILE) # позволяет запускать toxvpn без админских прав 
$ mkdir -p /var/run/toxvpn # здесь будет хранится IP адресов клиентов (memory mapped file)

Если не хочется разбираться, то:


$ chmod a+x ./toxvpn
$ sudo ./toxvpn -h

usage: ./toxvpn options
-h      show help
-s <secret>  use passed hex secret
-p <proxy>   use socks|http://hostname:port> proxy server
-n <subnetwork/prefix length>
-c <address>:<secret>    connect to server using tox address
-f <file>   load/save settings from/to file

Запускаете "сервер". На самом деле, это что-то вроде "master-authenticator".


Starting toxvpn 0.0.988608 593a5165de7dbcef9b0d9f7cdecc03b28fecd3b3
Hostname: denis-book
Your address 6WJw9C7rdY5cC3NbEVtWRpr4ZQHHKPAF91Ud17x4hk3vYbuZp6Rc:52CiKXtQ4jJhB2y94q63kfXZwNd1BWmQKKN1m2c2j7W4
Listening on 33445/udp 0/tcp
[25] Added address 10.239.205.236 on "tun0"
[25] created interface "tun0" 10.239.205.236/24
[25] Connecting to "185.25.116.107:33445" DHT node
[25] Connecting to "198.46.138.44:33445" DHT node
[25] connected to DHT via UDP
^T[25] Received Tox friend request from 6B593C02E5C99192 with attached secret "3BBD925FC39BC17D1246A95465C2F7A5ABF6027CB7A7B7C44FA81DE8B2DE602D"
[25] Approved friend 0 with PK 9291C9E5023C596BBD0A2EB10840CBF5FC8A22018D6A69FB93DE73360FB17566
[25] Connected friend 0 via UDP
[25] Received membership response - toxvpn_id: A982A6C5, friendnumber: 0, flags: 1
[25] broadcast new members table. Reason: new member was added

Копируете адрес Your address = 6WJw9C7rdY5cC3NbEVtWRpr4ZQHHKPAF91Ud17x4hk3vYbuZp6Rc:52CiKXtQ4jJhB2y94q63kfXZwNd1BWmQKKN1m2c2j7W4


И запускаете последующих клиентов


[worker@denis-book out]$ sudo ./toxvpn -c 6WJw9C7rdY5cC3NbEVtWRpr4ZQHHKPAF91Ud17x4hk3vYbuZp6Rc:52CiKXtQ4jJhB2y94q63kfXZwNd1BWmQKKN1m2c2j7W4
Starting toxvpn 0.0.988608 593a5165de7dbcef9b0d9f7cdecc03b28fecd3b3
Hostname: denis-book
Your address NgYTLGXGyihxyUqcRrtvrRvTuqKsQCpHLDZmZbVxtnV1kabPHa4z:52CiKXtQ4jJhB2y94q63kfXZwNd1BWmQKKN1m2c2j7W4
Listening on 33446/udp 0/tcp
[92] Added node 6WJw9C7rdY5cC3NbEVtWRpr4ZQHHKPAF91Ud17x4hk3vYbuZp6Rc
[92] Connecting to "198.98.51.198:443" DHT node
[92] Connecting to "198.98.51.198:443" DHT node
[92] connected to DHT via UDP
[92] Connected friend 0 via UDP
[92] created interface "" 10.239.205.229/24
[92] Received request - toxvpn_id: A982A6C5, friendnumber: 0, flags: 0
[92] Added address 10.239.205.229 on "tun1"
[92] sending a toxvpn invitation response to 0
[0x1f77848] added vpn member 10.239.205.236:0 to table
[0x1f77848] added vpn member 10.239.205.229:-2 to table
[92] broadcast new members table. Reason: new members table was received

Если у вас есть права доступа для записи в /var/run/toxvpn или запустили от root, то в /var/run/toxvpn появятся memory mapped file с таблицой ip адресов клиентов:


$ sudo cat /var/run/toxvpn-members.16072 

vpn A982A6C5 2
10.239.205.236  25375AEC67FFC7077BD5D4D5295FA72E9B01A349FB0CF7C22DF4302D185EE476    denis-book
10.239.205.229  9291C9E5023C596BBD0A2EB10840CBF5FC8A22018D6A69FB93DE73360FB17566    denis-book

Ну и


$ ip -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
...
11: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1300 qdisc pfifo_fast state UNKNOWN group default qlen 500
    inet 10.239.205.236/24 scope global tun0
       valid_lft forever preferred_lft forever
12: tun1: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1300 qdisc pfifo_fast state UNKNOWN group default qlen 500
    inet 10.239.205.229/24 scope global tun1
       valid_lft forever preferred_lft forever

Маленький ликбез. Адрес узла состоит из двух частей:


  • base58 его публичного ключа
  • base58 shared secret, который используется всеми узлами.

Буду благодарен за любой фидбэк, pullrequestы и ревью безопасности архитектуры.

Вопрос был о том, как оно устроено, а не так, как его собрать и использовать. Tox используется только для поиска пиров, пробива NAT и согласования ключей?
Да, вы правы.
Используется libtoxcore:
DHT (похожа на ту, что используется в Bittorrent протоколе) и их bootstrap узлы.
— Nat traversal.
— Криптография (libsodium).

Для создания tunX тунеля используется `/dev/tun` интерфейс.

Адрес пира назначается таким образом (есть механизм разруливания коллизий):
ip_addr = tox_pub_key | netaddr;


Пиры соединяются p2p, boostrap-node («server») используется только для того, чтобы «новый» клиент мог войти в сеть, получить адреса других узлов и их public keys. Хотя это вероятно не лучшая задумка, это пока PoC.

После установки соединения через tox транспорт, проверяется shared secret, который должен быть одинаков у участников сети. Shared secret можно указать, использую аргумент `-s`, иначе он будет сгенерирован случайным образом (часть в адресе после `:` ).

Если у вас остались вопросы — задавайте!

P.S. Извините, промахнулся.
Only those users with full accounts are able to leave comments. Log in, please.