LINUX.ORG.RU
решено ФорумAdmin

Настройка Wireguard + OpenWRT с IPv6 из /56 префикса с VPS.

 , ,


1

2

Есть VPS с префиксом /56 (Linode). Есть роутер с OpenWRT.
На сервере установлен Wireguard.
Так же есть провайдер дом.ру, предоставляющий IPv6 через DHCPv6-PD (если не ошибаюсь).
Сделать хочется следующее:
1. Роутер должен получать IPv6 от провайдера (но не должен раздавать его клиентам).
Т.е. на интерфейсе br-lan должен быть один адрес, через который можно будет выходить в сеть по IPv6. Например

25: br-lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 12:c3:7b:43:4d:05 brd ff:ff:ff:ff:ff:ff
    inet6 2a02:2698:1234:abcd::1/64 scope global dynamic noprefixroute 
       valid_lft 86342sec preferred_lft 3542sec
2.Клиентам роутер должен раздавать IPv4 и IPv6 адреса из пулов, прописанных вручную (для IPv6 это /64 префикс из /56 префикса с сервера).
3.Весь исходящий трафик должен заворачиваться в wg0 интерфейс.
А IPv6 адреса клиентов из /64 префикса с сервера должны быть доступны извне (сейчас такое сделано только в штучных экземплярах на каждом клиенте).
Вопрос пока что такой. Как запретить выдачу IPv6 адресов из /64 префикса провайдера, но чтобы IPv6 доступ был (см. п. 1).
Из предыдущего вопроса вытекает следующий. Как выдавать IPv6 адреса из /64 префикса с сервера, если запретить выдавать адреса из /64 префикса провайдера?
Выхлоп ip a
root@OpenWrt:~# ip a
8: pppoe-wan: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1492 qdisc fq_codel state UNKNOWN group default qlen 3
    link/ppp 
    inet 176.213.xx.xx peer 10.77.xx.xx/32 scope global pppoe-wan
       valid_lft forever preferred_lft forever
    inet6 fe80::4013:111f:9xxx:xxxc/10 scope link 
       valid_lft forever preferred_lft forever
12: br-lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 12:c3:7b:xx:xx:x5 brd ff:ff:ff:ff:ff:ff
    inet6 2a02:2698:xxxx:xxx9:10c3:7bff:fexx:xxx5/64 scope global deprecated dynamic noprefixroute 
       valid_lft 76050sec preferred_lft 0sec
    inet6 2a01:7e01:xxxx:xxxd:10c3:7bff:fexx:xxx5/64 scope global noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::10c3:7bff:fe43:4d05/64 scope link 
       valid_lft forever preferred_lft forever
13: eth0.1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-lan state UP group default qlen 1000
    link/ether 12:c3:7b:43:4d:05 brd ff:ff:ff:ff:ff:ff
Здесь 2a02:2698:xxxx:xxx9 префикс, выданный провайдером.
А 2a01:7e01:xxxx:xxxd /64 префикс из /56 префикса с сервера.
Конфиг /etc/config/network
config interface 'loopback'
        option ifname 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

config globals 'globals'
        option ula_prefix 'fdba:6666:f1d9::/48'

config interface 'lan'
        option type 'bridge'
        option ifname 'eth0.1'
        option proto 'static'
        option ipaddr '192.168.1.1'
        option netmask '255.255.255.0'
        option ip6assign '60'
        option ip6prefix '2a01:7e01:xxxx:xxxd::/64'
        option ip6ifaceid 'eui64'

config device 'lan_dev'
        option name 'eth0.1'
        option macaddr '12:c3:7b:xx:xx:x5'

config interface 'wan'
        option ifname 'eth0.2'
        option proto 'pppoe'
        option username 'SECURE'
        option password 'SECURE'
        option ipv6 'auto'
        option keepalive '0'

config device 'wan_dev'
        option name 'eth0.2'
        option macaddr '10:c3:7b:xx:xx:x4'

config interface 'wan6'
        option proto 'dhcpv6'
        option reqaddress 'try'
        option reqprefix 'auto'
        option ifname 'eth0.2'

config switch
        option name 'switch0'
        option reset '1'
        option enable_vlan '1'

config switch_vlan
        option device 'switch0'
        option vlan '1'
        option ports '0 1 2 3 8t'

config switch_vlan
        option device 'switch0'
        option vlan '2'
        option ports '4 8t'


Первый вопрос я решил следующим образом.
Между роутером с OpenWRT и провайдером добавлен маршрутизатор, который подключается к ISP через PPPoE и выдаёт роутеру с OpenWRT IPv6 адрес на интерфейс.

22: eth0.2@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 10:c3:7b:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet6 2a02:2698:7c24:21b0:12c3:7bff:fexx:xxxx/64 scope global dynamic noprefixroute 
       valid_lft 84974sec preferred_lft 2174sec
    inet6 fe80::12c3:7bff:fexx:xxxx/64 scope link 
       valid_lft forever preferred_lft forever
Это IPv6 адрес выданный роутеру с OpenWRT.
Wireguard на OpenWRT сделал и подключение к серверу проходит успешно.
Трафик инициируемый на роутере проходит через интерфейс wg0.
Но проблема в том, что если вручную назначить IPv6 адрес клиенту, подключённому к роутеру с OpenWRT, то трафик не уходит.
TCPdump показывает следующее
01:23:36.872637 IP6 2a01:7e01:xxxx:8fcd::10 > ff02::1:ff5c:a97f: ICMP6, neighbor solicitation, who has 2a01:7e01:e001:xxxx:819f:xxxx:xxxx:a97f, length 32
01:23:37.370163 IP6 2a01:7e01:xxxx:8fcd::10 > ff02::1:ff22:275a: ICMP6, neighbor solicitation, who has 2a01:7e01::f0xx:xx:xx:275a, length 32
01:23:37.457289 IP6 2a01:7e01:xxxx:8fcd::10 > ff02::1:ff00:1111: ICMP6, neighbor solicitation, who has 2606:4700:4700::1111, length 32
01:23:37.457388 IP6 2a01:7e01:xxxx:8fcd::10 > ff02::1:ff00:1001: ICMP6, neighbor solicitation, who has 2606:4700:4700::1001, length 32
2a01:7e01::f0xx:xx:xx:275a - это IPv6 адрес VPS с Wireguard, к которому подключается OpenWRT.
ip a и ip route на OpenWRT
root@OpenWrt:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 10:c3:7b:xx:xx:05 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::12c3:7bff:fexx:xx05/64 scope link 
       valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 10:c3:7b:xx:xx:04 brd ff:ff:ff:ff:ff:ff
4: wlan1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 10:c3:7b:xx:xx:05 brd ff:ff:ff:ff:ff:ff
20: br-lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 12:c3:7b:xx:xx:05 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.1/24 brd 192.168.1.255 scope global br-lan
       valid_lft forever preferred_lft forever
    inet6 fd6c:f16e:686e::1/60 scope global noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::10c3:7bff:fexx:xx05/64 scope link 
       valid_lft forever preferred_lft forever
21: eth0.1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-lan state UP group default qlen 1000
    link/ether 12:c3:7b:xx:xx:05 brd ff:ff:ff:ff:ff:ff
22: eth0.2@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 10:c3:7b:xx:xx:04 brd ff:ff:ff:ff:ff:ff
    inet6 2a02:2698:7c24:21b0:12c3:7bff:fexx:xx04/64 scope global dynamic noprefixroute 
       valid_lft 84974sec preferred_lft 2174sec
    inet6 fe80::12c3:7bff:fexx:xx04/64 scope link 
       valid_lft forever preferred_lft forever
24: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1412 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 10.0.1.2/32 brd 255.255.255.255 scope global wg0
       valid_lft forever preferred_lft forever
    inet6 2a01:7e01:xxxx:8fcd::/64 scope global 
       valid_lft forever preferred_lft forever

root@OpenWrt:~# ip -6 route
default from 2a02:2698:7c24:21b0::/64 via fe80::1 dev eth0.2 proto static metric 512 pref medium
2a01:7e01::f0xx:xx:xx:275a via fe80::1 dev eth0.2 proto static metric 512 pref medium
2a01:7e01:xxxx:8fcd::/64 dev wg0 proto kernel metric 256 pref medium
2a02:2698:7c24:21b0::/64 dev eth0.2 proto static metric 256 pref medium
fd6c:f16e:686e::/64 dev br-lan proto static metric 1024 pref medium
unreachable fd6c:f16e:686e::/48 dev lo proto static metric 2147483647 error -148 pref medium
fe80::/64 dev eth0.2 proto kernel metric 256 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
fe80::/64 dev br-lan proto kernel metric 256 pref medium
default dev wg0 proto static metric 1024 pref medium

root@OpenWrt:~# ip -4 route
default dev wg0 proto static scope link 
192.168.1.0/24 dev br-lan proto kernel scope link src 192.168.1.1 
На клиенте делаю следующее
[root@archlinux sorcus]# ip -6 address add 2a01:7e01:xxxx:8fcd::10/128 dev enp60s0
[root@archlinux sorcus]# ip -6 route add default dev enp60s0
[root@archlinux sorcus]# ip -6 route add 2a01:7e01:xxxx:8fcd::/64 dev enp60s0
Возможно я где-то что-то сделал неправильно в роутинге, но не могу понять, что именно.
Заранее спасибо.

Sorcus ()

И еще такой вопрос.
На VPS с Wireguard IPv4 сделан следующим образом

[root@localhost ~]# ip a
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1412 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 10.0.1.1/32 scope global wg0
       valid_lft forever preferred_lft forever

[root@localhost ~]# ip -4 route
10.0.1.0/24 dev wg0 proto static 
10.0.1.0/24 через SNAT в nftables конвертирует адрес в 85.90.2x.xx.
Вроде бы всё работает, но вот можно ли адреса из 10.0.1.0/24 выдать клиентам за OpenWRT роутером, чтобы трафик клиентов с этих адресов проходил через wg0 интерфейс на OpenWRT роутере?

Sorcus ()

Окончательный вариант OpenWrt роутера с Wireguard туннелем и IPv6 адресами из /56 префикса VPS сервера Linode.
Схема такая Wireguard VPS (Linode) <-> Роутер Дом.ру <-> OpenWrt роутер <-> Клиенты
Конфиги с роутера OpenWrt

archlinux% cat etc/config/network 
config interface 'loopback'
        option ifname 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

config globals 'globals'
        # /64 префикс, взятый из /56 префикса с VPS сервера
        option ula_prefix '2a01:7e01:e00a:bcde::/64'

config interface 'lan'
        option type 'bridge'
        option ifname 'eth0.1'
        option proto 'static'
        # IPv4 адрес для роутера из подсети 10.0.1.0/24
        option ipaddr '10.0.1.2'
        option netmask '255.255.255.0'
        option ip6ifaceid 'eui64'
        option ip6assign '64'

config device 'lan_dev'
        option name 'eth0.1'
        option macaddr '12:a3:7b:4c:4d:0e'

config interface 'wan'
        option ifname 'eth0.2'
        option proto 'none'

config device 'wan_dev'
        option name 'eth0.2'
        option macaddr '10:a3:7b:4c:4d:0e'

config interface 'wan6'
        option ifname 'eth0.2'
        option proto 'dhcpv6'
        option peerdns '0'
        list dns '2606:4700:4700::1001'
        list dns '2606:4700:4700::1111'

config interface 'wg0'
        option proto 'wireguard'
        option listen_port '500'
        option mtu '1412'
        option private_key 'SECURE'

config wireguard_wg0
        option public_key 'SECURE'
        option preshared_key 'SECURE'
        list allowed_ips '::/0'
        list allowed_ips '0.0.0.0/0'
        option route_allowed_ips '1'
        option endpoint_host '2a01:7e01::abcd'
        option endpoint_port '50000'

config switch
        option name 'switch0'
        option reset '1'
        option enable_vlan '1'
        option max_length '3'
        option enable_vlan4k '1'

config switch_vlan
        option device 'switch0'
        option vlan '1'
        option ports '0 1 2 3 8t'

config switch_vlan
        option device 'switch0'
        option vlan '2'
        option ports '4 8t'
archlinux% cat etc/config/dhcp   
config dhcp 'lan'
        option interface 'lan'
        option start '10'
        option limit '240'
        option leasetime '12h'
        option dhcpv4 'server'
        option dhcpv6 'disabled'
        option ra 'server'
        option ra_dns '1'
        list dns '2606:4700:4700::1001'
        list dns '2606:4700:4700::1111'
        list dns '1.0.0.1'
        list dns '1.1.1.1'

config dhcp 'wan'
        option interface 'wan'
        option ignore '1'

config odhcpd 'odhcpd'
        option legacy '0'
        option maindhcp '1'
        option leasefile '/tmp/hosts/odhcpd'
        option leasetrigger '/usr/sbin/odhcpd-update'
Небольшая заметка.
Вместо Dnsmasq, поставляемого в OpenWrt, я использую Odhcpd.
Прошивку собираю сам, поэтому из коробки конфиги скорее всего не заработают.

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

Правила Nftables для OpenWrt роутера.

archlinux% cat etc/nftables.conf
flush ruleset

table ip filter {
        chain input {
                type filter hook input priority 0; policy drop;

                # Invalid connections
                ct state { \
                        invalid \
                } counter drop

                # Established / related connections
                ct state { \
                        established, \
                        related \
                } counter accept

                # Loopback
                iif lo ip saddr 127.0.0.0/24 ip daddr 127.0.0.0/24 counter accept

                # ICMP
                ip protocol icmp counter accept

                # SSH
                iif br-lan tcp dport { \
                        ssh \
                } counter accept

                # BOOTP (DHCP)
                iif br-lan udp sport bootpc udp dport bootps counter accept

                # Tox
                iif br-lan udp dport 33445 counter accept
        }

        chain forward {
                type filter hook forward priority 0; policy drop;

                # Invalid connections
                ct state { \
                        invalid \
                } counter drop

                # Established / related connections
                ct state { \
                        established, \
                        related \
                } counter accept

                # ICMP
                ip protocol icmp counter accept

                # Fix MSS in runtime
                iif br-lan oif wg0 tcp flags syn tcp option maxseg size set rt mtu

                # Allow traffic from LAN to Wireguard
                iif br-lan oif wg0 ip saddr 10.0.1.0/24 counter accept
        }

        chain output {
                type filter hook output priority 0; policy drop;

                # Invalid connections
                ct state { \
                        invalid \
                } counter drop

                # Established / related connections
                ct state { \
                        established, \
                        related \
                } counter accept

                # Loopback
                oif lo ip saddr 127.0.0.0/24 ip daddr 127.0.0.0/24 counter accept

                # ICMP
                ip protocol icmp counter accept

                # SSH
                oif br-lan tcp sport { \
                        ssh \
                } counter accept

                # BOOTP (DHCP)
                oif br-lan udp sport bootps udp dport bootpc counter accept
        }
}

table ip6 filter {
        chain input {
                type filter hook input priority 0; policy drop;

                # Invalid connections
                ct state { \
                        invalid \
                } counter drop

                # Established / related connections
                ct state { \
                        established, \
                        related \
                } counter accept

                # Loopback
                iif lo ip6 saddr ::1/128 ip6 daddr ::1/128 counter accept

                # ICMP
                ip6 nexthdr icmpv6 counter accept

                # SSH
                tcp dport { \
                        ssh \
                } counter accept

                # DHCPv6
                iif br-lan udp dport dhcpv6-server counter accept
                iif eth0.2 udp dport dhcpv6-client counter accept

                # Tox
                iif br-lan udp dport 33445 counter accept
        }

        chain forward {
                type filter hook forward priority 0; policy drop;

                # Invalid connections
                ct state { \
                        invalid \
                } counter drop

                # Established / related connections
                ct state { \
                        established, \
                        related \
                } counter accept

                # Loopback
                oif lo ip6 saddr ::1/128 ip6 daddr ::1/128 counter accept

                # ICMP
                ip6 nexthdr icmpv6 counter accept

                # Fix MSS in runtime
                iif br-lan oif wg0 tcp flags syn tcp option maxseg size set rt mtu

                # Allow traffic from LAN to Wireguard
                # Разрешить запросы от клиентских устройств
                iif br-lan oif wg0 ip6 saddr 2a01:7e01:e00a:bcde::/64 counter accept
                # Разрешить SSH / Mosh трафик к VPS с VPN-ом
                iif br-lan oif eth0.2 ip6 daddr 2a01:7e01::abcd udp dport { 60000 - 61000 } counter accept
                iif br-lan oif eth0.2 ip6 daddr 2a01:7e01::abcd tcp dport ssh counter accept

                # Allow traffic for IPv6 clients
                # Трафик по IPv6 к клиентам из вне разрешён, т.к. есть такая потребность.
                iif wg0 oif br-lan ip6 daddr 2a01:7e01:e00a:bcde::/64 ip6 nexthdr tcp counter accept
                iif wg0 oif br-lan ip6 daddr 2a01:7e01:e00a:bcde::/64 ip6 nexthdr udp counter accept
        }

        chain output {
                type filter hook output priority 0; policy drop;

                # Invalid connections
                ct state { \
                        invalid \
                } counter drop

                # Established / related connections
                ct state { \
                        established, \
                        related \
                } counter accept

                # Loopback
                oif lo ip6 saddr ::1/128 ip6 daddr ::1/128 counter accept

                # ICMP
                ip6 nexthdr icmpv6 counter accept

                # DHCPv6
                oif eth0.2 udp sport dhcpv6-client udp dport dhcpv6-server counter accept
                oif br-lan udp sport dhcpv6-server udp dport dhcpv6-client counter accept

                oif wg0 ip6 nexthdr { \
                        icmpv6, \
                        udp, \
                        tcp \
                } counter accept

                # IPv6 адрес сервера с VPN
                oif eth0.2 \
                        ip6 daddr 2a01:7e01::abcd \
                        udp sport 500 \
                        udp dport 50000 \
                        counter accept
        }
}
Сервис для nftables.
archlinux% cat etc/init.d/nftables 
#!/bin/sh /etc/rc.common

START=25

USE_PROCD=1

start_service() {
        procd_open_instance
        procd_set_param command /usr/sbin/nft -f /etc/nftables.conf
        procd_close_instance
}

service_triggers() {
        procd_add_interface_trigger "interface.*.up" "br-lan" /etc/init.d/nftables restart
        procd_add_interface_trigger "interface.*.up" "wg0" /etc/init.d/nftables restart
}
Создать симлинк etc/rc.d/S25nftables
archlinux% ls -l etc/rc.d/S25nftables 
lrwxrwxrwx 1 sorcus users 18 Feb  2 19:34 etc/rc.d/S25nftables -> ../init.d/nftables

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

Еще одна небольшая заметка.
По tcpdump весь трафик идёт через интерфейс wg0.
На интерфейсе WAN (eth0.2) виден трафик только между VPN сервером и роутером.
Но трафик SSH к серверу с VPN идёт напрямую через WAN (eth0.2) из роутинга.
Не критично конечно, но вдруг кто знает, как исправить. Спасибо.
И еще трафик iperf не всегда проходит через роутер.
А иногда и вовсе не проходит.
С чем я так же на текущий момент еще не разобрался.

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