找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888广告投放联系QQ68610888
广告投放联系QQ68610888广告投放联系QQ68610888
查看: 1836|回复: 11

OpenWrt 双线分流IPV4+IPV6 联通+电信 | nftables策略路由 |故障barK IOS手机推送

[复制链接]
发表于 2026-4-4 15:49 | 显示全部楼层 |阅读模式
本帖最后由 ReEnter 于 2026-4-9 00:38 编辑

标题:OpenWrt 双线分流完全指南 | 联通+电信 | nftables策略路由 | OpenClash联动
文档最后提供html版本地生成器

实际效果






基于 Kiddin' 固件 (Master 25.12.1),OpenWrt 双线分流IPV4+IPV6  联通+电信,OpenClash代理流量跟随系统路由。

为什么不用mwan3?
OpenWrt 23.05+ 和 master 分支已从iptables迁移到nftables,mwan3依赖iptables的-j MARK和-j CONNMARK,在纯nftables环境下会出现:
• 规则加载失败
• 防火墙重启后规则丢失
• 与OpenClash的nftables规则冲突
• conntrack标记不生效导致回程不对称

方案:直接用 nftables + ip rule 策略路由,绕过 mwan3

================================================================
一、环境检查
================================================================

1.1 确认WAN接口
  1. # 查看所有PPPoE接口
  2. ip link show | grep -E "pppoe|wan"
复制代码


1.2 确认当前路由
  1. # 查看默认路由和metric
  2. ip route show
复制代码


重点看default via行的metric值,metric越小优先级越高。

1.3 确认接口配置
  1. # 查看所有WAN相关配置
  2. uci show network | grep -E "wan.*proto|wan.*ifname|wan.*gateway|wan.*metric|wan.*device"

  3. # 单独看每个接口
  4. uci show network.wan
  5. uci show network.DxPPoE
复制代码


1.4 确认防火墙区域
  1. uci show firewall | grep -E "zone.*wan|zone.*network"
复制代码


关键:两个WAN接口必须在同一个防火墙zone(通常是wan)里。如果WAN2不在任何zone里,流量会被防火墙丢弃。

1.5 确认nftables可用
  1. nft --version
  2. nft list tables
复制代码


fw4是OpenWrt防火墙的表,绝对不能动。我们创建自己的表 inet dualwan。

1.6 检查已有分流组件
  1. ps | grep -E "mwan|dualwan|passwall|open插件"
  2. opkg list-installed | grep -E "mwan3|pbr|passwall|open插件"
复制代码


如果mwan3正在运行,必须先禁用:
  1. /etc/init.d/mwan3 stop
  2. /etc/init.d/mwan3 disable
复制代码


================================================================
二、设置路由优先级(metric)
================================================================

metric是Linux路由表的核心概念。当存在多条到达同一目标的路由时,内核选择metric最小的那条。

  1. default via 10.91.0.1  dev pppoe-wan     metric 10  ← 内核选这条
  2. default via 100.64.0.1 dev pppoe-DxPPoE  metric 20  ← 备用
复制代码


当pppoe-wan接口down时,内核自动删除metric 10的路由,剩下metric 20成为唯一选择,流量自动切换。

在UCI中设置:
  1. # WAN1 metric = 10(优先)
  2. uci set network.wan.metric='10'
  3. # WAN2 metric = 20(备用)
  4. uci set network.DxPPoE.metric='20'
  5. uci commit network
  6. /etc/init.d/network restart
复制代码


局限性:metric只在接口up/down时自动切换。如果运营商线路故障但PPPoE没断开(接口还是UP状态),metric不会触发切换。所以需要第3步的守护进程做主动健康检查。

================================================================
三、守护进程(故障切换)
================================================================

守护进程每2秒检测两条线路的连通性,任一线路故障时自动调整路由表,恢复后自动切回。

3.1 创建守护脚本

  1. <blockquote> cat > /usr/bin/dualwan.sh << 'SCRIPT'
复制代码


3.2 创建系统服务

  1. cat > /etc/init.d/dualwan << 'EOF'
  2. #!/bin/sh /etc/rc.common

  3. START=99
  4. STOP=10
  5. USE_PROCD=1

  6. start_service() {
  7.     procd_open_instance
  8.     procd_set_param command /usr/bin/dualwan.sh
  9.     procd_set_param respawn
  10.     procd_set_param stdout 1
  11.     procd_set_param stderr 1
  12.     procd_close_instance
  13. }

  14. stop_service() {
  15.     killall dualwan.sh 2>/dev/null
  16. }

  17. service_triggers() {
  18.     procd_add_reload_trigger "network"
  19. }
  20. EOF

  21. chmod +x /etc/init.d/dualwan
复制代码


3.3 启动服务
  1. /etc/init.d/dualwan enable
  2. /etc/init.d/dualwan start
  3. ps | grep dualwan
  4. tail -F /tmp/dualwan.log
复制代码


为什么要用procd?
• 进程意外退出自动重启
• 开机自启
• network接口变化时自动重启脚本,确保网关重新获取

为什么要用 tail -F 而不是 tail -f?
tail -f跟踪文件描述符,日志文件被重建就丢失跟踪了。tail -F会自动检测文件变化并重新打开。

================================================================
四、ISP分流(电信/联通)
================================================================

让电信IP走电信线路,联通IP走联通线路,减少跨网延迟。

4.1 下载IP段列表
  1. mkdir -p /etc/dualwan
  2. wget -qO /etc/dualwan/ct.txt [url]https://ispip.clang.cn/chinatelecom.txt[/url]
  3. wget -qO /etc/dualwan/cu.txt [url]https://ispip.clang.cn/unicom_cnc.txt[/url]
  4. wc -l /etc/dualwan/ct.txt /etc/dualwan/cu.txt
  5. head -3 /etc/dualwan/ct.txt
复制代码


4.2 添加自定义路由表
  1. cat >> /etc/iproute2/rt_tables << 'EOF'
  2. 100     telecom
  3. 200     unicom
  4. EOF
复制代码


4.3 流量走向

  1. 数据包到达 → PREROUTING链(mangle阶段)
  2.   ├─ 目标IP在@telecom → 打标记 mark 100 → telecom路由表 → 电信出口
  3.   ├─ 目标IP在@unicom  → 打标记 mark 200 → unicom路由表  → 联通出口
  4.   └─ 都不匹配         → 不打标记          → main表(默认)   → 联通出口
复制代码


4.4 故障时的路由变化

  1. 线路状态          telecom路由表              unicom路由表               默认路由
  2. 联通通 电信通     默认→电信 备用→联通      默认→联通 备用→电信       联通(metric 10)
  3. 联通断 电信通     默认→电信                默认→电信                 电信(metric 10)
  4. 联通通 电信断     默认→联通                默认→联通                 联通(metric 10)
  5. 联通断 电信断     默认→联通                默认→联通                 联通(metric 10)
复制代码


每个路由表都设了备份路由。比如telecom表里除了电信出口还有联通出口(metric 20),当电信线路挂了,守护进程把telecom表的默认路由改成联通,电信IP就自动走联通了。

4.5 定期更新IP列表
  1. cat > /usr/bin/update-ipset.sh << 'EOF'
  2. #!/bin/sh
  3. wget -qO /etc/dualwan/ct.txt [url]https://ispip.clang.cn/chinatelecom.txt[/url]
  4. wget -qO /etc/dualwan/cu.txt [url]https://ispip.clang.cn/unicom_cnc.txt[/url]

  5. nft flush set inet dualwan telecom
  6. nft flush set inet dualwan unicom

  7. ct=$(awk '{printf "%s, ", $0}' /etc/dualwan/ct.txt)
  8. nft add element inet dualwan telecom "{ ${ct%,} }"

  9. cu=$(awk '{printf "%s, ", $0}' /etc/dualwan/cu.txt)
  10. nft add element inet dualwan unicom "{ ${cu%,} }"

  11. logger -t dualwan "IP列表已更新"
  12. EOF

  13. chmod +x /usr/bin/update-ipset.sh

  14. # 每周日凌晨3点自动更新
  15. echo '0 3 * * 0 /usr/bin/update-ipset.sh' >> /etc/crontabs/root
  16. /etc/init.d/cron restart
复制代码


================================================================
五、OpenClash联动
================================================================

结论:不冲突,天然兼容

OpenClash在PREROUTING阶段劫持流量,我们的nftables mark也在PREROUTING阶段。关键在于:OpenClash把流量截走后,最终还是要经过系统路由表选择出口网卡。只要Clash内核没有绑定特定出口接口,它就会跟随系统路由。

验证Clash没有绑定出口:
  1. cat $(uci get open插件.config.config_path) | grep -A2 -E "interface-name|routing-mark|bind-address"
  2. # 输出为空说明没有绑定,自动跟随系统路由
复制代码


流量路径分析:

  1. 国内域名  → OpenClash: DIRECT → nftables按IP打标记 → 匹配的运营商线路
  2. 国外流量  → OpenClash: 走代理  → Clash发包目标IP被nftables匹配 → 匹配的运营商线路
  3. 国内IP    → OpenClash: 不处理  → nftables按IP打标记 → 匹配的运营商线路
复制代码


注意:OpenClash重启时会重建nftables规则,可能连带清掉dualwan表。如果发现分流突然失效,执行 /etc/init.d/dualwan restart 恢复。

================================================================
六、测试验证
================================================================

6.1 基础连通性
  1. # 验证两条线路都通
  2. ping -c 3 -I pppoe-wan 223.5.5.5
  3. ping -c 3 -I pppoe-DxPPoE 223.5.5.5

  4. # 验证默认路由
  5. ip route show default

  6. # 验证策略路由
  7. ip rule show

  8. # 验证路由表
  9. ip route show table telecom
  10. ip route show table unicom
复制代码
安装好后,手工测试两条线的断线恢复
  1. /etc/init.d/dualwan restart

  2. iptables -I OUTPUT -o pppoe-wan -p icmp -j DROP
  3. sleep 6
  4. # 手机应该收到 1 条"联通断线"
  5. # 日志里有 "状态: 联通=断 电信=通"   
  6. iptables -D OUTPUT -o pppoe-wan -p icmp -j DROP
  7. sleep 6
  8. # 手机应该收到 1 条"电信断线"
  9. # 日志里有 "状态: 联通=通 电信=断"
  10. iptables -I OUTPUT -o pppoe-DxPPoE -p icmp -j DROP
  11. sleep 6
  12. iptables -D OUTPUT -o pppoe-DxPPoE -p icmp -j DROP
复制代码

6.2 故障切换测试

开两个终端:

终端1(看日志):
  1. tail -F /tmp/dualwan.log
复制代码


终端2(测试联通断线):
  1. # 阻断联通ICMP出站
  2. iptables -I OUTPUT -o pppoe-wan -p icmp -j DROP

  3. # 等4-6秒,日志应该显示:
  4. # 联通断线
  5. # 状态: 联通=断 电信=通

  6. # 恢复联通
  7. iptables -D OUTPUT -o pppoe-wan -p icmp -j DROP

  8. # 日志应该显示:
  9. # 联通恢复
  10. # 状态: 联通=通 电信=通
复制代码


测试电信断线:
  1. iptables -I OUTPUT -o pppoe-DxPPoE -p icmp -j DROP
  2. # 日志应该显示:电信断线

  3. iptables -D OUTPUT -o pppoe-DxPPoE -p icmp -j DROP
  4. # 日志应该显示:电信恢复
复制代码


测试完必须清理:
  1. iptables -D OUTPUT -o pppoe-wan -p icmp -j DROP 2>/dev/null
  2. iptables -D OUTPUT -o pppoe-DxPPoE -p icmp -j DROP 2>/dev/null
复制代码




================================================================
七、常见问题
================================================================

Q: tail -f日志不刷新
A: 用 tail -F(大写),它会自动跟踪文件重建。

Q: nftables加载IP太慢
A: 逐条nft add element加载3000+条IP要几十秒。用awk批量加载:
  1. elements=$(awk '{printf "%s, ", $0}' /etc/dualwan/ct.txt)
  2. nft add element inet dualwan telecom "{ ${elements%,} }"
复制代码

3000条从30秒降到1-2秒。

Q: PPPoE网关写死重启后不生效
A: PPPoE每次拨号网关可能不同。用动态获取:
  1. ip route show default dev pppoe-wan | awk '{print $3}'
复制代码


Q: WAN2完全不通
A: WAN2接口没有加入wan防火墙区域:
  1. uci set firewall.@zone[1].network='wan' 'DxPPoE'
  2. uci commit firewall
  3. /etc/init.d/firewall restart
复制代码


Q: 重启后配置丢失
A: 检查清单:
• /etc/init.d/dualwan 是否已enable?
• /etc/iproute2/rt_tables 是否已添加自定义路由表?
• /etc/dualwan/ 目录和IP文件是否存在?
• 脚本权限是否有x?

排障命令速查:
  1. ps | grep dualwan                    # 查看进程
  2. tail -20 /tmp/dualwan.log             # 查看日志
  3. logread | grep dualwan                # 查看系统日志
  4. nft list table inet dualwan           # 查看nftables表
  5. ip rule show                          # 查看策略路由
  6. ip route show table telecom           # 查看电信路由表
  7. ip route show table unicom            # 查看联通路由表
  8. ping -c 3 -I pppoe-wan 223.5.5.5     # 测试联通线路
  9. ping -c 3 -I pppoe-DxPPoE 223.5.5.5  # 测试电信线路
  10. /etc/init.d/dualwan restart           # 重启服务
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
发表于 2026-4-5 19:16 | 显示全部楼层
我目前就是双线mwan3联通和移动,然后”PW SOFTWARE“2 ,istroeos 24.10版本
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2026-4-6 01:53 | 显示全部楼层
支持ipv6吗
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2026-4-6 09:18 | 显示全部楼层
谢谢分享!
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2026-5-23 16:22 | 显示全部楼层
研究研究,网络环境跟你一样的,联通1000兆+电信2000兆
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2026-5-26 23:36 | 显示全部楼层
弄了几天,死活没有分流成功,楼主解答一下到底哪里出错了,线路跟你一样,联通和电信
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2026-5-28 23:15 | 显示全部楼层
还有一个疑问,为什么只有IPv4的列表,没有IPv6的列表呢?
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2026-5-29 09:05 来自手机 | 显示全部楼层
感谢大佬分享,研究研究
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2026-5-30 20:32 | 显示全部楼层
感谢,照此教程已成功配置双线分流

点评

兄弟你能正常分流了吗?检测正常了吗,用的哪个版本openwrt啊?  详情 回复 发表于 2026-6-2 09:38
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2026-6-2 08:23 | 显示全部楼层
本帖最后由 caolei3721 于 2026-6-2 09:56 编辑

研究了几天脚本生成好像有错误
前面
                ip daddr @unicom meta mark set 100
                ip daddr @telecom  meta mark set 200  


后面
setup_rules() {
    while ip -4 rule del fwmark 100 table telecom 2>/dev/null; do :; done
    while ip -4 rule del fwmark 200 table unicom  2>/dev/null; do :; done
    while ip -6 rule del fwmark 100 table telecom 2>/dev/null; do :; done
    while ip -6 rule del fwmark 200 table unicom  2>/dev/null; do :; done
    ip -4 rule add fwmark 100 table telecom priority 100
    ip -4 rule add fwmark 200 table unicom  priority 200
    ip -6 rule add fwmark 100 table telecom priority 100
    ip -6 rule add fwmark 200 table unicom  priority 200

下面这个rules这个是不是反了啊?
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2026-6-2 09:38 | 显示全部楼层
zjd3425 发表于 2026-5-30 20:32
感谢,照此教程已成功配置双线分流

兄弟你能正常分流了吗?检测正常了吗,用的哪个版本openwrt啊?
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2026-7-12 11:35 | 显示全部楼层
脚本不错,标记一下!!!!!!!!!!!!!
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /2 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2026-8-23 23:00

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 电话:13506125623

快速回复 返回顶部 返回列表