我正在开发一个用于路由流量的 wireguard 节点。我的计划是允许 wireguard 对等节点通过我相互通信(不进行伪装),并创建一个从我的私有局域网到 wireguard 的单独转发,这次使用伪装。这可能吗?我当前的配置是伪装一切。
iptables -A FORWARD -i %i -o %i -j ACCEPT
iptables -A FORWARD -i eth0 -o %i -j ACCEPT
iptables -t nat -A POSTROUTING -o %i -j MASQUERADE
对于那些不知道的人来说,在 wireguard 中 %i 将被你的网络设备替换,在我的情况下是 wg1
答案1
通常,当所有网络布局都在控制之中时,无需在隧道启动时添加规则,稍后再将其删除。可以预先一劳永逸地添加,而无需在 WireGuard 配置中添加任何规则。这就是我在下面编写常规命令的原因。如果要在 WireGuard 配置文件中使用它,iptables
请随意放回并完成规则删除命令。%i
需要一种在 POSTROUTING 链中使用输入接口的方法。遗憾的是,由于内核过去不为路由数据包在 POSTROUTING 钩子中提供传入接口,因此iptables
不允许这样做,因此:
iptables -t nat -A POSTROUTING ! -i wg1 -o wg1 -j MASQUERADE
被拒绝Can't use -i with POSTROUTING
。
实际上最近的内核(版本 >= 5.5.x)取消了这一限制,以造福nftables并在 POSTROUTING 链中为路由数据包提供输入接口,但仍然有一个检查阻止-i interface
使用iptables' POSTROUTING 链。可以(在较新的内核中)通过使用-i
从 POSTROUTING 调用的用户链来规避限制:
iptables -t nat -N workaround
iptables -t nat -A POSTROUTING -o wg1 -j workaround
iptables -t nat -A workaround ! -i wg1 -j MASQUERADE
由于没有记录,所以这可能不是一个好主意。
因此,最好使用一直有效的方式:IP 源而不是传入接口。如果 WireGuard 路由系统及其对等体都配置为使用 192.0.2.0/24 块中的 IP 地址,则可以使用此方法:
iptables -t nat -A POSTROUTING ! -s 192.0.2.0/24 -o wg1 -j MASQUERADE
当然iptables可以替换为nftables然后就可以简单地使用接口名称:
nft add table ip handlewireguard
nft add chain ip handlewireguard natpostrouting '{ type nat hook postrouting priority 90; policy accept; }'
nft add rule ip handlewireguard natpostrouting iifname != wg1 oifname wg1 masquerade