RouterOS 利用PCC与NTH实现多线负载均衡实战:从原理到稳定部署

张开发
2026/4/5 13:40:38 15 分钟阅读

分享文章

RouterOS 利用PCC与NTH实现多线负载均衡实战:从原理到稳定部署
1. 理解PCC与NTH的核心原理搞过多线负载均衡的朋友都知道RouterOS里PCC和NTH这两个算法就像炒菜时的盐和糖——用对了提鲜用错了翻车。先说说PCCPer Connection Classifier它就像个严格的交通警察每个新来的连接都会被分配固定的出口线路。比如你开个网页这个连接从始至终都走WAN1再开个下载新连接就走WAN2。实测下来特别适合需要会话保持的场景比如在线会议或者游戏不会出现前半秒走电信后半秒走联通的尴尬。而NTHNth更像是轮盘赌它不看连接内容只管机械地按顺序分配数据包。第1个包走WAN1第2个走WAN2...循环往复。这种粗暴的方式特别适合P2P下载这类无状态流量能把多条宽带的总带宽榨干。我去年给一个小型工作室部署时他们同时有视频会议和素材同步需求就是靠PCC保会议、NTH拉带宽的组合拳解决的。2. 基础环境搭建实战2.1 物理连接与接口配置先得把硬件接对地方。我遇到过最离谱的案例是客户把五条宽带全插在同一个交换机上还抱怨负载不均衡。正确做法是每条宽带单独接RouterOS的一个物理接口比如ether1到ether5分别对应五条PPPoE线路。这里有个血泪教训一定要先标注清楚线序有次半夜割接时手滑拔错线结果三条宽带混在一起拨号直接触发运营商风控。配置PPPoE客户端时建议勾选Add Default Route和Use Peer DNS但千万要把Remote Address留空。曾经有同行在这里填了运营商的网关地址导致后续路由标记全部失效。拨号成功后记得用/interface pppoe-client monitor [name]检查实际获取的带宽有些劣质光猫会虚标速率。2.2 LAN端基础网络配置ether6作为LAN口IP建议设成192.168.88.1/24这种非主流网段避免和上级网络冲突。DHCP服务要特别注意地址池范围不要包含网关IP我有次手快设成192.168.88.1-192.168.88.254结果把自己踢出了管理界面。更稳妥的做法是保留前20个IP给固定设备/ip pool add namedhcp_pool ranges192.168.88.20-192.168.88.254 /ip dhcp-server network add address192.168.88.0/24 gateway192.168.88.13. 连接标记的艺术3.1 PCC标记策略PCC配置的核心在于per-connection-classifier参数。对于五线负载我推荐这样设置/ip firewall mangle add chainprerouting actionmark-connection \ new-connection-markconn1 passthroughyes per-connection-classifierboth-addresses:5/0 /ip firewall mangle add chainprerouting actionmark-connection \ new-connection-markconn2 passthroughyes per-connection-classifierboth-addresses:5/1这里的both-addresses表示用源IP目的IP作为哈希因子比单纯用源IP更均衡。曾经有个网吧客户因为所有机器走同一个NAT用src-address做分类导致流量全挤在一条线上改成both后立即均匀分布。3.2 NTH标记技巧NTH的周期设置很有讲究对于五线负载every5表示每五个包一个轮回。但要注意和packet-mark配合使用/ip firewall mangle add chainprerouting actionmark-routing \ new-routing-markroute1 passthroughno nth5,1 /ip firewall mangle add chainprerouting actionmark-routing \ new-routing-markroute2 passthroughno nth5,2实测发现在千兆环境下建议加上limit1000000参数避免NTH计数器溢出导致分配不均。这个坑我踩过当时负载波动像过山车加了limit后立马稳定。4. 路由与伪装的关键细节4.1 多线路由表配置每个路由标记都要对应独立的路由表这里最容易犯的错误是忘记设置路由规则优先级/ip route add dst-address0.0.0.0/0 gatewaypppoe-out1 routing-markroute1 distance1 check-gatewayping /ip route add dst-address0.0.0.0/0 gatewaypppoe-out2 routing-markroute2 distance1 check-gatewaypingcheck-gatewayping这个参数救过我多次它能自动检测网关可达性。有次运营商半夜升级三条线路掉线系统自动切到剩余两条客户完全没感知。4.2 智能NAT配置千万别在每条线路上单独做masquerade正确的做法是用地址列表统一管理/ip firewall nat add chainsrcnat actionmasquerade out-interface-listWAN曾经见过有人给五条宽带分别做NAT结果CPU飙到90%。后来发现是NAT会话表项指数级增长改成统一伪装后直接降到15%。5. 稳定性调优实战5.1 连接数均衡方案光有流量均衡不够连接数均衡更重要。建议在mangle规则里加上/ip firewall mangle add chainprerouting actionmark-connection \ new-connection-markconn1 passthroughyes connection-statenew \ per-connection-classifierboth-addresses:5/0重点是这个connection-statenew确保只有新建连接参与分类。去年有个电商客户做促销时ESTABLISHED连接把单条线路撑爆加上这个参数后完美解决。5.2 故障自动切换用脚本监控线路质量才是王道。这个脚本我用了三年每分钟检测一次延迟和丢包:local interface pppoe-out1 :local target 223.5.5.5 :local delayThreshold 100 :local lossThreshold 20 :local pingResult [/ping $target count5 interface$interface] :local avgDelay ($pingResult-avg-rtt) :local packetLoss ($pingResult-packet-loss) :if ($avgDelay $delayThreshold || $packetLoss $lossThreshold) do{ /interface disable $interface /log info message(Disabling . $interface . due to poor performance) }把它设成定时任务任何线路出现异常都会自动隔离等恢复后再重新启用。这个方案比单纯依赖路由检测更灵敏特别适合对稳定性要求高的场景。

更多文章