Linux主机OpenVPN环境下80端口流量绕过隧道失败及iptables有效性诊断求助
Linux主机OpenVPN环境下80端口流量绕过隧道失败及iptables有效性诊断求助
我完全理解你现在的困扰:整个系统流量都被OpenVPN强制走tun0隧道,但你想让Nginx的80端口流量绕回eth0网卡,试了iptables标记+自定义路由表的方法却没效果,甚至怀疑iptables是不是根本没在工作。咱们一步一步来排查问题,找到解决办法。
第一步:先确认iptables是否真的生效
首先得排除“iptables完全没工作”这个可能性,你可以做这几个测试:
- 检查iptables模块是否加载:执行
lsmod | grep ip_tables和lsmod | grep iptable_mangle,如果没有任何输出,说明对应的内核模块没加载,手动加载试试:modprobe ip_tables modprobe iptable_mangle - 直接测试规则拦截效果:临时加一条拦截80端口的规则,然后验证是否生效:
然后用另一台机器访问你的Linux主机的80端口,如果完全连不上,说明iptables是生效的,记得测试完后删掉这条规则:# 临时禁止所有80端口的入站流量 iptables -A INPUT -p tcp --dport 80 -j DROPiptables -D INPUT -p tcp --dport 80 -j DROP - 检查是否有其他防火墙工具干扰:比如ufw或者firewalld,执行
systemctl status ufw或systemctl status firewalld,如果这些服务在运行,它们可能会覆盖你的iptables规则,建议先临时停止这些服务再测试:systemctl stop ufw # 或者firewalld systemctl stop firewalld
第二步:排查你现有路由+iptables规则的问题
从你给出的信息来看,现有规则存在几个可能的漏洞:
- 只标记了入站流量,没标记出站回包:你的mangle表PREROUTING链标记了80端口的入站流量,但Nginx响应请求时的出站回包(源端口是80)没被标记,这部分流量还是会走默认的隧道路由。
- 自定义路由表缺少本地子网路由:你给table 80只加了默认路由,但没有添加192.168.1.0/24的子网路由,标记后的流量可能找不到局域网的路径,导致无法正常转发。
- OpenVPN自动创建的table 100可能冲突:OpenVPN的route-up脚本创建的table 100规则,可能和你的自定义路由规则优先级冲突,建议先暂时注释掉这部分规则,先测试基础配置是否生效。
第三步:调整后的可行配置方案
先清理现有可能冲突的规则,然后重新配置:
- 清理旧规则:
# 清空mangle表PREROUTING链的规则 iptables -t mangle -F PREROUTING # 删除旧的路由规则和路由表 ip rule del fwmark 0x80 lookup 80 ip route flush table 80 - 标记双向的80端口流量:
# 标记入站的80端口请求流量 iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 0x80 # 标记Nginx出站的回包流量(源端口为80) iptables -t mangle -A OUTPUT -p tcp --sport 80 -j MARK --set-mark 0x80 - 配置自定义路由表80:
# 先添加本地子网路由,确保能访问局域网设备 ip route add 192.168.1.0/24 dev eth0 table 80 # 添加默认路由到eth0的网关 ip route add default via 192.168.1.1 dev eth0 table 80 - 添加路由规则,让标记流量走自定义表:
# 设置优先级100(比默认的main表规则优先级高,优先匹配) ip rule add fwmark 0x80 lookup 80 priority 100 - 刷新路由缓存:
ip route flush cache
第四步:验证效果
执行以下命令查看流量走向:
# 监听eth0的80端口流量 tcpdump -i eth0 port 80 # 同时开另一个终端监听tun0的80端口流量 tcpdump -i tun0 port 80
然后从外部访问你的80端口,如果eth0有流量输出,而tun0没有,说明配置成功了。
如果需要重启后规则不失效,可以用iptables-save > /etc/iptables/rules.v4保存iptables规则(需要安装iptables-persistent),路由规则可以加到/etc/rc.local文件里(确保rc.local有执行权限)。
备注:内容来源于stack exchange,提问作者raga70
相关产品推荐
相关产品推荐

