Pull to refresh

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 и отвечает на него, передавая за раз около одной сотни байт.

Или вот по той же схеме настроить i2p-туннель.
Там есть варианты для UDP-туннеля, или можно по туннелю поднять PPP, в нем IP, и уже в нем UDP...

Хочется избавиться от любых сложных зависимостей, требующих нетривиального администрирования (Yggdrasil, I2P и т.д.) Выше я уточнил что оба компьютера могут выходить в обычный интернет и писать/читать текстовые строки по некоторым заранее известным URL. Достаточно ли этого для пробивки NAT?

Вон про STUN написали, но это не "текстовые строки", это чуть сложнее

Прочитайте про STUN сервер, один из вариантов обхода NAT.

Стоит ещё добавить что существуют публичные STUN сервера если своих нет

Вы можете связать оба ваших хоста через сеть 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 в одну строчку

Через DDNS это решается только при наличии белого, хотя и динамического, IP-адреса.

В статье же описывается случай, когда белого IP у клиента вообще нет.

Самая всепролазная сеть из более или менее распространённых - это i2p. Помнится, нарулил подобным образом доступ по SSH к сервачку, и через некоторое время поломал настройки сети на нём, даже по локалке к нему было подключиться невозможно, а при физическом подключении даже "восьмёрки" не пинговались. Так вот, доступ через i2p к этому серверу был жив

Я слышал, будто i2p спокойно работал в Китае где-то в 2019 году. Как сейчас обстоят с этим дела, я не знаю.

Sign up to leave a comment.

Articles