我正在使用wg-quick
它来打开 VPN 连接。我可以看到该实用程序正在设置一些nft
规则,我想了解它们。我对 iptables 有一定的了解,但对 nftables 一无所知。
这是 Wireguard 配置文件:
[Interface]
PrivateKey = xxxxx
Address = 10.2.0.2/32
DNS = 10.2.0.1
[Peer]
PublicKey = yyyyyyyy
AllowedIPs = 0.0.0.0/0
Endpoint = 185.159.157.129:51820
当我调用时,wg-quick
我看到的是:
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.2.0.2/32 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] resolvconf -a tun.wg0 -m 0 -x
[#] wg set wg0 fwmark 51820
[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0
[#] sysctl -q net.ipv4.conf.all.src_valid_mark=1
[#] nft -f /dev/fd/63
以下是规则的概要nft
:
table ip wg-quick-wg0 {
chain preraw {
type filter hook prerouting priority raw; policy accept;
iifname != "wg0" ip daddr 10.2.0.2 fib saddr type != local drop
}
chain premangle {
type filter hook prerouting priority mangle; policy accept;
meta l4proto udp meta mark set ct mark
}
chain postmangle {
type filter hook postrouting priority mangle; policy accept;
meta l4proto udp meta mark 0x0000ca6c ct mark set meta mark
}
}
这些nft
规则意味着什么、它们有什么用途以及为什么需要它们?
答案1
第一条规则阻止从其他接口和非本地范围地址对 10.2.0.2 的入站访问。仅接受来自通过计算机接口直接访问的 IP 地址的数据包。出于安全考虑,
第二和第三是策略路由 wireguard 流量的连接标记规则。它们与路由规则紧密耦合
ip -4 rule add not fwmark 51820 table 51820
根据此规则,所有入站和出站流量未标有 51820 路线通过 wg0。
但我们需要
- 来自 wireguard 本身的传出数据包通过主路由表路由到端点(远程对等体)不是通过 51820 表进入 wg0 隧道,
- 来自远程工作组对等体的传入回复被路由到 wireguard 的进程,并且不是通过 51820 表进入 wg0 隧道。
Wg 标志着他们的离任数据包通过设置选项,itslf 的值变为 51820
wg set wg0 fwmark 51820
为了将传入的回复数据包与所有其他传入数据包区分开来,我们需要标记整个 wg 的連接因此我们可以为仅“属于”这些连接的传入数据包恢复相同的数据包的标记。
第三条规则标志着即将离任的 wireguard連接威奇数据包有标记 51820(十六进制为 0x0000ca6c),以便我们可以使用 conntrack 帮助区分这些连接的入站回复。
第二条规则副本连接的标记回到包的标记所有入站数据包。
因此,回复传出 wireguard 连接的数据包将带有标记 51820,并且不是路由到 wg0 但路由到主机本身。
检查路由发生的位置: https://upload.wikimedia.org/wikipedia/commons/3/37/Netfilter-packet-flow.svg