LINUX.ORG.RU
ФорумAdmin

Wireguard неправильно маршрутизирует пакеты

 , , ,


1

1

Здравствуйте. Настроил сервер Wireguard и успешно подключился с телефона. Всё работает штатно. На ноутбуке же не взлетело - судя по логам, пытается слать пакеты с IP WiFi-адаптера вместо IP интерфейса WG.

Пример логов сервера:

[  +0.000060] wireguard: wg0: Sending keepalive packet to peer 8 ("провайдерский IP":28858)
[  +0.212567] wireguard: wg0: Packet has unallowed src IP (192.168.1.103) from peer 8 ("провайдерский IP":28858)
[  +0.208706] wireguard: wg0: Packet has unallowed src IP (192.168.1.103) from peer 8 ("провайдерский IP":28858)
[  +0.238599] wireguard: wg0: Packet has unallowed src IP (192.168.1.103) from peer 8 ("провайдерский IP":28858)
[  +0.085003] wireguard: wg0: Packet has unallowed src IP (192.168.1.103) from peer 8 ("провайдерский IP":28858)
[  +0.739937] wireguard: wg0: Packet has unallowed src IP (192.168.1.103) from peer 8 ("провайдерский IP":28858)

Т.е. пир, в принципе, подключился, но пакеты шлёт с неправильного адреса.

Сообщения при поднятии WG на ноуте:

wg-quick up wg0-client              
[#] ip link add wg0-client type wireguard
[#] wg setconf wg0-client /dev/fd/63
[#] ip -4 address add 10.13.37.3/32 dev wg0-client
[#] ip link set mtu 1420 up dev wg0-client
[#] resolvconf -a wg0-client -m 0 -x
[#] wg set wg0-client fwmark 51820
[#] ip -4 route add 0.0.0.0/0 dev wg0-client table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0
[#] sysctl -q net.ipv4.conf.all.src_valid_mark=1
[#] iptables-restore -n

Таблицы маршрутизации на ноуте:

default dev wg0-client table 51820 scope link 
default via 192.168.1.1 dev wlp8s0 
default via 192.168.1.1 dev wlp8s0 proto dhcp metric 600 
192.168.1.0/24 dev wlp8s0 proto kernel scope link src 192.168.1.103 metric 600 
local 10.13.37.3 dev wg0-client table local proto kernel scope host src 10.13.37.3 
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1 
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1 
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1 
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1 
broadcast 192.168.1.0 dev wlp8s0 table local proto kernel scope link src 192.168.1.103 
local 192.168.1.103 dev wlp8s0 table local proto kernel scope host src 192.168.1.103 
broadcast 192.168.1.255 dev wlp8s0 table local proto kernel scope link src 192.168.1.103 
::1 dev lo proto kernel metric 256 pref medium
fe80::/64 dev wlp8s0 proto kernel metric 600 pref medium
local ::1 dev lo table local proto kernel metric 0 pref medium
local fe80::5fc3:42e4:37a2:aef5 dev wlp8s0 table local proto kernel metric 0 pref medium
multicast ff00::/8 dev wlp8s0 table local proto kernel metric 256 pref medium
multicast ff00::/8 dev wg0-client table local proto kernel metric 256 pref medium

Конфиг клиента:

[Interface]
Address = 10.13.37.3/32
PrivateKey = "приватный ключ клиента"
DNS = 10.13.37.1

[Peer]
PublicKey = "публичный ключ сервера"
Endpoint = "IP сервера":49832
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 21

Ядро на клиенте:

Linux host 5.4.108-1-MANJARO #1 SMP PREEMPT Wed Mar 24 18:24:35 UTC 2021 x86_64 GNU/Linux

Конфиг сервера:

[Interface]
Address = 10.13.37.1/30
SaveConfig = true
ListenPort = 49832
PrivateKey = "приватный ключ сервера"

[Peer]
PublicKey = "публичный ключ беспроблемного клиента"
AllowedIPs = 10.13.37.2/32
Endpoint = "провайдерский IP":28826

[Peer]
PublicKey = "публичный ключ проблемного клиента"
AllowedIPs = 10.13.37.3/32
Endpoint = "провайдерский IP":29064

Оба клиента подключены к одной и той же точке доступа. Решение, конечно же, не гуглится. Буду рад любым подсказкам, куда копать.


Тут проблема в выборе src ip-адреса пакета, при чём тут маршрутизация. Посмотрите, если указывать src адрес (допустим ping -I), то работает. Посмотрите, что даёт команда ip route get Нужный_адрес.

mky ★★★★★
()
Ответ на: комментарий от zemidius

Endpoint добавляется автоматически, т.к. SaveConfig = true. Указать false и удалить Endpoint пробовал, не влияет.

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

Маршрут и SRC выглядят правильно:

[host toor]# ip ro get 10.13.37.1
10.13.37.1 dev wg0-client table 51820 src 10.13.37.3 uid 0 
    cache 
[host toor]# ip ro get "публичный IP сервера"
"публичный IP сервера" dev wg0-client table 51820 src 10.13.37.3 uid 0 
    cache 

При этом нет пинга с такими параметрами:

ping -I wg0-client 10.13.37.1
ping -I 10.13.37.3 10.13.37.1
ping -I wg0-client 1.1.1.1

А вы настраивали на окружении с NetworkManager? Я попробовал и через wg-quick, и через NM.

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

Если на ping -I 10.13.37.3 10.13.37.1 в логи сервера идёт аналогичная ругань про ″unallowed src IP″, то ищите NAT (MASQURADE), допустим в ″iptables -t nat″.

От NM всегда держался подальше.

mky ★★★★★
()

Как удобно смотреть таблицы машрутизации вперемешку! Как постинг без разметки.

«ip ru» хорошо бы увидеть.

IMHO В строке «default dev wg0-client scope link» нехватает «src 10.13.37.3». Это необходимо для пакетов отправляемых с хоста.

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

Здравствуйте.

[host toor]# ip ru
0:      from all lookup local
31550:  from all lookup main suppress_prefixlength 0
31551:  not from all fwmark 0xca6c lookup 51820
32766:  from all lookup main
32767:  from all lookup default

src добавить пробовал, не взлетело.

Поставил логирование iptables -t mangle -D PREROUTING -m mark --mark 0xca6c -j LOG --log-prefix "fwmark: ", чтобы ловить пакеты с отметкой. Идёт такое:

fwmark: IN= OUT=wlp8s0 SRC=192.168.1.108 DST="публичный IP сервера" LEN=124 TOS=0x00 PREC=0x00 TTL=64 ID=43977 PROTO=UDP SPT=44191 DPT=49832 LEN=104 MARK=0xca6c

Т.е. правило не срабатывает, т.к. исходящим интерфейсом должен был быть wg0-client, верно?

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

Не ту команду привёл для логирования. iptables -t mangle -A POSTROUTING -m mark --mark 0xca6c -j LOG --log-prefix "fwmark: " - вот это использовал.

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

sysctl -q net.ipv4.conf.all.src_valid_mark=1

Откуда эта иструкция по использованию src_valid_mark?

Охренеть! Даже в документации для 5.10 о нем ни слова.

Но если посмотреть исходники, то выясняется, что фича имеет очень ограниченное действие. Чтобы оно влияло нужно иметь не нулевый адрес источника в пакете.

У тебя для локального пакета src 0.0.0.0 если ты не сделал явный bind (пример ping -I xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy).

Возвращаясь к твоему варианту.

IMHO В строке «default dev wg0-client scope link» нехватает «src 10.13.37.3» и лишнее «scope link».

Вопрос - накой здесь policy routung? Ведь без него все замечательно работает!

Достаточно в main добавить маршрут к серверу и сделать dgw более предпочтительным. Это решает вопрос с выбором src для ip пакета.

vel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.