TL-R5005PE-AC 双 WAN 负载均衡踩坑
笔者最近给一台 TP-LINK TL-R5005PE-AC 企业路由器接入了两台蜂窝 CPE。上游分别是电信和联通的流量卡,每张卡每月均有 2TB 流量。两台 CPE 各用一根网线接入主路由的两个 WAN 口,链路测速基本一致。原本以为开启双 WAN 负载均衡后,两张卡就能一起分担流量,结果却是电信卡已接近耗尽,联通卡才用了约 20%。
为了解决这个问题,笔者先研究了官方固件中的选路逻辑,又在局域网机器上持续采集主路由的流量计数。期间一度得出了一个非常离谱的结论:即使取消了运营商绑定,甚至交换两条线路,统计出来的流量仍然严重偏向 WAN1,最高甚至接近 98:2。看起来无论怎么调整,路由器都更偏好字面意义上的「WAN1」。
但在进一步分析内核和硬件转发计数后,笔者发现这个结论的依据本身就存在问题:两个 WAN 在 Linux 系统中的接口统计根本不是同一种口径,WAN2 的大量硬件加速(HNAT)流量压根没有被统计进去。改用底层物理端口计数,并同时记录硬件与软件两条转发路径后,使用连接均衡设置,两条线路的累计流量终于接近各占一半。
这次排查遇到了两个叠加的坑:一是手动指定运营商导致 ISP 选路规则提前截流了一部分连接,二是硬件加速机制导致上层监控拿到了错误的流量比例。本文将记录完整排查过程,以及固件中几个容易被 UI 界面掩盖的实现细节。
两张 2TB 流量卡,为什么只用完一张?
本次的网络拓扑非常简单:
flowchart LR
A["电信流量卡 + CPE"] --> C["TL-R5005PE-AC<br/>双WAN负载均衡"]
B["联通流量卡 + CPE"] --> C
C --> D["局域网设备"]两个上游均为蜂窝网络,网速也基本一致。刚开始,笔者在路由器界面上启用了负载均衡,并按照实际线路给两个 WAN 口分别指定了运营商(WAN1 指定电信,WAN2 指定联通)。然而,流量卡后台显示的实际套餐消耗却大相径庭:一张 2TB 套餐已然耗尽,另一张才消耗了约五分之一。这个真实的套餐余量差异促使笔者展开排查。
从固件实现看「负载均衡」的真实逻辑
本文分析的设备为 TL-R5005PE-AC V1.0,固件版本为 1.0.1 Build 241108 Rel.60855n。解包根文件系统(rootfs)后,可以找到几套职责分明的程序:
| 文件或模块 | 主要用途 |
|---|---|
/usr/sbin/isp_route | 按目标 IP 匹配运营商地址库并选择出口 |
/usr/sbin/load_balance | 根据接口实时负载选择较空闲线路(即带宽均衡) |
/usr/sbin/default_balance、ipt_balance.ko | 对新选择请求进行轮询分配(即连接均衡) |
special_route 相关模块 | 保存和查询地址对绑定,复用已有的出口选择 |
/etc/init.d/hnat 及 Realtek FC 代码 | 负责软件 / 硬件加速及其计量统计 |
其中不少控制逻辑直接写在 Shell 脚本里,但连接选择器和地址绑定的关键核心位于内核模块。为了核实细节,笔者提取了固件内核,随后对相关函数进行了分析。
分析表明,界面上的「负载均衡」并非一个统一处理所有连接的总开关。一个典型的 IPv4 报文进入路由后,会依次经过以下层级:1
2
3
4
5
6
7策略选路
↓
特殊应用选路及已有地址对绑定
↓
ISP运营商选路
↓
带宽均衡 / 连接均衡
连接跟踪(conntrack)中的 connmark 负责保存已经选择好的出口。后端的均衡器在恢复标记时,一旦发现标记非零,就会直接返回已有出口,不会再将该连接重新分配。因此,在分析「负载均衡为什么不均」之前,首先需要确认是否有更早的规则提前把出口强行选走了。
第一个坑:填写运营商,意外触发了前置选路规则
最早的时候,WAN1 被指定为电信,WAN2 被指定为联通,导致 ISP 选路(ISP Route)处于开启状态:1
2WAN1: isp_name=dianxin, priority=user
WAN2: isp_name=liantong, priority=user
此时 isp_route 模块生成的匹配条件基于目标 IP 地址:1
2-m set --match-set ISP_CHINA_TELECOM dst
-m set --match-set ISP_UNICOM_CNC dst
这意味着,当一条连接尚未被更早的策略或绑定决定出口时,只要访问的目标 IP 落在电信地址库内,就会优先强制走电信线路;目标 IP 落在联通地址库内,则强制走联通线路。匹配成功后生成的 connmark 会被锁定,导致后续的普通负载均衡模块根本无法介入。
这一设计的初衷是为了减少跨网访问、降低延迟,但也会导致双 WAN 的流量不平衡。结合固件逻辑,如果终端实际访问的目标服务器大多落在电信地址库中,或者承载大流量的业务(如视频下载等)刚好匹配了电信 IP,这部分流量就会被提前锁定到电信线路,连接均衡器完全没有介入的机会。流量严重偏向电信也有了合理解释。
取消手动运营商指定后,再次检查发现两个 WAN 的状态均变更为 auto_check / non_set,isp_route 链清空且不再被入口规则引用。对于纯流量卡叠加的使用场景,彻底禁用 ISP 运营商选路是实现流量均衡的前提。


