电信+移动双线分流实战:策略路由与源进源出详解

很多家庭是"电信 + 移动"双宽带组合:电信线路贵但有公网 IP、延迟低,适合远程访问和游戏;移动线路便宜、带宽大,适合下载和看视频。如果只是简单负载均衡,流量随机走哪条线全凭运气——电信的 IP 段走了移动线路,速度反而变慢。这篇文章讲双线分流的两个关键技术:源进源出和运营商 IP 策略路由。

场景:为什么电信和移动要分开走

先明确分工。典型的双线家庭会这样规划:

需求走哪条线原因
远程访问家里 NAS、建站电信有公网 IP,电信骨干延迟低
游戏、视频会议电信延迟稳定
大文件下载、视频缓存移动带宽大、便宜,跑量不心疼
访问移动优化的资源移动同运营商内网速最快

目标一句话:电信的 IP 走电信,移动的 IP 走移动,各取所长。

为什么需要"源进源出":回包走错线路会怎样

这是双线路由最容易翻车的地方。假设你的电信线路有公网 IP,你在外面通过电信 IP 远程连回家里的 NAS:

  1. 请求从电信线路进来,到达 NAS;
  2. NAS 回包时,路由器查路由表,发现默认路由指向移动线路;
  3. 回包从移动线路出去,源 IP 却写着电信的公网 IP;
  4. 移动运营商的设备一看:源 IP 不是我分配的,直接丢弃(反向路径过滤);
  5. 结果:你这边请求永远等不到回应,连接超时。

这就是"源进源出"要解决的问题:从哪条线路进来的流量,回包必须从同一条线路出去。不只是远程访问,任何"外网主动发起、内网被动响应"的场景都受影响,比如家里的监控摄像头向手机推送画面、BT 做种时的入站连接,本质上都是同一类问题。不解决这个,公网 IP 等于摆设,所有需要从外网主动连回来的服务(远程桌面、建站、监控回传)都会间歇性抽风。

mwan3 实现源进源出的做法

mwan3 天生就是为多线设计的,它用连接标记(conntrack mark)机制保证源进源出,原理分三步:

  1. 进线打标记:数据包从 wan 口进来时,mwan3 的 iptables 规则根据入接口给整个连接打上标记(比如电信线路的连接打标 0x100);
  2. 标记跟随连接:conntrack 会记住这个标记,同一个连接的后续包(包括回包)都带着它;
  3. 回包查标记选路:回包要出去时,策略路由根据标记把它送回当初进来的那条线路,而不是走默认路由。

实际配置中你需要确认两件事。第一,mwan3 的默认规则里保留了处理本地和已标记流量的条目,不要手误删掉 default_rule_v4 这类系统规则。第二,防火墙的 WAN 区域要允许已建立连接的回包(OpenWrt 默认就是允许的,option masq '1' 保持开启)。

验证源进源出是否生效很简单:在外网用手机流量分别访问你的电信公网 IP 和移动公网 IP 对应的服务(比如两个不同的端口映射),都通就说明回包没走错路。如果其中一个通一个不通,先检查对应线路的端口转发规则,再看 mwan3 的接口状态。

运营商 IP 分流:电信 IP 走电信、移动 IP 走移动

源进源出解决的是"回包"问题,主动上网的"出包"则需要策略路由:根据目标 IP 属于哪家运营商,选择对应的线路出去。思路分三步:

  1. 收集 IP 段:把电信、移动各自的公网 IP 段整理成列表(CIDR 格式,如 202.96.0.0/16 这种形式);
  2. 做成 ipset 集合:在路由器上创建 chinanet(电信)、cmcc(移动)两个 ipset 集合,把 IP 段灌进去,匹配效率比一条条写 iptables 规则高得多;
  3. mwan3 规则引用:在 mwan3 里加两条规则——目标 IP 命中 chinanet 集合的走电信策略,命中 cmcc 的走移动策略,剩下的走默认均衡策略。

IP 段不是一成不变的,运营商会新增、调整。所以要加一个定时更新机制:每周用计划任务重新拉取最新的 IP 段数据,重建 ipset 集合。这里不贴具体的下载源(来源经常变动),你只需要在网上找"按运营商整理的中国 IP 段数据"这类公开数据源即可。

一句话提醒:IP 段数据的来源一定要可靠,并且定期更新。用了一份三年没更新的 IP 段表,分流规则会大面积误判,还不如不分。

效果验证:traceroute 看路径

分流配完别急着收工,用 traceroute 实测路径对不对:

# 找一个已知的电信 IP 做目标,看第一跳是不是走电信网关
traceroute 202.96.128.86

# 找一个已知的移动 IP 做目标,看第一跳是不是走移动网关
traceroute 211.136.0.1

判断标准很简单:去电信 IP 的流量,第一跳之后应该出现电信骨干的节点(如 202.97.*.* 这类);去移动 IP 的流量,应该出现移动的节点。如果发现电信目标走了移动线路,说明 ipset 集合里缺了这个 IP 段,或者 mwan3 规则顺序有问题(更具体的规则要放前面)。

也可以在 mwan3 的"状态"页观察实时连接,看目标 IP 和出口线路的对应关系是否符合预期。

配置上线后建议观察一周:每天随手 traceroute 几个常用目标,确认没有"电信目标走移动"之类的漂移。如果发现某类网站持续走错线路,优先怀疑 ipset 数据过期,先手动跑一次更新脚本再看。分流策略是"配置一次、维护长久"的东西,IP 段更新脚本跑得越规律,线路分工就越精准。

动手:ipset 集合与定时更新的操作链条

把上面的思路落成实际操作,链条是这样的(具体命令随 OpenWrt 版本略有差异,思路通用):

# 1. 创建 ipset 集合(hash:net 类型,专门存 IP 段)
ipset create chinanet hash:net
ipset create cmcc hash:net

# 2. 把整理好的 CIDR 段灌进去(以下为格式示例,真实数据请从可靠来源获取)
ipset add chinanet 202.96.0.0/16
ipset add cmcc 211.136.0.0/16

# 3. 写一个更新脚本:从可信数据源拉取最新 IP 段,重建两个集合
# 4. 加入计划任务,每周自动执行一次
0 3 * * 0 /root/update-ipset.sh

mwan3 侧再加两条规则引用这两个集合:

config rule 'to_chinanet'
    option ipset 'chinanet'
    option dest_ip '0.0.0.0/0'
    option use_policy 'wan_telecom_only'

config rule 'to_cmcc'
    option ipset 'cmcc'
    option dest_ip '0.0.0.0/0'
    option use_policy 'wan_mobile_only'

两个细节别漏:一是这两条 ipset 规则要放在默认均衡规则之前,mwan3 按顺序匹配,放后面就永远轮不到它们;二是 ipset 集合重启后会丢失,记得把创建和灌数据的命令写进开机自启脚本,否则每次断电分流就失效一半。

总结

电信 + 移动双线分流记住两件事:源进源出保连通(回包别走错门),运营商 IP 分流保速度(电信 IP 走电信、移动 IP 走移动)。前者靠 mwan3 的连接标记机制,后者靠 ipset + 定时更新的 IP 段数据。配完后用 traceroute 抽查几组目标 IP,路径对了就可以长期稳定运行。另外,公网 IP 的申请、光猫桥接等操作具体以当地运营商政策为准,动手前先跟运营商确认好。