如何让Web应用的进出流量通过eth0而非tun0(VPN)路由?
如何让Web应用的进出流量通过eth0而非tun0(VPN)路由?
嗨,这个场景我碰到过好多次了,其实有几种实用的方法可以实现,你可以根据自己的需求选:
方法一:基于用户的路由隔离(适合以特定用户运行的Web应用)
如果你的Web应用是用单独的系统用户(比如www-data)运行的,这种方法最省心:
先确认eth0的网关信息,执行命令:
ip route show dev eth0你会看到类似
default via 192.168.1.1 dev eth0和192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100的输出,记下来网关(比如192.168.1.1)和子网段(比如192.168.1.0/24)。添加自定义路由表:
编辑/etc/iproute2/rt_tables文件,在末尾加一行:100 webapp-route这里
100是路由表的编号,webapp-route是自定义的表名,随便取好记的就行。往自定义路由表里添加规则:
# 添加本地子网路由 ip route add 192.168.1.0/24 dev eth0 table webapp-route # 添加默认网关(用你刚才记下的eth0网关) ip route add default via 192.168.1.1 dev eth0 table webapp-route让Web应用用户的流量走这个路由表:
先查Web应用运行用户的UID,比如www-data的话:id www-data输出里会有
uid=33(www-data),然后执行:ip rule add uidrange 33-33 table webapp-route这样所有
www-data用户发起的流量都会走eth0,绕开VPN的tun0。
方法二:基于端口的路由隔离(适合固定端口的Web应用)
如果你的Web应用监听固定端口(比如8080),可以用流量标记的方式实现:
重复方法一的步骤1-3,先创建好自定义路由表和路由规则。
标记Web应用的出站流量:
iptables -t mangle -A OUTPUT -p tcp --sport 8080 -j MARK --set-mark 1标记Web应用的入站流量(确保返回的流量也走eth0):
iptables -t mangle -A PREROUTING -p tcp --dport 8080 -j MARK --set-mark 1让标记为1的流量走自定义路由表:
ip rule add fwmark 1 table webapp-route
注意事项
- 以上命令都是临时生效的,重启系统后会失效。如果要持久化,可以把这些命令加到
/etc/rc.local(记得给文件加执行权限),或者写一个systemd服务来执行。 - 如果你的VPN客户端会自动修改默认路由,可能需要调整VPN的配置,比如禁止它设置默认路由,或者在VPN启动后再执行上述路由规则。
备注:内容来源于stack exchange,提问作者bcsta
相关产品推荐
相关产品推荐

