LINUX.ORG.RU
ФорумAdmin

UDP Hole Punching

 , , , ,


0

2

Привет. Я краем уха слышал, что wireguard помогает делать UDP Hole Punching без всяких приседаний.

Представим, что есть сервер с белым IP (СБ), клиент_1 за натом (К1) и клиент_2 за натом (К2). Нужно установить прямое соединение между К1 и К2. В идеале, было бы просто слать на адрес в впн сети К1->К2, и оно само там разбирается, что лучше слать пакеты не через сервер. Но это так не работает, пакеты идут через сервер.

ОК, тогда вопрос 2 - если настроена ВПН ВГ сеть, отсылают ли клиенты друг другу специально пакеты для поддержания udp портов открытыми, чтобы можно было слать пакеты от одного клиента другому? Или пакеты идут только сервер<->клиент и ВГ ничем здесь не помогает?

Если ответ на последний вопрос «да». На десктопе я как-нибудь разберусь, К2 запишет свой адрес в DDNS, в К1 подниму ВГ, а дефолтным шлюзом сделаю К2 (запись в DDNS), и буду слать данные напрямую от К1 к К2. А что если К1 - андройд/айфон, там вообще есть варианты установить дефолтный шлюз? Я так посмотрел, вижу только для статический настроек, мне же нужно задать лишь шлюз



Последнее исправление: kvpfs_2 (всего исправлений: 1)

Пусть не ВГ. Вообще, так-то не его это дело бороться с IPv4 и что IPv6 никак не придёт. Знаете ли какую лёгкую софтину, накатить что-то на белом сервере, на клиентах за натом, а клиенты пинговали бы друг друга для поддержания портов открытыми получая ip друг друга у сервака. Клиенты на мобилках должны быть обязательно, и оно должно быть очень легким

kvpfs_2
() автор топика

У клиентов на Нате есть белый айпи, значит просто делаешь статический проброс порта на нате и всё

no-dashi-v2 ★★★★
()

Хотелось чего-нибудь простого, на базе ВГ. Всё упирается в эти ничего немогущие телефоны. Вот если это нормальные хосты с линуксом, то вот как я себе это представляю для соединения двух клиентов за натом:

Между хостами ВГ. Каждый хост обновляет свой внешний адрес в каком-нибудь DDNS. На каждом крутится скрипт, который проверяет, изменился ли адрес другой стороны в DDNS. Если изменился, то правит адрес peer’а в ВГ конфиге и вызывает wg synconf. Кажется, что достаточно просто и надёжно, но эти чертовы телефоны, какой скрипт на них можно запустить, какая правка конфига, какой нафиг synconf

kvpfs_2
() автор топика

Я тут выяснил, что симметричный NAT в мобильных сетях - обычное дело, так что с прямым п2п нет смысла пытаться

kvpfs_2
() автор топика
Ответ на: комментарий от Pinkbyte

Так вся суть была в «сделать прямое П2П». А если с релеем, то так-то уже белый сервер есть, девайсы в одной сети, через центральный сервер гонять данные не проблема.

Идея была в том, что телефоны отправляют трафик на девайс за натом, тот занимается роутингом, смотрит какой трафик куда отправлять, так как телефоны сами толком ничего серьезного сделать не в состоянии (особенно андройды, их высокороневые говноабстракции падают и исключениями). Ну может если только есть на девайсе рут, то написать правила непосредственно в «netfilter’е» ос, ipset и всё такое

kvpfs_2
() автор топика
Ответ на: комментарий от kvpfs_2

Фича тех же Zerotier/Tailscale(хз насчет Netbird, не щупал его) в том, что релей ТЕБЕ подымать не обязательно, если задача - обеспечить хоть какую-то связность между любыми узлами(на случай особоанальных NAT, читай как мобильные клиенты) - релей уже есть в облаке. Если нужны определенные гарантии по скорости - то конечно придется подымать свой релей.

Pinkbyte ★★★★★
()

Мужчины, вот что выяснил - тот клиент (К0), к которому хочу подключать мобилки, он Full Cone NAT. Т.е. если я однажды отправляю с него куда угодно udp пакет, то принимать я могу на этот порт уже с любого ip:port, т.е. мобильные клиент могут просто начать слать данные на внешний адрес этого клиента с Full Cone NAT. Т.е. анальный симметричный NAT мобилок должен обходиться.

Сперва думал, что смогу создавать DDNS запись вида ip:port of (K0), в конфиге мобилок Peer будет записан в виде имени, которое будет резолвиться на старте в нужный ip:port. Поддержание дыры в NAT of K0 - не проблема, там обычный линукс, который будет пинговать мой сервак и при смене ip:port обновлялась бы запись в DDNS. Но оказалось, что в DDNS нельзя писать номер порта. Есть некое DNS SRV (глубоко не копал), которое это поддерживает, но это не поддерживает WG.

Будь бы вместо мобилок обычный хост, проблему бы решил тривиально, какой-нибудь скрипт запрашивал бы актуальный внешний IP:port клиента, к которому делаем коннект, правил бы конфиг и перезапускал бы WG. Но это мобилки, сделать этого не могу/не знаю как, никаких скриптов и своей писанины, инструментарий лишь из сторов.

Имея такое дано (можно запросить актуальный ip:port у своего белого сервера, протокол любой, могу поднять что угодно на нужном порте), можно ли поднять какой-нибудь VPN (openvpn, etc, только не закрытое что-нибудь), назначая правильный ip:port второго пира хотя бы на старте VPN?

kvpfs_2
() автор топика
Последнее исправление: kvpfs_2 (всего исправлений: 2)
Ответ на: комментарий от ValdikSS

Это не проблема, да и с этим сам ВГ справляется, он ведь держит коннект с белым сервером, подкрутить KeepAlive и готово. В ВГ конфиге клиента за full cone nat’ом просто добавить ещё один peer (телефон), когда он постучится на внешний порт, то станет частью сети. Актуальный адрес:порт пира за full nat’ом есть у этого белого сервера.

Проблема с ВГ клиентом на телефоне, вот как сообщить при включении ВПН, что адресс и порт пира вот такие вот? Можно записать в виде имени, которое будет резолвено в актуальный адрес, но вот как сообщить номер порта - хз. Это телефон, никакой скриптоты сверху не накинуть, каких-то возможностей вроде «загрузка конфига по https» я не вижу, DNS SRV не поддерживается. Патчить клиента? Не, это слишком

kvpfs_2
() автор топика

что лучше слать пакеты не через сервер

Добро пожаловать в Yggdrasil!

Есть поддержка всех ОС. В том числе Android. Ещё iOS, но там надо будет одному пареньку написать, если что дам контакты.

th3m3 ★★★★★
()
Последнее исправление: th3m3 (всего исправлений: 1)
Ответ на: комментарий от th3m3

Спасибо, это правда интересный вариант. Я бы его и заюзал, вот только очень силно смущает механизм получения клиента для iOS. Мне нужно накатить на десяток телефонов «домохозяек», а там всё бета, нужно писать кому-то, а по итогу могут и на юг отправить. Звучит очень хрупко

kvpfs_2
() автор топика
Ответ на: комментарий от kvpfs_2

Wireguard это просто примитивный туннель. Вам, похоже, нужна full-mesh сеть, её вам уже посоветовали выше: tailscale/zerotier.

ValdikSS ★★★★★
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария