Comments 31
А как вообще на низком уровне осуществляется обход NAT? Допустим у меня есть два компьютера, подключенные к разным провайдерам, оба за NAT. И я хочу их соединить скажем по протоколу UDP. Простейшая самописная программка, умеющая отправлять и получать UDP пакеты. C одного отправляем пакет - на другом получаем. Что для этого нужно сделать? При этом у меня нет никакого внешнего сервера со статическим IP.
NAT не блокирует связь полностью. Это как бы динамическая трансляция определенного внешнего порта на определённый внутренний порт определенного клиента, сидящего за NAT. Не понятно? Допустим твой браузер стучится на определенный ip на порт 80. Для этого твой комп открывает внешний порт и стучится в дефолный шлюз, который видя такой запрос открывает внешний порт и пересылает пакет. Куда? а на свой дефолтный шлюз, где цепочка повторяется. Как ответный пакет идет назад? А просто: вместе с выходным портом открывается входной, который и транслируется на входной порт предыдущего клиента NAT. Так ответ сервера добирается до твоего компа. Поэтому обойди Nat без внешнего сервера в принципе невозможно, кто-то должен сообщить этот динамический входной порт. Пусть даже сам трафик через этот промежуточный не гнать....
Если Вы не управляете хотя бы одним НАТом, то задача не решаема без внешнего белого ИП.
Допустим, внешнего IP ни одного хоста я не знаю, но допускается использование простейших внешних открытых ресурсов - желательно простейших http, таких как веб-сайты на бесплатном хостинге, может быть какие-то богом забытые чаты, в общем что угодно куда компьютер может периодически выкладывать некоторую строку данных, содержащую тот же внешний IP, полученный из сервисов типа jsonip.com
Если использовать простые (запоминает отображение публичного ключа пользователя на его внешние IP:port) сервисы по условиям задачи можно, то есть WireGuard и nat-hole-punching - берём две машины за NAT и иногда (скажем раз в час) запускаем на них nat-puch-client - инструкция есть в README.
В случае, если своего сервера нет, можно использовать (вместо "1.2.3.4" в README) публичный сервер demo.wireguard.com - никакой существенной нагрузки это не создаст, сервер получает запрос по UDP и отвечает на него, передавая за раз около одной сотни байт.
Можно использовать https://github.com/samyk/pwnat но как вам уже написали все равно нужно знать внешний ip одного из хостов. Для этого можно использовать https://en.wikipedia.org/wiki/Distributed_hash_table
Или вот по той же схеме настроить i2p-туннель.
Там есть варианты для UDP-туннеля, или можно по туннелю поднять PPP, в нем IP, и уже в нем UDP...
Прочитайте про STUN сервер, один из вариантов обхода NAT.
Вы можете связать оба ваших хоста через сеть ZeroTier, она работает по TCP. У них буду статические IP-адреса, из вашей ZT-подсети. Администрировать будете через официальный веб-интерфейс. Всё что требуется -- это установить клиенты на каждую из машин, запросить подключение к вашей сети и авторизовать его в веб-морде.
Ставите ZT, устанавливаете и указываете в своей програмке zt-адрес нужного хоста:
1. Команда установки
2. Команда проверки статуса, чтобы удостовериться в установке
3. Команда join для подключения к вашей сети
4. Авторизовать новый хост в веб-интерфейсе
5. Скопировать выданный адрес из интерфейса в строку подключения вашей программы.
(Для windows -- это несколько окошек и кликов, соответственно)
Публичный сервер-ретранслятор предоставляют разработчики, если у вас нет возможности поднять свой. Технически, это P2PVPN, подробнее можно почитать тут:
https://www.zerotier.com/
https://habr.com/ru/companies/ruvds/articles/484178/
https://habr.com/ru/companies/ruvds/articles/539322/
А зачем такие извращения? Тот же Wireguard банится только при коннектах за границу, на свой домашний роутер в РФ спокойно по нему можно зайти. Zerotier недавно добавили в Keenetic, тоже не банится внутри страны (да и за пределами тоже).
В статье есть ключевое слово NAT от провайдера. И на свой роутер Вы не зайдете, если Ваш провайдер держит Вас за натом. Мой например держит порядка 10к пользователей за натом. У всех 10к один IP адрес. Да, такое есть сплошь, и рядом.
Проблема что есть вариант проще если это стандартные приложения на основе http https то. Можно найти в России vps и ципануть его туда в. Так как из нутри России все ок работает ничего н юе блочат
А если вас кинетик то это он может сделать сам через свой Клауд и без белого ip а ещё можно поставить we admin на машинку и заходить через web на ssh
Я прямо в статье пояснил почему не Zerotier. Распишу подробнее, почему совсем-совсем не Zerotier. Обратимся к википедии:
ZeroTier, Inc. is a software company with a freemium business model based in Irvine, California. ZeroTier provides proprietary software, SDKs[1] and commercial products and services to create and manage virtual software-defined networks.
Ещё раз.
ZeroTier provides proprietary software
ZeroTier is a company with a freemium business model
ZeroTier based in Irvine, California.
Zerotier подвержен не только потенциальной блокировке РКН, которая может быть осуществлена элементарно (путём бана аутентификационного сервера), но и экспортным ограничениям США. Да и какой-нибудь из их менеджеров может просто сказать: "Зачем эти русские занимают наши ресурсы, оплатить-то российской картой премиум они всё равно не могут. Давайте-ка их забаним."
Поэтому я рекомендую выбирать децентрализованные решения на базе свободного ПО. Нарушить их работу гораздо сложнее.
Вы можете поднять и Moon, и Planet на своём сервере, тогда блокировка будет не страшна, но базово, конечно, да -- с ZT больше рисков.
Если под Planet и Moon подразумевается то, что гуглится по запросу "Planet VPN" и "Moon VPN", то это мягко говоря, инструмент совершенно не для означенного в задаче юзкейса. А если нет - то было бы неплохо конкретизировать, что вы имели в виду, чтобы я пришёл и тоже раскритиковал.
Прошу прощения, если задел. Не критиковал, лишь хотел раскрыть для будущих читателей.
В разрезе ZT, если память мне не изменяет: Moon -- это сервер для (не знаю, как лучше сформулировать) обеспечения связи, он позволяет клиентам восстанавливать подключение. Planet -- это сервер для установления связи. То есть без планеты не подключить новых машин, но если есть луны, то уже существующая сеть продолжит работать.
upd. Можно увидеть здесь: https://docs.zerotier.com/roots
Прошу прощения, если задел.
Ни в коем случае не задели. Наоборот, это я тут сижу такой вредный и всех критикую. А ссылка интересная. В то же время,
Using moons is now discouraged. Please contact us for advice and alternatives.
Почему это не рекомендуется, и как с этим жить, в инструкции, увы, не раскрыто, чтобы судить, насколько это хороший вариант.
Ростелеком банит wg в пределах моего города, но до другого оператора (проверял в с телефона через ртк не идут пакеты, отключаюсь от wifi и сразу же подключаюсь через мобильный интернет - всё ок, обратно в wifi - нет ничего)
Единственно, что это не перманентно, то банит, то нет.
Есть ли какие-то сравнительные данные по производительности этих решений?
Производительности в каком плане? Конкретных цифр не дам, могу накидать субъективно.
Если интересует производительность в плане потребления системных ресурсов, то я как-то раз спокойно помещал yggdrasil и i2p на виртуалку с двумя потоками процессора и 1024 мегабайт памяти. Деградации на основных задачах не заметил.
Если интересует производительность в плане скорости интернета внутри оверлея, то на yggdrasil деградации тоже не заметил, а вот на i2p задержки заметны даже при подключении по ssh.
Я могу ошибаться, но возможно вам поможет Tailscale или ddns
Tailscale не является свободным ПО и имеет центральные серверы, теоретически подверженные блокировке. DDNS не пробивает NAT.
Честно говоря тоже не совсем понял всех этих усложнений, когда все это решается через ddns и скрипт в кроне на обновление записей DNS в одну строчку
Самая всепролазная сеть из более или менее распространённых - это i2p. Помнится, нарулил подобным образом доступ по SSH к сервачку, и через некоторое время поломал настройки сети на нём, даже по локалке к нему было подключиться невозможно, а при физическом подключении даже "восьмёрки" не пинговались. Так вот, доступ через i2p к этому серверу был жив
Использование оверлейных сетей для обхода NAT