You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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. 验证方法

  1. 启动OpenVPN,确认tun0接口存在:ip link show tun0
  2. 查看路由规则:ip rule show,应能看到针对192.168.55.64/26和192.168.55.1的规则
  3. 在LAN设备上测试:访问网站后用traceroute查看第一跳是否为VPN服务器地址;关闭OpenVPN后,LAN设备应无法访问外网,但能ping通路由器和其他LAN设备
  4. 确认路由器自身流量不走VPN:在路由器上执行curl ifconfig.me,应显示你的ISP公网IP而非VPN IP

备注:内容来源于stack exchange,提问作者osiaso

火山引擎 最新活动