OpenWRT路由器OpenVPN tun0接口的路由/iptables配置及自动启停脚本需求
OpenWRT路由器OpenVPN tun0接口的路由/iptables配置及自动启停脚本需求
我来帮你梳理并解决这个OpenWRT上的VPN路由配置问题,结合你的需求和现有环境,给你一套完整的可落地方案:
问题背景
你在OpenWRT路由器上配置第三方商业OpenVPN,由于ISP封锁了常规VPN协议,先在路由器上搭建了HTTP代理(192.168.55.1:1080)让OpenVPN通过代理连接服务器。为了避免VPN服务器推送的路由把代理进程也导向tun0导致链路崩溃,你在client.ovpn里加了route-nopull配置,现在tun0能正常建立连接,但需要手动配置路由和iptables规则,同时希望实现自动启停时的规则管理。
你的路由器基础信息:
- 路由器LAN地址:192.168.55.1
- LAN设备DHCP池:192.168.55.65-192.168.55.126(对应子网
192.168.55.64/26) - 使用iptables(fw3)而非nftables(fw4)
当前client.ovpn关键配置:
client dev tun0 proto tcp remote XX.YY.ZZ.RR 443 nobind auth-user-pass cred.txt persist-tun # 其他省略配置... http-proxy 192.168.55.1 1080 auto http-proxy-retry route-nopull
当前默认路由表(tun0已启动):
# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.8.1 0.0.0.0 UG 0 0 0 phy1-sta0 10.124.148.0 0.0.0.0 255.255.254.0 U 0 0 0 tun0 192.168.8.0 0.0.0.0 255.255.255.0 U 0 0 0 phy1-sta0 192.168.55.0 0.0.0.0 255.255.255.0 U 0 0 0 br-lan
核心需求
你需要实现三个核心目标:
- [a] 所有LAN设备(192.168.55.64/26子网)的全部互联网流量(SSH、DNS、ICMP、TCP、UDP等)走tun0接口,路由器自身流量不走VPN
- [b] 当tun0未启动或无响应时,完全阻断LAN设备的互联网访问,仅允许LAN内网通信
- [c] 所有LAN内设备(路由器、打印机、PC、NAS等)可无限制互相通信
解决方案:分步配置
1. 确认自定义路由表配置
你已经在/etc/iproute2/rt_tables里添加了自定义路由表,确认配置如下即可:
# 编辑文件 vi /etc/iproute2/rt_tables # 确保存在以下行 1 ovpn
2. 路由规则配置(tun0启动时生效)
为LAN子网指定专属路由表,让它们的默认路由走tun0,同时保留LAN内网路由,且确保路由器自身流量走主路由表:
# 给ovpn表添加默认路由(走tun0) ip route add default dev tun0 table ovpn # 把LAN子网路由加入ovpn表,确保内网通信不经过VPN ip route add 192.168.55.0/24 dev br-lan table ovpn # 添加规则:来自LAN子网的流量使用ovpn表 ip rule add from 192.168.55.64/26 table ovpn # 强制路由器自身流量使用主路由表(不走VPN),这一步是关键! ip rule add from 192.168.55.1 table main
3. iptables规则配置
配置NAT转发、防火墙规则,同时实现tun0未启动时阻断LAN互联网访问:
# 1. 配置tun0的NAT转发,让LAN设备通过VPN上网 iptables -t nat -A POSTROUTING -o tun0 -s 192.168.55.64/26 -j MASQUERADE # 2. 允许LAN到tun0的转发,以及tun0到LAN的已建立连接转发 iptables -A FORWARD -i br-lan -o tun0 -s 192.168.55.64/26 -j ACCEPT iptables -A FORWARD -i tun0 -o br-lan -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # 3. 默认拒绝LAN到WAN(非tun0)的转发,确保tun0未启动时LAN设备无法访问外网 iptables -A FORWARD -i br-lan -o phy1-sta0 -s 192.168.55.64/26 -j REJECT # 4. 允许所有LAN内网设备互相通信 iptables -A FORWARD -i br-lan -o br-lan -j ACCEPT # 5. 允许路由器接收tun0的相关/已建立连接 iptables -A INPUT -i tun0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
4. 自动启停脚本(tun0上下线自动触发)
利用OpenWRT的热插拔脚本机制,创建两个脚本自动管理路由和iptables规则:
脚本1:tun0启动时执行(/etc/hotplug.d/iface/99-vpn-up)
#!/bin/sh if [ "$INTERFACE" = "tun0" ] && [ "$ACTION" = "ifup" ]; then # 添加路由规则 ip route add default dev tun0 table ovpn ip route add 192.168.55.0/24 dev br-lan table ovpn ip rule add from 192.168.55.64/26 table ovpn ip rule add from 192.168.55.1 table main # 添加iptables规则 iptables -t nat -A POSTROUTING -o tun0 -s 192.168.55.64/26 -j MASQUERADE iptables -A FORWARD -i br-lan -o tun0 -s 192.168.55.64/26 -j ACCEPT iptables -A FORWARD -i tun0 -o br-lan -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -i tun0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT fi
脚本2:tun0关闭时执行(/etc/hotplug.d/iface/99-vpn-down)
#!/bin/sh if [ "$INTERFACE" = "tun0" ] && [ "$ACTION" = "ifdown" ]; then # 删除路由规则 ip rule del from 192.168.55.64/26 table ovpn ip rule del from 192.168.55.1 table main ip route del default dev tun0 table ovpn ip route del 192.168.55.0/24 dev br-lan table ovpn # 删除iptables规则(注意顺序要和添加时相反) iptables -t nat -D POSTROUTING -o tun0 -s 192.168.55.64/26 -j MASQUERADE iptables -D FORWARD -i br-lan -o tun0 -s 192.168.55.64/26 -j ACCEPT iptables -D FORWARD -i tun0 -o br-lan -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT iptables -D INPUT -i tun0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT fi
给脚本添加执行权限:
chmod +x /etc/hotplug.d/iface/99-vpn-up chmod +x /etc/hotplug.d/iface/99-vpn-down
5. 验证方法
- 启动OpenVPN,确认tun0接口存在:
ip link show tun0 - 查看路由规则:
ip rule show,应能看到针对192.168.55.64/26和192.168.55.1的规则 - 在LAN设备上测试:访问网站后用
traceroute查看第一跳是否为VPN服务器地址;关闭OpenVPN后,LAN设备应无法访问外网,但能ping通路由器和其他LAN设备 - 确认路由器自身流量不走VPN:在路由器上执行
curl ifconfig.me,应显示你的ISP公网IP而非VPN IP
备注:内容来源于stack exchange,提问作者osiaso




