带宽不够用、一条线挂了全网瘫痪、关键业务和下载流量抢带宽——这是很多工作室和企业网络都会撞上的三件事。ROS(RouterOS)软路由最大的价值之一,就是把多条宽带线路"拧成一股绳":多出口负载均衡负责把流量合理分摊到各条线路,策略路由负责让指定业务走指定出口,故障切换则保证任何一条线路出问题时,业务几乎无感地切到备用线路。这篇文章把这三件事一次讲透。
为什么要做多出口:单线路的三个硬伤
只拉一条宽带的网络,问题会随着业务增长集中爆发:
一是带宽天花板。上行带宽被运营商限制,一旦多台设备同时上传、直播推流或跑采集任务,整条线路立刻拥堵;二是单点故障。线路施工挖断、光猫故障、运营商侧异常,任何一个环节出问题,整个网络就断网;三是流量不分级。办公、收银、下载、采集全部挤在同一条线上,关键业务没有任何优先保障。
多出口方案正好逐条化解:多条线路聚合后总吞吐翻倍;任何一条线路故障,其余线路自动接管;不同业务可以按规则走不同出口,互不干扰;后续扩容只需加一条宽带,改几行配置即可。
先搞懂四种分流模式:PCC、Nth、ECMP与策略路由
很多人一上来就照抄网上的负载均衡脚本,结果越跑越乱。其实ROS下常见的分流方式就四种,原理和适用场景差别很大:
PCC(按连接分类器)是目前最主流的方案。它对每一条新建连接做"源地址+目标地址"哈希运算,把不同连接稳定地分配到不同出口。同一条连接从头到尾锁定一个出口,会话不会被打散,带宽利用率也高。
Nth是按"第N个连接"轮询分发,配置简单,但它按计数器切分,对连接的"归属感"较弱,适合下载、采集这类不关心会话连续性的流量。
ECMP(等价多路径)是内核级的等价分流,多条网关写成一条路由即可,配置最省事,但对会话保持的控制力不如PCC,线路不等速时也不够灵活。
策略路由则不是"均分"而是"指定"——按源地址、目标地址、端口等规则,把特定流量钉死在某条线路上,是业务分发的核心手段。
| 模式 | 分流依据 | 会话稳定性 | 配置难度 | 典型场景 |
|---|---|---|---|---|
| PCC | 源地址+目标地址哈希 | 高,整条连接锁定同一出口 | 中等 | 多线带宽叠加 |
| Nth | 按第N个连接轮询 | 一般 | 低 | 下载、采集类无状态流量 |
| ECMP | 内核等价多路径 | 一般 | 低 | 网关等价的多线环境 |
| 策略路由 | 自定义规则匹配 | 高 | 中等 | 业务分流、指定出口 |
实践中的黄金组合是:PCC做底层的带宽均衡,策略路由做上层的业务调度,两者配合而不是二选一。
策略路由实战:从连接标记到出口NAT
多出口分流的标准链路是四步:标记连接 → 派生路由标记 → 建立独立路由表 → 出口NAT。下面以两条线路(电信网关192.168.1.1、联通网关10.10.0.1)为例,给出可直接套用的PCC基础配置:
# RouterOS v7 需先创建路由表(v6可跳过)
/routing table
add name=to_isp1 fib
add name=to_isp2 fib
# 第1步:把新建连接按哈希均分到两条线路
/ip firewall mangle
add chain=prerouting in-interface=bridge-lan connection-state=new \
per-connection-classifier=both-addresses-and-ports:2/0 \
action=mark-connection new-connection-mark=isp1_conn passthrough=yes
add chain=prerouting in-interface=bridge-lan connection-state=new \
per-connection-classifier=both-addresses-and-ports:2/1 \
action=mark-connection new-connection-mark=isp2_conn passthrough=yes
# 第2步:由连接标记派生路由标记
add chain=prerouting in-interface=bridge-lan connection-mark=isp1_conn \
action=mark-routing new-routing-mark=to_isp1 passthrough=no
add chain=prerouting in-interface=bridge-lan connection-mark=isp2_conn \
action=mark-routing new-routing-mark=to_isp2 passthrough=no
# 第3步:每个路由标记对应独立默认路由
/ip route
add dst-address=0.0.0.0/0 gateway=192.168.1.1 routing-mark=to_isp1
add dst-address=0.0.0.0/0 gateway=10.10.0.1 routing-mark=to_isp2
# 第4步:每条出口各自做地址伪装
/ip firewall nat
add chain=srcnat out-interface=ether1-wan action=masquerade
add chain=srcnat out-interface=ether2-wan action=masquerade
在均衡的基础上做业务分流很简单——用源地址把指定网段钉在指定线路上,规则要放在PCC规则之前才能优先生效:
# 财务办公网段(192.168.20.0/24)强制走联通线路
/ip firewall mangle
add chain=prerouting src-address=192.168.20.0/24 connection-state=new \
action=mark-connection new-connection-mark=isp2_conn passthrough=yes
add chain=prerouting src-address=192.168.20.0/24 connection-mark=isp2_conn \
action=mark-routing new-routing-mark=to_isp2 passthrough=no
这样,收银、办公等对稳定性敏感的业务走固定线路,下载、采集等大流量业务由PCC自动摊到两条线上,互不拖累。
故障切换:线路挂了,业务不能挂
负载均衡解决"分得匀",故障切换解决"挂得起"。最基础的方案是主备路由 + check-gateway:distance决定优先级,探测失败自动切到下一条。
/ip route
add dst-address=0.0.0.0/0 gateway=192.168.1.1 distance=1 \
check-gateway=ping comment="主线路-电信"
add dst-address=0.0.0.0/0 gateway=10.10.0.1 distance=2 \
check-gateway=ping comment="备线路-联通"
但这个方案有个隐患:check-gateway默认只ping运营商网关,网关活着不代表公网通——光猫到机房之间断了,探测照样"假在线"。更可靠的做法是递归路由探测:让默认路由去探测一个公共DNS地址,探测的是真正的公网连通性。
/ip route
# 把两个公共DNS分别锚定到两条线路
add dst-address=223.5.5.5/32 gateway=192.168.1.1 scope=10
add dst-address=114.114.114.114/32 gateway=10.10.0.1 scope=10
# 默认路由递归指向DNS,探测公网真实连通性
add dst-address=0.0.0.0/0 gateway=223.5.5.5 distance=1 \
target-scope=11 check-gateway=ping comment="主线递归探测"
add dst-address=0.0.0.0/0 gateway=114.114.114.114 distance=2 \
target-scope=11 check-gateway=ping comment="备线递归探测"
整条切换链路是全自动的:定时探测 → 连续丢包判定故障 → 备用线路秒级接管 → 主线恢复后自动回切。全程无需人工干预,切换过程对绝大多数业务无感。
多出口最容易踩的三个坑
坑一:会话被打散。PCC规则务必只对connection-state=new的新建连接打标,已建立的连接沿用原标记。如果对所有连接重复打标,一条TCP连接的包会走不同出口,表现就是网页打不开、登录频繁掉线。
坑二:回程路由不对称。多线环境下,从哪条线进来的请求,回包也必须从哪条线出去,否则运营商会丢弃"来路不明"的包。给每条线路配独立的routing-mark和对应NAT即可解决;如果还有端口映射对外的服务,记得按入接口补连接标记。
坑三:探测目标选错。只探测运营商网关会出现前文说的"假在线"。用递归路由去探测公共DNS(如223.5.5.5、114.114.114.114),测的才是真连通性,切换才果断。
进阶玩法:多出口叠加代理IP,做IP级调度
要分清两个层次:ROS的多出口是线路级调度——你的出口就是这几条宽带的公网IP,数量有限,也不会轮换。但数据采集、批量任务执行、多账号运营这类业务,需要的是IP级调度:单IP高频访问容易被目标网站限制,多任务并行需要不同IP,任务粒度越细越要灵活换IP。
标准做法是在ROS策略路由之上再叠一层代理调度:用策略路由把采集服务器或指定业务的流量指向代理出口,业务侧通过API动态提取IP、按任务轮换。国内业务选型上,天启HTTP是国内IP代理服务商,自建机房,覆盖国内多个城市节点,支持HTTP/HTTPS/SOCKS5三种协议,IP可用率高、响应延迟低,API提取方式也方便和自动化脚本、ROS计划任务配合做定时轮换。需要注意,天启HTTP只提供国内IP资源,如果你的业务需要海外出口,它并不适用。
这样整套架构就形成了清晰的三层:ROS负责线路级的均衡与容灾,策略路由负责业务级的分发,代理IP负责任务级的轮换——每一层各司其职,网络既快又稳还够灵活。
常见问题
Q: 做了PCC负载均衡后,网银、后台登录频繁掉线怎么办?
这通常是同一连接被分到了不同出口导致的。检查mangle规则是否只对connection-state=new的连接打标、回程NAT是否按线路配齐。若个别业务仍异常,用策略路由把该业务网段固定到单一线路即可。
Q: 两条带宽不一样的线路,怎么按比例分流?
把PCC的分母调大。比如300M和100M按3:1分流,用both-addresses-and-ports:4/0、4/1、4/2三组指向主线,4/3一组指向副线,共四条标记规则。
Q: check-gateway显示网关在线,但外网其实不通,怎么解决?
只ping运营商网关会"假在线"。改用递归路由探测公共DNS(如223.5.5.5),探测的是真实公网连通性,配置见上文故障切换部分。
Q: ROS多出口负载均衡能替代代理IP吗?
不能。ROS解决的是线路级分流,出口IP就是几条宽带的公网IP,数量有限且不会轮换。采集、批量任务等需要大量IP轮换的场景,应接入代理IP服务;国内业务可使用天启HTTP,通过API按任务粒度提取和轮换IP。
Q: 故障切换大概需要多久?
check-gateway默认每10秒探测一次,连续两次失败判定下线,最慢约20秒完成切换;配合递归探测和合理的超时参数,可以进一步压缩感知时间,切换对绝大多数业务无感。






