Вопрос или проблема
WireGuard: три узла, соединенные линейно, UDP поверх TCP только для одного соединения
У меня есть три пира в сети WireGuard:
- Пир J находится за стандартным корпоративным файрволом, блокирующим все исходящие UDP,
- Пир S – это сервер со статическим IP, и
- Пир P – это мой смартфон.
Нет UDP на выход;
+-----------+ (Статический IP)
| Peer J ---|--- Peer S ------ Peer P
+-----------+ [Обычный wg]
Итак, UDP через TCP
Я хочу подключить пир P к пир J (P ssh на J) через WireGuard, где J и S соединены по UDP через TCP (используя wangyu-/udp2raw), в то время как S и P имеют нормальное UDP-соединение.
Я справился с соединениями между J и S, а также между P и S. Но я не могу заставить P подключиться к J. У меня нет опыта в компьютерных сетях, поэтому идеальное решение для меня было бы в рамках WireGuard или, надеюсь, только с простыми правилами iptables.
Вот моя попытка на данный момент:
Peer J
[Interface]
# PublicKey = E8K...
PrivateKey = ...
Address = 10.0.6.3/24
MTU = 1342
PreUp = /usr/bin/udp2raw -c -l 127.0.0.1:50001 -r <IP интернета S>:443 -k "secret" -a >/var/log/udp2raw.log 2>&1 &
PostDown = killall udp2raw || true
# Peer S
[Peer]
PublicKey = Yf3...
AllowedIPs = 10.0.6.0/32
PersistentKeepalive = 120
Endpoint = 127.0.0.1:50001
Peer S
[Interface]
# PublicKey = Yf3...
PrivateKey = ...
Address = 10.0.0.0/24, 10.0.6.0/24
MTU = 1342
ListenPort = 80
PreUp = /usr/bin/udp2raw -s -r 127.0.0.1:80 -l <LAN IP S>:443 -k "secret" -a >/var/log/udp2raw.log 2>&1 &
PreDown = killall udp2raw || true
# Peer J
[Peer]
PublicKey = E8K...
AllowedIPs = 10.0.0.3/32, 10.0.6.3/32
PersistentKeepalive = 120
# Peer P
[Peer]
PublicKey = wlx...
AllowedIPs = 10.0.0.1/32, 10.0.6.1/32
Peer P
[Interface]
PublicKey = wlx...
Address = 10.0.0.1/32, 10.0.6.1/32
MTU = 1342
# Peer S
[Peer]
PublicKey = Yf3...
AllowedIPs = 10.0.0.0/24, 10.0.6.0/24
Endpoint = <IP интернета S>:80
Проблема: На пире P пинг к 10.0.6.3 не удался (но пинг к 10.0.6.0 работает). Пиры S и J могут нормально пинговать друг друга через 10.0.6.0/10.0.6.3.
Ответ или решение
Для решения вашей проблемы с подключением Peer P к Peer J через Peer S с использованием WireGuard и UDP через TCP, необходимо внести некоторые изменения в конфигурацию и проверить настройки маршрутизации и файрволов. Давайте рассмотрим конфигурации каждого из пиров.
1. Peer J
Конфигурация Peer J должна быть корректной, но убедитесь, что у вас правильно настроены разрешённые IP-адреса:
[Interface]
PrivateKey = ...
Address = 10.0.6.3/24
MTU = 1342
PreUp = /usr/bin/udp2raw -c -l 127.0.0.1:50001 -r <S's internet IP>:443 -k "secret" -a >/var/log/udp2raw.log 2>&1 &
PostDown = killall udp2raw || true
[Peer]
PublicKey = Yf3...
AllowedIPs = 10.0.6.0/32
PersistentKeepalive = 120
Endpoint = 127.0.0.1:50001
2. Peer S
Убедитесь, что Peer S правильно настроен для обработки трафика между Peer J и Peer P. Здесь также важна корректность AllowedIPs:
[Interface]
PrivateKey = ...
Address = 10.0.0.0/24, 10.0.6.0/24
MTU = 1342
ListenPort = 80
PreUp = /usr/bin/udp2raw -s -r 127.0.0.1:80 -l <S's LAN IP>:443 -k "secret" -a >/var/log/udp2raw.log 2>&1 &
PreDown = killall udp2raw || true
[Peer]
PublicKey = E8K...
AllowedIPs = 10.0.0.3/32, 10.0.6.3/32
PersistentKeepalive = 120
[Peer]
PublicKey = wlx...
AllowedIPs = 10.0.0.0/24, 10.0.6.0/24
3. Peer P
Конфигурация Peer P также должна включать разрешённые IP для доступа к Peer J через Peer S:
[Interface]
PrivateKey = ...
Address = 10.0.0.1/32, 10.0.6.1/32
MTU = 1342
[Peer]
PublicKey = Yf3...
AllowedIPs = 10.0.0.0/24, 10.0.6.0/24
Endpoint = <S's internet IP>:80
Проверка маршрутизации и файрволов
-
Маршрутизация: Убедитесь, что маршрутизация работает корректно на всех пирах. Выполните
ip route
илиroute -n
на каждом пиру и проверьте, чтобы трафик шёл через соответствующие интерфейсы. - Файрвол: Убедитесь, что файрвол (например, iptables) на всех участниках сети не блокирует соединения. Добавьте следующие правила на Peer S, чтобы разрешить Forward:
iptables -A FORWARD -i wg0 -o wg0 -j ACCEPT
iptables -A FORWARD -i wg0 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o wg0 -m state --state ESTABLISHED,RELATED -j ACCEPT
- Ping с Peer P на Peer J: После выполнения всех вышеуказанных настроек выполните команду
ping 10.0.6.3
с Peer P. Если всё настроено правильно, пинг должен пройти.
Заключение
Если после выполнения всех вышеупомянутых шагов проблема остаётся, необходимо проверить журналы на каждом из пиров, чтобы выявить возможные ошибки в подключении или маршрутизации. С помощью wg show
можно получить информацию о состоянии соединений WireGuard. Вы также можете проверить логи udp2raw, если они содержат ошибки при обработке трафика.
Убедитесь, что все публичные ключи правильно соответствуют друг другу и что в конфигурациях указаны правильные IP-адреса и ключи.