避免将数据包当作“火星人”对待:这种想法是否正确?

我有一个基于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 

这看起来像在工作(至less对于传出连接)。 来自源路由客户端的所有stream量似乎都通过vpn路由。

现在,传入的连接是完全不同的故事。 我曾经有记载的火星人的负载和负载。

我意识到它可能是由源路由,端口转发和伪装组合引起的,即内核可能不知道传入包的目的地将被修改,而是假定10.0.0.4是最终目的地,这是不可能的,因为没有任何路由设置可以解释从目的地除了它自己的子网以外的任何东西。

所以,我添加了一个虚拟的路线:

 ip rule lookup from 10.0.0.4 lookup vpn-clients 

所以这个接口的“路由表”变成了“vpn-clients”,它有一个默认路由指向那个方向。

这阻止了火星人的login和丢弃。 传入连接现在工作正常。 这是“正确的”方式吗? 有可能做得更好吗?