我的 centos 盒子里运行着 openvpn 客户端,我用它作为内部网络的路由器。我有两个接触外部世界的接口。
eth0 - normal internet
tun0 - openvpn tunnel
我通过放置“route-noexec”选项来禁用 openvpn 自动路由拉动,并且现在手动处理所有路由。在我打开 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。我怎样才能做到这一点?
答案1
基于超级用户上的这个答案:
为某些IP创建路由表:
ip rule add from <sourceIP>/<mask> table <name>
然后声明一条新路由来匹配路由表<name>
:
ip route add default via <router> dev tun0 table <name>
对于需要使用 VPN 的人来说,拥有一个子网会更容易,因为使用此配置,您需要指定表中的所有 IP<name>
答案2
如果您希望将选定 VPN 客户端的所有流量都通过 VPN 隧道,则必须在此用户配置中“在客户端”进行设置。在客户端配置文件中,它是选项:“redirect-gateway autolocal”。在 VPN 服务器上,您可能必须为此 VPN 客户端 IP 设置 SNAT 或 MASQUERADE。
答案3
看一下“iptables 源路由”和这篇文章:https://www.linuxquestions.org/questions/linux-software-2/iptables-source-ip-based-gateway-route-681522/
您可以为具有特定网关的 VPN 客户端创建一个特定的路由表(在您的情况下,这将是您的 VPN 连接的端点),然后只需添加指向此路由表的 iptables 规则。