Nth是RouterOS曾经路由负载均衡的一个重要的工具,可以实现基于多线的负载均衡,还能实现对端口负载均衡和nat的有序指定访问,是RouterOS v4.0之前解决路由路由负载均衡的一个方式,但存在一些问题,待PCC出现后才完美解决多线负载均衡问题。

Nth原理介绍

在v3.0后Nth功能做了一点修改,仅只有两个参数“every”和“packet”。每个规则都有自己的计数器。当规则收到数据报,当前规则的计数器会增加1,如果计数器匹配值“every”与数据报匹配,计数器将重新设置为0。 使用Nth我们可以将一串连接通过计数器分离,比如可以将连接分配为多个组,重新排列连接序列。

nth –匹配特定的第N次收到的数据报的规则。一个计数器最多可以计数16个数据报

Every – 匹配每every数据报,同时指定Counter计数器值)

Packet – 匹配给定的数据数,例如,Nth=3,1,匹配3个数据报的第1个

上图,可以看到数据流从1-n的数据,被Nth分为3个计数器,并根据Packet重新排列数据流的队列。Nth我们可以应用的范围,包括多线路的负载均衡、内网多台ftp访问、以及其他的应用,Nth最致命的问题是:将数据包按照顺序和定义,建立一个数组形式的容器,按照数组序列来分发数据包,没有采用常见的哈希算法,而导致相同类型的数据包无法走同一条线路。

Passthrough对Nth的控制

实现相同的Nth结果时,改变Passthrough参数(Passthrough为是否将该规则数据继续向下传递,no为停止向下传递,yes则相反,具体参考Mangle章节)会得到不同的规则配置,首先要知道Mangle标记捕获数据是先进先出算法,即从上往下执行,我们在配置Mangle的Nth规则,需要注意前后顺序。如我们把数据流标记为两个组,即一条为1/2,另一条也为1/2,把一个数据流看成“1”,而我们把可以通过两种方法配置:

当我们需要将数据流标记为3组时,即每条规则为1/3。配置方法同样有两种,如下图

如从上面的图上看到,使用和不使用Passthrough的区别,在于流量是否继续向下传递。

例如,有双线接入,并采用Nth的双线负载均衡。首先我们需要在mangle里标记连接,如果配置Passthrough=no参数,Nth参数配置仅需要一条规则,即标记置50%流量,首先我们需要标记连接:

/ip firewall mangle

add chain=prerouting new-connection-mark=AAA nth=2,1 action=mark-connection passthrough=no;

抓取完前50%的数据后,剩下的流量只需要做一个默认的标记剩下的数据即可。

add chain=prerouting new-connection-mark=BBB action=mark-connection

当变成3条线路时,第一条规则标记所有数据报并对比所有流量的1/3,第二条规则标记剩下2/3数据报的50%,第三条规则标记和对比所有剩下的数据报(所有数据报的1/3)

/ip firewall mangle

add action=mark-connection chain=prerouting new-connection-mark=AAA nth=3,1 passthrough=no;

add action=mark-connection chain=prerouting new-connection-mark=BBB nth=2,1 passthrough=no;

add action=mark-connection chain=prerouting new-connection-mark=CCC ;

同样我们有的数据报并且每个规则对比每3个数据报。

/ip firewall mangle

add action=mark-connection chain=prerouting new-connection-mark=AAA nth=3,1 passthrough=yes;

add action=mark-connection chain=prerouting new-connection-mark=BBB nth=3,2 passthrough=yes;

add action=mark-connection chain=prerouting new-connection-mark=CCC nth=3,3 passthrough=yes;