我在我的 centos 盒子中运行了 openvpn 客户端,我将其用作内部网络的路由器。我有两个接口可以到达外面的世界。
eth0 - normal internet
tun0 - openvpn tunnel
我通过放置“route-noexec”选项禁用 opevpn 自动路由拉取,现在我手动处理所有路由。在我打开 openvpn 隧道后,我的路由表是这样的。
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.80.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
10.8.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
192.168.44.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.11.0 0.0.0.0 255.255.255.0 U 0 0 0 dummy0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1
0.0.0.0 192.168.44.1 0.0.0.0 UG 0 0 0 eth0
现在我有一个内部主机,它连接到我的 centos 盒子上的接口 192.168.80.0
192.168.80.50
我需要通过接口 tun0 路由来自该用户的所有流量,并通过 eth0 路由所有其他流量
我尝试添加这样的 POSTROUTING 规则
iptables -t nat -A POSTROUTING -s 192.168.80.50 -o tun0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
但所有客户端都只通过 eth0,包括 192.168.80.50。我怎样才能做到这一点?
如果您想通过 VPN 隧道为选定的 VPN 客户端放置所有流量,您必须在“客户端”设置此 - 在此用户配置中。在客户端配置文件中,它是选项:“redirect-gateway autolocal”。在 VPN 服务器上,您可能必须为此 VPN 客户端 IP 设置 SNAT 或 MASQUERADE。
基于SuperUser 上的这个答案:
为某些 IP 创建路由表:
然后声明一个新的路由来匹配路由表
<name>
:为需要使用 VPN 的人提供子网会更容易,因为使用此配置,您需要在表中指定所有 IP
<name>
看看“iptables 源路由”和这篇文章:https ://www.linuxquestions.org/questions/linux-software-2/iptables-source-ip-based-gateway-route-681522/
您可以为具有特定网关的 VPN 客户端创建一个特定的路由表(在您的情况下,这将是您的 VPN 连接的端点)并简单地添加一个指向该路由表的 iptables 规则。