MikroTik PCC(Per Connection Classifier)是一种多线路负载均衡技术,它的核心逻辑是把每个网络连接(比如一个下载任务或一次网页访问)通过哈希算法分配到不同的宽带线路上,而不是把一个连接拆开分到多条线。这意味着 PCC 无法让单个下载任务速度翻倍(1+1≠2),但能让不同的任务分别跑在不同的线路上,互不抢网速,实现带宽叠加利用和线路冗余备份(1+1=1+1)。
1. PCC 工作原理简介PCC 从 IP 包头中选取指定字段(如 src-address、dst-address、src-port、dst-port),通过哈希算法生成一个 32 位值。将这个值除以你设定的 分母(Denominator),得到的余数(Remainder) 决定该数据包属于哪一条线路 。 关键参数: Denominator:线路总数(例如 2 条线,分母就是 2)。 Remainder:线路编号(从 0 开始,例如第一条线为 0,第二条线为 1)。 ValuesToHash:分类依据。建议家庭用户使用 both-addresses(源+目标地址),可保证访问某个特定网站(如网银)始终走同一条线路,避免 IP 地址频繁跳动导致掉线 。
2. 适用场景与前提条件适用场景:拥有两条或以上不同运营商(或同一运营商的多条线路)的宽带接入。 不适用场景:Hotspot(热点认证) 环境无法使用 PCC,因为 Hotspot 强制使用默认路由表 。 硬件要求:确保路由器 CPU 性能足够,PCC 规则较多时会占用一定的 CPU 资源。
3. 配置案例:双线 PCC 负载均衡假设你有两条 ISP 线路,配置如下: WAN1 (ISP1):接口 ether1,网关 10.10.4.1,IP 10.10.4.100/24 WAN2 (ISP2):接口 ether2,网关 10.10.5.1,IP 10.10.5.100/24 LAN:接口 ether3,网段 192.168.100.1/24
第一步:基础 IP 与路由表配置首先配置接口 IP,并创建两条新的路由表(Routing Table),用于策略路由。 - # 设置 IP 地址
- /ip address
- add address=10.10.4.100/24 interface=ether1 network=10.10.4.0
- add address=10.10.5.100/24 interface=ether2 network=10.10.5.0
- add address=192.168.100.1/24 interface=ether3 network=192.168.100.0
- # 创建路由表
- /routing table
- add disabled=no fib name=ISP1_table
- add disabled=no fib name=ISP2_table
复制代码 第二步:防火墙标记(Mangle)—— PCC 核心这是最关键的步骤。我们需要在 mangle 表中标记连接,再将连接标记应用到路由。 2.1 处理外部访问(可选)如果允许外网主动访问你的路由器(如端口映射),需要标记入站连接,确保回包走原路 。 - /ip firewall mangle
- # 标记从 WAN1 进入的新连接
- add action=mark-connection chain=input connection-state=new in-interface=ether1 new-connection-mark=ISP1_conn
- # 标记从 WAN2 进入的新连接
- add action=mark-connection chain=input connection-state=new in-interface=ether2 new-connection-mark=ISP2_conn
复制代码 2.2 标记局域网出站连接(核心 PCC)这里使用 per-connection-classifier 将 LAN 口发出的流量均匀分配到两条线路上。 - /ip firewall mangle
- # 使用 both-addresses 分类器,分母为 2,余数 0 分配给 ISP1
- add action=mark-connection chain=prerouting connection-mark=no-mark connection-state=new \
- dst-address-type=!local in-interface=ether3 new-connection-mark=ISP1_conn \
- per-connection-classifier=both-addresses:2/0
- # 余数 1 分配给 ISP2
- add action=mark-connection chain=prerouting connection-mark=no-mark connection-state=new \
- dst-address-type=!local in-interface=ether3 new-connection-mark=ISP2_conn \
- per-connection-classifier=both-addresses:2/1
复制代码 2.3 标记路由将刚才标记的连接,映射到具体的路由表。 - /ip firewall mangle
- # 标记路由到 ISP1_table
- add action=mark-routing chain=prerouting connection-mark=ISP1_conn in-interface=ether3 new-routing-mark=ISP1_table
- add action=mark-routing chain=output connection-mark=ISP1_conn new-routing-mark=ISP1_table
- # 标记路由到 ISP2_table
- add action=mark-routing chain=prerouting connection-mark=ISP2_conn in-interface=ether3 new-routing-mark=ISP2_table
- add action=mark-routing chain=output connection-mark=ISP2_conn new-routing-mark=ISP2_table
复制代码 第三步:路由配置配置两条默认路由,分别指向 ISP1_table 和 ISP2_table,并添加主路由表作为备份(实现故障转移)。 - /ip route
- # 策略路由:带有 ISP1_table 标记的流量走 WAN1 网关
- add check-gateway=ping dst-address=0.0.0.0/0 gateway=10.10.4.1 routing-table=ISP1_table
- # 策略路由:带有 ISP2_table 标记的流量走 WAN2 网关
- add check-gateway=ping dst-address=0.0.0.0/0 gateway=10.10.5.1 routing-table=ISP2_table
- # 主路由表(默认):设置距离(Distance)实现故障转移
- add distance=1 dst-address=0.0.0.0/0 gateway=10.10.4.1
- add distance=2 dst-address=0.0.0.0/0 gateway=10.10.5.1
复制代码 第四步:NAT 伪装最后,配置源地址转换,让内网设备上网。 - /ip firewall nat
- add action=masquerade chain=srcnat out-interface=ether1
- add action=masquerade chain=srcnat out-interface=ether2
复制代码 4. 特殊场景处理:端口映射如果你需要从外网访问内网的服务器(如 NAS),需要注意 PCC 可能会导致回包走错线路。 解决方法:需要单独标记来自外网的连接,并确保回包走原路 。 假设你要映射内网 192.168.100.100 的 5001 端口: - /ip firewall nat
- # 目标地址转换(DNAT)
- add chain=dstnat dst-address=10.10.4.100 protocol=tcp dst-port=5001 action=dst-nat to-addresses=192.168.100.100 to-ports=5001
- add chain=dstnat dst-address=10.10.5.100 protocol=tcp dst-port=5001 action=dst-nat to-addresses=192.168.100.100 to-ports=5001
- /ip firewall mangle
- # 提前标记进入的流量,防止 PCC 规则干扰
- add chain=prerouting in-interface=ether1 dst-address=192.168.100.100 protocol=tcp dst-port=5001 action=mark-connection new-connection-mark=ISP1_conn passthrough=yes
- add chain=prerouting in-interface=ether2 dst-address=192.168.100.100 protocol=tcp dst-port=5001 action=mark-connection new-connection-mark=ISP2_conn passthrough=yes
复制代码 5. 进阶技巧与故障排查调整负载比重:如果两条线路带宽不同(如 100M 和 500M),可以通过修改 PCC 规则的数量来调整比例。例如,如果你希望 500M 线路承担 5 倍于 100M 的流量,可以将分母设为 6,让 500M 线路占用 5 个 Remainder,100M 线路占用 1 个 Remainder。 不要忘记排除本地流量:在 PCC 规则中务必加上 dst-address-type=!local,否则访问路由器本身的流量(如 WinBox)也会被负载均衡,导致断连 。 验证配置:
6. 常见误区通过以上步骤,你可以在 MikroTik 路由器上实现高效、稳定的 PCC 负载均衡,既能享受叠加带宽,又能保障关键应用不断线。
|