如何使用 nftables 允许跨命名空间通过 VPN 进行通信

如何使用 nftables 允许跨命名空间通过 VPN 进行通信

我在专用命名空间中配置了一个 wireguard 接口vpn。首先在主命名空间中创建接口(可以访问路由到 Internet 的物理接口eno1),然后将 Wireguard 接口移动wg0vpn命名空间(参考)。

现在,这是我在主命名空间中的规则集:

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

我如何允许流量来自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 NAT 后面,并且 NAT 网关未配置为将 UDP 端口 51821 转发到此系统(或者只是例如,如果系统位于 CG-NAT 后面...),则这可能永远不会首先在传入方向上对 IPv4 起作用。如果是这种情况,PersistentKeepalive则应在 WireGuard 的配置中使用。


注意:链中的 ICMPv6output应像在链中一样处理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 标头,因此无法允许流量。

相关内容