iptables 可以将物理 wireguard UDP 连接与隧道 TCP 会话关联起来吗?

iptables 可以将物理 wireguard UDP 连接与隧道 TCP 会话关联起来吗?

我正在锁定我的 Linux 机箱的出口,使 OUTPUT 链默认拒绝。

我的 wireguard 对等体来自子网10.1.0.0/16。最初我以为我只需要就可以了-A OUTPUT -d 10.1.0.0/16 -j ACCEPT,虽然这是必要的,但这本身是不够的。

通过跟踪确认,与 wireguard 对等体的物理 UDP 连接也需要允许,再想想这也是有道理的。

现在,我可以继续手动允许对等端点的 wireguard 端口。但我想知道是否有一些更自动化的机制,可以将物理 UDP 数据包与已经允许的隧道数据包关联起来,并自动允许它?

答案1

WireGuard 提供了处理此问题的方法iptables:通过在传出的信封数据包上设置防火墙标记。这可以通过低级wg命令,因此也可以使用wg-quick

  • FwMark — 32 位 fwmark对于传出的数据包。如果设置为 0 或“off”,则禁用此选项。可以通过在前面添加“0x”以十六进制指定。可选。

wg-quick提供了一个例子用于PostUp

基于最后一个例子,人们可以尝试所谓的“kill-switch”,为了防止未加密的数据包通过非 WireGuard 接口流动,通过在该部分中添加以下两行PostUp和几行:PreDown[Interface]

PostUp = iptables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PreDown = iptables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT

对于该问题的用例(由于使用默认删除策略,因此具有反向逻辑,并且不需要区分本地情况),配置文件中的内容如下:

[Interface]
...
FwMark = 0xcafe # or any non-zero value
...

PostUp = iptables -A OUTPUT ! -o %i -m mark --mark $(wg show %i fwmark) -j ACCEPT
PreDown = iptables -D OUTPUT ! -o %i -m mark --mark $(wg show %i fwmark) -j ACCEPT

或者可以在 WireGuard 的配置之外添加此规则,可能直接使用 WireGuard 接口名称(例如:)wg0而不是%i规则中的防火墙标记值 0xcafe,而不是从 WireGuard 查询该值。

如果对等方漫游,该规则仍然能够跟踪其传出的信封数据包。

答案2

如果“物理 UDP”指的是发往 VPN 隧道外对等方的流量,则不是。虽然可以通过 iptables 将不同端口上的流量关联到同一地址(端口敲击就是一个很好的例子),但在这种情况下,隧道内外的流量将流向不同的 IP 地址。

相关内容