如何严格转发 VPN 客户端的流量到特定网络

如何严格转发 VPN 客户端的流量到特定网络

请参阅图表

请建议一些优雅的解决方案来配置具有 wg0 虚拟接口的 Linux 服务器,并连接 vpn 客户端:

  1. 经过全部从 wg0 中的客户端到 eth1 网络的流量类型;
  2. 绝对零客户端流量必须泄漏到除 eth1 之外的其他接口;
  3. 除了来自 wg0 之外的流量不得传递到 eth1;
  4. 如果任何接口的链路断开/接通,则不能违反规则。

可以使用任何 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 execnsenter管理它们。

    (不同命名空间直接通信的主要方式是通过一对“veth”接口,就像容器中的接口一样 - 尽管隧道和 macvlan 接口也可以移动到命名空间中而不会破坏它们的父关系。)

相关内容