Linux路由:如何为不同用户配置多网关流量转发
我之前在配置多网关策略路由的时候,也踩过OpenVPN客户端模式的坑,结合你的场景,给你梳理几个关键的调整点和最优方案:
先搞懂OpenVPN默认客户端的“坑”
默认OpenVPN客户端配置会自动执行两个操作,直接打乱你的策略路由:
- 拉取远程服务器的路由规则,把默认路由(0.0.0.0/0)塞进主路由表,优先级还很高;
- 可能会修改路由表优先级,导致自定义的用户路由表规则被忽略。
这就是为什么你的PPP方案正常,但OpenVPN失效的核心原因——默认配置直接覆盖了你的策略路由逻辑。
核心优化方案:自定义OpenVPN路由与策略规则
1. 让OpenVPN不干扰主路由表
修改你的OpenVPN客户端配置文件(比如/etc/openvpn/client.conf),添加以下参数:
# 禁止拉取服务器端的路由规则 route-nopull # 可选:如果需要访问VPN服务器所在的局域网,手动添加路由(按需) # route 192.168.100.0 255.255.255.0
这样OpenVPN只会建立隧道,不会修改主路由表,完全由你手动控制路由规则。
2. 为目标用户创建专属OpenVPN路由表
假设你给需要走VPN的用户(比如网段192.168.1.50/32或192.168.1.100-200)分配的路由表编号是101(可选范围1-252),执行以下命令:
# 把默认路由指向OpenVPN网关(替换成你的VPN隧道网关,通常是tun0的peer IP,比如10.8.0.1) ip route add 0.0.0.0/0 via 10.8.0.1 dev tun0 table 101 # 必须添加:访问VPN服务器的流量走本地网关(比如你的电缆调制解调器网关192.168.0.1),避免死循环 ip route add <VPN服务器公网IP> via 192.168.0.1 dev eth0 table 101 # 添加局域网路由,确保用户能访问本地设备 ip route add 192.168.1.0/24 dev eth0 table 101
如果需要开机自动执行,可以把这些命令写到OpenVPN的up脚本里(在配置文件中添加up /etc/openvpn/up-vpn-routes.sh,脚本要加执行权限)。
3. 配置策略路由规则,让用户流量匹配到专属表
给目标用户的IP/网段添加规则,让他们的流量优先使用表101:
# 优先级设为100(越小越优先,要比主表的默认规则优先级32766高) ip rule add from 192.168.1.50/32 lookup 101 priority 100
可以用ip rule list查看规则是否生效,确保你的规则排在主表规则前面。
4. 绑定NAT规则到OpenVPN接口
和PPP的NAT逻辑一样,要给走VPN的用户配置专属NAT:
iptables -t nat -A POSTROUTING -s 192.168.1.50/32 -o tun0 -j MASQUERADE
注意:如果你的主NAT规则是针对eth0的,确保这条VPN NAT规则排在主规则前面,或者主规则加-o eth0限制,避免冲突。
验证配置是否生效
用ip route get命令测试目标用户的路由走向:
ip route get 8.8.8.8 from 192.168.1.50
如果输出显示8.8.8.8 via 10.8.0.1 dev tun0 table 101,说明路由规则已经生效;如果还是走主表的默认路由,检查规则优先级或路由表配置。
额外注意事项
- 不要用OpenVPN的
redirect-gateway def1参数,它会强制所有流量走VPN,直接覆盖你的策略路由; - 有些发行版的NetworkManager会自动管理OpenVPN路由,建议把OpenVPN设置为“手动”模式,避免自动修改路由;
- 定期检查OpenVPN隧道状态,如果重连后网关IP变化,需要重新更新路由表的
via地址(可以在up脚本里自动获取)。
按照这个流程调整后,指定用户的所有互联网流量就会稳定走OpenVPN网关,和你的PPP方案逻辑保持一致。
内容的提问来源于stack exchange,提问作者internet-og

