我在专用命名空间中配置了一个 wireguard 接口vpn
。首先在主命名空间中创建接口(可以访问路由到 Internet 的物理接口eno1
),然后将 Wireguard 接口移动wg0
到vpn
命名空间(参考)。
现在,这是我在主命名空间中的规则集:
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 标头,因此无法允许流量。