LINUX.ORG.RU
ФорумAdmin

Перенаправить udp траффик через wireguard

 , ,


0

1

Есть условная VPS (публичный сервер), на которой работает wireguard и проброшен порт в приватный сервер на другой стороне туннеля wireguard. В общем, по сути почти то же самое, что описано в этом блоге https://www.procustodibus.com/blog/2022/09/wireguard-port-forward-from-internet/#policy-routing. Поэтому и инструкция оттуда работает. Но не совсем. Работает только для трафика tcp, для udp не работает. Проверено через iperf3 и netcat. Думаю, потому что udp ответ идёт не в wireguard.

# почти полностью калька с procustodibus
# /etc/wireguard/wg0.conf

# local settings for the private server
[Interface]
PrivateKey = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEE=
#только свой ip здесь
Address = 172.17.49.2
Table = 123
# и здесь
PreUp = ip rule add from 172.17.49.2 table 123 priority 456
PostDown = ip rule del from 172.17.49.2 table 123 priority 456

# remote settings for the public server
[Peer]
PublicKey = fE/wdxzl0klVp/IR8UcaoGUMjqaWi3jAd7KzHKFS6Ds=
Endpoint = my-dyndns-address.com:51822
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

Как сделать, чтобы работало для udp? Делал подобное на mikrotik через маркировку трафика, здесь подобное как-то применить?

Немного уточнений, которые, как мне кажется, не влияют на ситуацию. В качестве публичного сервера роутер OpenWRT, он за роутером провайдера, на роутере провайдера оптика, белый адрес, проброс портов (tcp, udp) в роутер OpenWRT. В качестве приватного сервера контейнер c debian в Proxmox.

★★★

В правилах nftables особо не подскажу, я его ещё не изучил, использую iptables по привычке.

Но сам wireguard работает по протоколу UDP.

В правилах NFT стоит:

iifname $pub_iface udp dport $wg_port accept

Я могу ошибаться, может ещё где есть. Но тебе по сути нужно разрешить принимать входящий UDP трафик на внешний входящий интерфейс с номером порта, который слушает wireguard и DHCP трафик для внешнего физического интерфейса, DHCP тоже работает по протоколу UDP.

Другой UDP трафик, если нет других правил, затрагивающих UDP будет априори идти через WG туннель.

Смотри свои правила NFT.

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

Туннель wireguard работает, трафик по нему ходит.

Приватный сервер, он же Игровой сервер, работает без белого IP, игра работает по udp протоколу. Есть роутер в другом месте с белым IP. К нему подключен этот игровой сервер по wireguard. Так как в том месте, где находится игровой сервер серый IP от провайдера.

Нужно, чтобы через роутер с белым IP по определенному порту попадало на игровой сервер. При этом игровой сервер не должен полностью выходить в интернет через роутер с белым адресом, а только этот порт.

Знаю, что это можно настроить через policy based routing в том же OpenWRT. Но пока хочу сделать это непосредственно на игровом сервере.

Вот такой конфиг с белого OpenWRT:

config zone
        option name 'wg1vpn'
        option input 'ACCEPT'
        option output 'ACCEPT'
        option forward 'ACCEPT'
        list network 'wg1servervpn'

config forwarding
        option src 'wg1vpn'
        option dest 'wan'

config redirect
        option dest 'wg1vpn'
        option target 'DNAT'
        option name 'SevenDays'
        option src 'wan'
        option src_dport '26900-26903'
        option dest_ip '172.17.49.2'
        option dest_port '26900-26903'
        list proto 'tcp'
        list proto 'udp'
        option family 'ipv4'
NyXzOr ★★★
() автор топика
Последнее исправление: NyXzOr (всего исправлений: 2)
Ответ на: комментарий от NyXzOr

Если у тебя сейчас TCP трафик ходит только через WG, а UDP - нет, значит где-то проблема с разрешениями файрволл. Где-то стоит глобальный ACCEPT для всего UDP трафика, а должен стоять ACCEP для UDP трафика, с номером исходящего порта, который слушает WG сервер / клиент.

Ты всё это можешь и должен настроить на сервере. Ковыряй правила.

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

в контейнере по умолчанию firewall настроен:

$ sudo nft list ruleset

table inet filter {
        chain input {
                type filter hook input priority filter; policy accept;
        }

        chain forward {
                type filter hook forward priority filter; policy accept;
        }

        chain output {
                type filter hook output priority filter; policy accept;
        }
}
NyXzOr ★★★
() автор топика
Ответ на: комментарий от NyXzOr

Мда, ещё и в контейнере. А в хост системе запустить не пробовал?

У тебя может быть пересечение с адресами реальной сети и сети контейнеров.

К примеру у тебя реальная сеть 192.168.0.0/24 или 192.168.1.0/24 - а в контейнерах какая-нибудь 192.168.0.0/16, аналогично с 172.24.0.0/16, 172.16.0.0/16 может быть.

Ты слишком много всего в кучу смешал и пытаешься разгрести.

anonymous
()

Программа, работающая с UDP-сокетом, должна использовать тот же исходящий IP-адрес для ответа, который был указан во входящем пакете. Либо же нужно заbind’ить сокет на конкретный VPN-интерфейс.

В UDP нет концепции соединений, поэтому программе необходимо корректно поддерживать multihoming, чтобы работать в таком сценарии.

ValdikSS ★★★★★
()