请建议一些优雅的解决方案来配置具有 wg0 虚拟接口的 Linux 服务器,并连接 vpn 客户端:
- 经过全部从 wg0 中的客户端到 eth1 网络的流量类型;
- 绝对零客户端流量必须泄漏到除 eth1 之外的其他接口;
- 除了来自 wg0 之外的流量不得传递到 eth1;
- 如果任何接口的链路断开/接通,则不能违反规则。
可以使用任何 Linux 发行版、Wireguard(首选)或 OpenVPN。
我尝试这样做:
sudo iptables -t nat -A POSTROUTING --out-interface eth1 -j MASQUERADE
sudo iptables -A FORWARD --in-interface wg0 -j ACCEPT
sudo ip route add default via 192.168.1.1 table 2
sudo ip rule add iif wg0 table 2
它可以工作,但没有针对链路断开/断开和流量泄漏的保护。
PS 也许也可以使用某种桥接或在客户端的 Linux 机器上获取虚拟 eth1 接口的方法来实现目标?
谢谢
答案1
除了汤姆的评论/回答中已经提到的内容之外:
您可以添加第二条优先级较低(指标较高)的捕获全部路由:
ip route add default unreachable metric 5000 table 2
...或第二条规则(使用
pref ...
关键字确保规则的顺序正确):ip rule add pref 500 iif wg0 table 2 ip rule add pref 501 iif wg0 unreachable
(在路线和规则中,您可以选择使用
prohibit
而不是unreachable
来生成 ICMP“管理禁止”。)据我所知,更好的解决方案是将 wg0 和 eth1 分配给一个VRF– 但我自己从来没有用过这个:
ip link add vrf2 type vrf table 2 ip link set vrf2 up ip link set wg0 master vrf2 ip link set eth1 master vrf2 ip route add [something] vrf vrf2
(看内核文档更多细节。)
最后,你可以创建一个网络命名空间并将两个接口都移到那里——它们对于主命名空间来说将完全不可见:
ip netns add ns1 ip link set wg0 netns ns1 ip link set eth1 netns ns1
每个网络命名空间都有自己的接口、自己的路由表、自己的策略规则,甚至自己的 iptables/nftables 规则集——您需要使用
ip netns exec
或nsenter
管理它们。(不同命名空间直接通信的主要方式是通过一对“veth”接口,就像容器中的接口一样 - 尽管隧道和 macvlan 接口也可以移动到命名空间中而不会破坏它们的父关系。)