LINUX.ORG.RU
ФорумAdmin

Не работает роутинг пакетов через Wireguard.

 , , , ,


0

1

Подскажите, куда копать.
Создано 3 виртуалки: Wireguard Server, Client A и Client B.
Wireguard Server:

[root@nixos:~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:50:56:00:xx:xx brd ff:ff:ff:ff:ff:ff
    inet6 2a01:4f8:xx:xx::5/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::250:56ff:xx:xx/64 scope link 
       valid_lft forever preferred_lft forever
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1400 qdisc noqueue state UNKNOWN group default qlen 1
    link/none 
    inet6 fc00::5/128 scope global 
       valid_lft forever preferred_lft forever
[root@nixos:~]# ip -6 route
2a01:4f8:xx:xx::/64 dev enp0s3 proto kernel metric 256 pref medium
fc00::5 dev wg0 proto kernel metric 256 pref medium
fe80::/64 dev enp0s3 proto kernel metric 256 pref medium
default via fe80::1 dev enp0s3 metric 1024 pref medium
[root@nixos:~]# wg
interface: wg0
  public key: AAA
  private key: (hidden)
  listening port: 50005

peer: BBB
  allowed ips: fc00::10/128

peer: CCC
  allowed ips: fc00::15/128
Client A:
[root@nixos:~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:81:xx:xx brd ff:ff:ff:ff:ff:ff
    inet6 2a01:4f8:xx:xx::10/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:xx:xx/64 scope link 
       valid_lft forever preferred_lft forever
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1400 qdisc noqueue state UNKNOWN group default qlen 1
    link/none 
    inet6 fc00::10/128 scope global 
       valid_lft forever preferred_lft forever

[root@nixos:~]# ip -6 route
2a01:4f8:xx:xx::/64 dev enp0s3 proto kernel metric 256 pref medium
fc00::10 dev wg0 proto kernel metric 256 pref medium
fe80::/64 dev enp0s3 proto kernel metric 256 pref medium
default dev wg0 metric 1024 pref medium
[root@nixos:~]# wg
interface: wg0
  public key: BBB
  private key: (hidden)
  listening port: 50010

peer: AAA
  endpoint: [2a01:4f8:xx:xx::5]:50005
  allowed ips: ::/0
  transfer: 0 B received, 5.78 KiB sent

Client B:

[root@nixos:~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:b1:xx:xx brd ff:ff:ff:ff:ff:ff
    inet6 2a01:4f8:xx:xx::15/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:xx:xx/64 scope link 
       valid_lft forever preferred_lft forever
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1400 qdisc noqueue state UNKNOWN group default qlen 1
    link/none 
    inet6 fc00::15/128 scope global 
       valid_lft forever preferred_lft forever

[root@nixos:~]# ip -6 route
2a01:4f8:xx:xx::/64 dev enp0s3 proto kernel metric 256 pref medium
fc00::15 dev wg0 proto kernel metric 256 pref medium
fe80::/64 dev enp0s3 proto kernel metric 256 pref medium
default dev wg0 metric 1024 pref medium
[root@nixos:~]# wg
interface: wg0
  public key: CCC
  private key: (hidden)
  listening port: 50015

peer: AAA
  endpoint: [2a01:4f8:xx:xx::5]:50005
  allowed ips: ::/0
  transfer: 0 B received, 2.89 KiB sent

Привила nftables у всех идентичные.

table ip6 filter {
        chain input {
                type filter hook input priority 0;
                icmpv6 type { echo-reply, echo-request, nd-neighbor-solicit, nd-neighbor-advert} nftrace set 1 accept
                tcp dport ssh nftrace set 1 accept
                tcp sport ssh nftrace set 1 accept
                nftrace set 1 drop
        }

        chain output {
                type filter hook output priority 0;
                icmpv6 type { echo-reply, nd-neighbor-advert, echo-request, nd-neighbor-solicit} nftrace set 1 accept
                tcp sport ssh nftrace set 1 accept
                tcp dport ssh nftrace set 1 accept
                nftrace set 1 drop
        }

        chain forward {
                type filter hook forward priority 0;
                nftrace set 1 drop
        }
}
Форвардинг IPv6 пакетов включен - "net.ipv6.conf.all.forwarding" = 1

По IPv6 все 3 виртуалки пингуются между собой и подключаются по SSH.
Но вот заставить Client A и Client B пинговать друг друга и сервер по fc00:: никак не получается.
Оба клиента пытаются подключиться к серверу, что видно в выхлопе wg, но пакеты не уходят за пределы виртуалок.
Нужно правильно прописать роуты, но я уже запутался.
Если я правильно понимаю, то с помощью ip -6 route add default dev wg пакеты направляем в wireguard интерфейс (wg0), где пакеты шифруются.
Дальше нужно отправить зашифрованные пакеты на wireguard server. Т.е. нужен роут, который будет направлять пакеты из wg0 в 2a01:4f8:xx:xx::5 который у нас ходит в интернет через шлюз fe80::1?.
Максимум, чего получилось добиться - получение пакетов.
Т.е. ping -c 1 fc00::10 с fc00::5 приводил к тому, что пакеты icmp приходили на fc00::10, но icmp reply не было. Только входящий icmp request.
Что опять же говорит о том, что не хватает роутов. Верно?
В общем прошу объяснить. Заранее спасибо.


Snapshot последний? Там недавно, кажется только было что-то про ipv6 в рассылке, по крайней мере если используешь wg-quick

* wg-quick: use src routing for default routes in v6 (0.0.20170531)
* wg-quick: properly match IPv6 endpoint (0.0.20170628)
* wg-quick now works better with IPv6. (0.0.20170628)

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

Wireguard? Версия - WireGuard 0.0.20170613.
Нет, wg-quick не использую. Загружаю конфиг через wg setconf wg0 /path/to/wireguard.conf

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

default via fe80::1

А разве на сервере у тебя вообще ipv6 глобально (интернет) работает? Или это у тебя роутер?

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

Да, работает. Вот например результат ping-а двух DNS серверов. (Один гугловский, другой из списка DNSCrypt-а)

[root@nixos:~]# ping -c 1 2a00:d880:3:1::a6c1:2e89
PING 2a00:d880:3:1::a6c1:2e89(2a00:d880:3:1::a6c1:2e89) 56 data bytes
64 bytes from 2a00:d880:3:1::a6c1:2e89: icmp_seq=1 ttl=59 time=14.3 ms

--- 2a00:d880:3:1::a6c1:2e89 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 14.391/14.391/14.391/0.000 ms

[root@nixos:~]# ping -c 1 2001:4860:4860::8888
PING 2001:4860:4860::8888(2001:4860:4860::8888) 56 data bytes
64 bytes from 2001:4860:4860::8888: icmp_seq=1 ttl=46 time=13.7 ms

--- 2001:4860:4860::8888 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 13.703/13.703/13.703/0.000 ms

Ммм... Вопрос прозвучал так, как будто не должно работать...
Почему такой вопрос возник? Я что-то неправильно прописал в route?

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

Или это у тебя роутер?

Это сервер в Hetzner, на котором созданы 3 виртуалки, о которых идет речь.
Виртуалки получают IPv6 через bridge. В virt-install указываю --network bridge=br0.
Интерфейс br0:

3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether c8:60:00:5f:xx:xx brd ff:ff:ff:ff:ff:ff
    inet6 2a01:4f8:xx:xx::36/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::ca60:ff:xx:xx/64 scope link 
       valid_lft forever preferred_lft forever

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

Попробуй закомментировать allowed ips, это должно разрешить сразу и ipv4 и ipv6 (или 0.0.0.0/0,::/0) Потом попробуй последний snapshot и отключить firewall. Ну и после можешь написать в wireguard.lists.zx2c4.com рассылке со всеми конфигами. Но опять же я так и не понял, зачем тебе это все нужно в одной локальной сети.

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

Эм... В смысле закомментировать?
Тут как бэ - AllowedIPs — a comma-separated list of ip (v4 or v6)... Required.
Nftables уже пробовал выключать, но это не решало проблему.
К тому же пакеты не дропаются, смотрел через nft monitor trace.
Все пакеты ICMP были в accept, но ответа не было. Скорее всего из-за отсутствия нужного роута.
Ну, если тут не помогут - походу придется.
Ну как бы для работы VPN клиент и сервер же должны уметь общаться между собой для передачи зашифрованных пакетов, разве нет?
А возможность передачи пакетов между клиентами внутри wireguard лишь приятный бонус + я пытаюсь разбираться в работе с сетями.
Ибо с этим совсем беда, но вроде в целом более-менее понятно.
Хоть и не все.

Sorcus ()

Логи tshark & nft monitor trace, при попытке с сервера достучаться до Client A со следующим правилом роута на сервере - ip -6 route add fc00::/128 dev wg0:

[root@nixos:~]# cat tshark.log 
Running as user "root" and group "root". This could be dangerous.
tshark: Lua: Error during loading:
 [string "/nix/store/kdpvsfscz09snq1cjiv8q31b2nf23pma-w..."]:44: dofile has been disabled due to running Wireshark as superuser. See https://wiki.wireshark.org/CaptureSetup/CapturePrivileges for help in running Wireshark as an unprivileged user.
Capturing on 'enp0s3'
19 packets captured
    1 0.000000000 2a01:4f8:xx:xx::5 → fc00::10     ICMPv6 118 Echo (ping) request id=0x0733, seq=112, hop limit=64
    2 1.023973252 2a01:4f8:xx:xx::5 → fc00::10     ICMPv6 118 Echo (ping) request id=0x0733, seq=113, hop limit=64
    3 2.047971402 2a01:4f8:xx:xx::5 → fc00::10     ICMPv6 118 Echo (ping) request id=0x0733, seq=114, hop limit=64
    4 3.072017166 2a01:4f8:xx:xx::5 → fc00::10     ICMPv6 118 Echo (ping) request id=0x0733, seq=115, hop limit=64
    5 4.095983462 2a01:4f8:xx:xx::5 → fc00::10     ICMPv6 118 Echo (ping) request id=0x0733, seq=116, hop limit=64
[root@nixos:~]# cat nftrace.log 
trace id 1ec36f10 ip6 filter output packet: oif "enp0s3" ip6 saddr 2a01:4f8:xx:xx::5 ip6 daddr fc00::10 ip6 dscp cs0 ip6 ecn not-ect ip6 hoplimit 64 ip6 flowlabel 56014 ip6 length 64 icmpv6 type echo-request icmpv6 code 0 icmpv6 parameter-problem 120782996 
trace id 1ec36f10 ip6 filter output rule icmpv6 type { } nftrace set 1 accept (verdict accept)
trace id cac78978 ip6 filter output packet: oif "enp0s3" ip6 saddr 2a01:4f8:xx:xx::5 ip6 daddr fc00::10 ip6 dscp cs0 ip6 ecn not-ect ip6 hoplimit 64 ip6 flowlabel 56014 ip6 length 64 icmpv6 type echo-request icmpv6 code 0 icmpv6 parameter-problem 120782997 
trace id cac78978 ip6 filter output rule icmpv6 type { } nftrace set 1 accept (verdict accept)
trace id 1266f9f9 ip6 filter output packet: oif "enp0s3" ip6 saddr 2a01:4f8:xx:xx::5 ip6 daddr fc00::10 ip6 dscp cs0 ip6 ecn not-ect ip6 hoplimit 64 ip6 flowlabel 56014 ip6 length 64 icmpv6 type echo-request icmpv6 code 0 icmpv6 parameter-problem 120782998 
trace id 1266f9f9 ip6 filter output rule icmpv6 type { } nftrace set 1 accept (verdict accept)
trace id cac78978 ip6 filter output packet: oif "enp0s3" ip6 saddr 2a01:4f8:xx:xx::5 ip6 daddr fc00::10 ip6 dscp cs0 ip6 ecn not-ect ip6 hoplimit 64 ip6 flowlabel 56014 ip6 length 64 icmpv6 type echo-request icmpv6 code 0 icmpv6 parameter-problem 120782999 
trace id cac78978 ip6 filter output rule icmpv6 type { } nftrace set 1 accept (verdict accept)
trace id 61673a8d ip6 filter output packet: oif "enp0s3" ip6 saddr fe80::250:56ff:xx:xx ip6 daddr fe80::1 ip6 dscp cs0 ip6 ecn not-ect ip6 hoplimit 255 ip6 flowlabel 0 ip6 length 32 icmpv6 type nd-neighbor-solicit icmpv6 code 0 icmpv6 parameter-problem 0 
trace id 61673a8d ip6 filter output rule icmpv6 type { } nftrace set 1 accept (verdict accept)
При этом на интерфейсе wg0 tshark-ом ничего не ловит. Т.е. пакеты не уходят с интерфейса enp0s3
Хотя по идее пакеты должны сперва идти в wg0, а потом уже в enp0s3, так?
Если изменить роут на такой - ip -6 route add fc00::/64 dev wg0, то выхлоп такой:
[root@nixos:~]# cat tshark.log 
Running as user "root" and group "root". This could be dangerous.
tshark: Lua: Error during loading:
 [string "/nix/store/kdpvsfscz09snq1cjiv8q31b2nf23pma-w..."]:44: dofile has been disabled due to running Wireshark as superuser. See https://wiki.wireshark.org/CaptureSetup/CapturePrivileges for help in running Wireshark as an unprivileged user.
Capturing on 'wg0'
13 packets captured
    1 0.000000000      fc00::5 → fc00::10     ICMPv6 104 Echo (ping) request id=0x0836, seq=33, hop limit=64
    2 1.023958783      fc00::5 → fc00::10     ICMPv6 104 Echo (ping) request id=0x0836, seq=34, hop limit=64
    3 2.047958708      fc00::5 → fc00::10     ICMPv6 104 Echo (ping) request id=0x0836, seq=35, hop limit=64
    4 3.072001284      fc00::5 → fc00::10     ICMPv6 104 Echo (ping) request id=0x0836, seq=36, hop limit=64
    5 4.095984685      fc00::5 → fc00::10     ICMPv6 104 Echo (ping) request id=0x0836, seq=37, hop limit=64
[root@nixos:~]# cat nftrace.log 
trace id c6e32921 ip6 filter output packet: oif "wg0" ip6 saddr fc00::5 ip6 daddr fc00::10 ip6 dscp cs0 ip6 ecn not-ect ip6 hoplimit 64 ip6 flowlabel 1044831 ip6 length 64 icmpv6 type echo-request icmpv6 code 0 icmpv6 parameter-problem 137756750 
trace id c6e32921 ip6 filter output rule icmpv6 type { } nftrace set 1 accept (verdict accept)
trace id d9c6e7e0 ip6 filter output packet: oif "lo" ip6 saddr fc00::5 ip6 daddr fc00::5 ip6 dscp cs0 ip6 ecn not-ect ip6 hoplimit 64 ip6 flowlabel 296525 ip6 length 112 icmpv6 type destination-unreachable icmpv6 code 3 icmpv6 parameter-problem 0 
trace id d9c6e7e0 ip6 filter output rule nftrace set 1 drop (verdict drop)
trace id 96a68657 ip6 filter output packet: oif "wg0" ip6 saddr fc00::5 ip6 daddr fc00::10 ip6 dscp cs0 ip6 ecn not-ect ip6 hoplimit 64 ip6 flowlabel 1044831 ip6 length 64 icmpv6 type echo-request icmpv6 code 0 icmpv6 parameter-problem 137756751 
trace id 96a68657 ip6 filter output rule icmpv6 type { } nftrace set 1 accept (verdict accept)
trace id cf212219 ip6 filter output packet: oif "lo" ip6 saddr fc00::5 ip6 daddr fc00::5 ip6 dscp cs0 ip6 ecn not-ect ip6 hoplimit 64 ip6 flowlabel 296525 ip6 length 112 icmpv6 type destination-unreachable icmpv6 code 3 icmpv6 parameter-problem 0 
trace id cf212219 ip6 filter output rule nftrace set 1 drop (verdict drop)
trace id 63bdcf73 ip6 filter output packet: oif "wg0" ip6 saddr fc00::5 ip6 daddr fc00::10 ip6 dscp cs0 ip6 ecn not-ect ip6 hoplimit 64 ip6 flowlabel 1044831 ip6 length 64 icmpv6 type echo-request icmpv6 code 0 icmpv6 parameter-problem 137756752 
trace id 63bdcf73 ip6 filter output rule icmpv6 type { } nftrace set 1 accept (verdict accept)
trace id 7bd33f36 ip6 filter output packet: oif "lo" ip6 saddr fc00::5 ip6 daddr fc00::5 ip6 dscp cs0 ip6 ecn not-ect ip6 hoplimit 64 ip6 flowlabel 296525 ip6 length 112 icmpv6 type destination-unreachable icmpv6 code 3 icmpv6 parameter-problem 0 
trace id 7bd33f36 ip6 filter output rule nftrace set 1 drop (verdict drop)
Но начинает ругаться при попытке сделать пинг до клиента.
[root@nixos:~]# ping fc00::10
PING fc00::10(fc00::10) 56 data bytes
ping: sendmsg: No route to host
ping: sendmsg: No route to host
ping: sendmsg: No route to host
^C
--- fc00::10 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2031ms
На интерфейсе enp0s3 пусто.
В drop-ах есть упоминание destination-unreachable.
Не совсем понятно, почему? Из-за того, что у fc00::10 нет роута? Или...
И не совсем понимаю разницу между ip -6 route add fc00::/128 dev wg0 & ip -6 route add fc00::/64 dev wg0
Т.е. я предполагаю, что в первом случае правило для какого-то конкретного адреса (или я ошибаюсь?), а во втором для целой подсети.
Если я не ошибся, тогда вроде понятно, почему в первом случае пакеты не уходят на интерфейс wg0.
Но непонятна ошибка No route to host.

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