我与基于 Linux 的路由器有电缆连接。该路由器有两个物理接口:
enp1s0 (dhcp from cable provider)
enp2s0 (192.168.1.1)
在 enp1s0 上进行伪装。然后,我有一个 OpenVPN 客户端连接:
tun0 (10.0.0.4)
再次,在此设备上进行伪装。常规路由表没有指向此设备的条目,但我有一个附加路由表:
vpn-clients
这样我就可以使用该设备添加默认路由:
ip route add default via 10.0.0.1 dev tun0 table vpn-clients
然后指定每个客户端使用哪个表:
ip rule add from 192.168.1.200 lookup vpn-clients
ip rule add from 192.168.1.201 lookup vpn-clients
...
并在 tun0 上进行端口转发:
/sbin/iptables -t nat -A PREROUTING -i tun0 -p udp --dport 5555 -j DNAT --to-destination 192.168.1.200:5555
看起来它正在工作(至少对于传出连接而言)。来自源路由的客户端的所有流量似乎都通过 VPN 路由。
现在,传入连接是完全不同的故事。我曾经记录了大量火星人。
我意识到这可能是由源路由、端口转发和伪装的组合引起的,即内核可能没有意识到传入包的目的地将被修改,而是假设 10.0.0.4 是最终目的地,但这是不可能的,因为没有设置任何路由来解释来自除它自己的子网之外的任何位置到达该目的地的事物。
因此,我添加了一条有点虚拟的路线:
ip rule lookup from 10.0.0.4 lookup vpn-clients
这样该接口的“路由表”就变成了“vpn-clients”,它确实有一个指向该方向的默认路由。
这阻止了 martians 被记录和删除。传入连接现在工作正常。但是,这是“正确”的方法吗?是否可以做得更好?