Как разрешить трафик через VPN в пространствах имен с помощью nftables

У меня есть интерфейс Wireguard, настроенный в выделенном пространстве имен. Настраивается сначала создание интерфейса в основном пространстве имен (который имеет доступ к маршрутизации физического интерфейса в Интернет), затем перемещение интерфейса Wireguard в пространство имен (ссылка).

Теперь это мой набор правил в основном пространстве имен:

      sudo nft -a list table inet filter
table inet filter { # handle 15
        set blackhole { # handle 4
                type ipv4_addr
                elements = { 224.0.0.1, 224.0.0.251,
                             255.255.255.255 }
        }

        set in_tcp_accept { # handle 5
                type inet_service
                flags interval
                elements = { 22 }
        }

        set ip6blackhole { # handle 6
                type ipv6_addr
                elements = { ff02::16 }
        }

        set out_tcp_accept { # handle 7
                type inet_service
                flags interval
                elements = { 80, 443, 11371 }
        }

        set out_udp_accept { # handle 8
                type inet_service
                flags interval
                elements = { 53, 67, 123 }
        }

        chain global { # handle 1
                ct state established,related accept # handle 12
                ct state invalid drop # handle 13
        }

        chain input { # handle 2
                type filter hook input priority filter; policy drop;
                jump global # handle 14
                ip daddr @blackhole counter packets 0 bytes 0 drop # handle 15
                ip6 daddr @ip6blackhole counter packets 0 bytes 0 drop # handle 16
                iif "lo" accept # handle 17
                meta l4proto { icmp, ipv6-icmp } accept # handle 18
                tcp dport @in_tcp_accept ct state new accept # handle 19
                tcp dport { 80, 443 } ct state new accept # handle 20
                udp dport 51821 accept # handle 21
        }

        chain output { # handle 3
                type filter hook output priority filter; policy drop;
                jump global # handle 22
                oif "lo" accept # handle 23
                ip protocol icmp accept # handle 24
                ip6 nexthdr ipv6-icmp counter packets 3 bytes 192 accept # handle 25
                udp dport @out_udp_accept ct state new accept # handle 26
                tcp dport @out_tcp_accept ct state new accept # handle 27
                tcp sport 22 tcp flags { rst, psh | ack } counter packets 44 bytes 6052 accept # handle 28

и это блокирует выходной трафик отwg0в пространстве имен.

Как разрешить приток трафика сvpnпространство имен и пройти черезeno1в Интернет?

1 ответ

Я предполагаю, что WireGuardwg0интерфейс настроен на использование порта 51821 основного хоста, поскольку в файле есть правило для этого порта.inet filter inputцепочке, а значение находится рядом с обычным эталонным портом 51820.

Просто добавьте обратное этому правилу ввода:

               udp dport 51821 accept # handle 21

вinet filter outputцепь:

          udp sport 51821 accept

или же добавьте этот порт вout_udp_acceptнабор.

С учетом некоторых ограничений по сравнению с более простыми настройками, это два места, позволяющие новый исходящий поток из UDP-порта 51821.

В соответствии с текущими правилами тот же поток может быть разрешен вместо ( нового) входящего на номер 51821, что позволит позднее пройти черезglobalсвязать весь поток в обоих направлениях до тех пор, пока одноранговый узел первым достигнет системы, но это может никогда не сработать для IPv4 во входящем направлении сначала, если система скрыта за IPv4 NAT, а шлюз NAT не настроен на пересылку UDP-порта 51821 на этой системы (или просто например если система стоит за CG-NAT...). Если это так,PersistentKeepaliveследует использовать в конфигурации WireGuard.


Примечание. ICMPv6 вoutputс цепочкой следует обращаться так, как это было вinputцепь. Вместо:

       ip protocol icmp accept # handle 24
ip6 nexthdr ipv6-icmp counter packets 3 bytes 192 accept # handle 25

это следует использовать:

      meta l4proto { icmp, ipv6-icmp } counter accept

Причина, как документально подтверждено , заключается в том, что практически никогда не следует использоватьip6 nexthdrчто не является точным эквивалентомip protocol: он может соответствовать промежуточному заголовку, а не окончательному заголовку ICMPv6, и, следовательно, не пропускать трафик.

Другие вопросы по тегам