Posts Tagged nth

小论nth和passthrough

Posted by on 星期三, 5 5月, 2010

这是官方给的2种标记连接的方法,仔细看这段:

If passthrough is not set then packets will be marked as follows:
first rule nth=2,1 rule will match every first packet of 2, hence, 50% of all the traffic that is matched by the rules second rule if passthrough =no will match ONLY 25% of traffic because in 3.0 you need only one rule to catch traffic not like 2.9

首先,mangle链表为空, passthrough 不设置,即为 passthrough =yes,数据将按如下规则匹配:
第一条规则,nth=2,1,也就是说匹配50%的经过数据,
第二条规则,如果上一条的 passthrough =no,哪么这条规则将只匹配25%的数据包,这是3.0和2.9的不同之处。
为什么呢,举个例子。
现有如下数据流:ABCDEFGHIJKLMNOPQRSTUVWXYZ,序号1~26。
那么根据第一个规则(nth=2,1),数据流将分段进入规则一(或说被规则一看到),AB,CD,EF,GH……,规则一会匹配这段数据流的50%,就是A,C,E,G……;然后检查 passthrough =yes/no,当yes时,向下匹配的数据依然是完整的队列ABCDEFGH……;当no时,数据则变成了BDFH……

现在回头看看例子,还以“A~Z”这个数据流为例:

first rule sees all packets and matches 1/3 of all, second rule sees 2/3 of packets and matches 1/2, third rule sees and matches all packets that passed through first two rules ( 1/3 of all packets ).

    第一条规则将看到所有数据包并匹配1/3,看到的数据流应该是这种分段:ABC,DEF,GHI,JKL……,这条规则负责匹配A,D,G,J; passthrough =no,剩下的部分不予匹配,哪么剩下的部分应该是BCEFHIKL……
    第二条,注意every改变了,every=2,就时说每间隔2个检查一次(即剩下2/3中的1/2,也就是整个数据流的1/3),分段变成BC,EF,HI,KL……, passthrough 依然=no,剩下的数据为CFIL……
    第三条,没什么说的了,无条件匹配……

/ip firewall mangle
add action=mark-packet chain=prerouting new-packet-mark=AAA nth=3,1 passthrough =no;
add action=mark-packet chain=prerouting new-packet-mark=BBB nth=2,1 passthrough =no;
add action=mark-packet chain=prerouting new-packet-mark=CCC ;

    下面看这种情况 passthrough =yes:
    依然是数据流“A~Z”
    第一句将看见如下分段的数据ABC,DEF,GHI,JKL……,并匹配(nth=3,1),A,D,G,J……,因为 passthrough =yes,数据将继续向下匹配,数据仍然为完整的ABCDEFGHIJKL……
    第二条规则,将看到同上一条的数据ABC,DEF,GHI,JKL……,并匹配其中的(nth=3,2)B,E,H,K……,结果同上
    第三条规则,依然看到ABC,DEF,GHI,JKL……,并匹配(nth=3,3)C,F,I,L……

/ip firewall mangle
add action=mark-packet chain=prerouting new-packet-mark=AAA nth=3,1 passthrough =yes;
add action=mark-packet chain=prerouting new-packet-mark=BBB nth=3,2 passthrough =yes;
add action=mark-packet chain=prerouting new-packet-mark=CCC nth=3,3 passthrough =yes;

下面把上面的例子反过来看看,即把 passthrough =yes/no对换,看看结果如何。

/ip firewall mangle
add action=mark-packet chain=prerouting new-packet-mark=AAA nth=3,1 passthrough =yes;
add action=mark-packet chain=prerouting new-packet-mark=BBB nth=2,1 passthrough =yes;
add action=mark-packet chain=prerouting new-packet-mark=CCC ;

第一条规则依然可以看到全部数据流,根据every=3,分成如下段:ABC,DEF,GHI,JKL……
那么第一条规则将匹配出A,D,G,J……然后 passthrough =yes,全部数据继续向下匹配;
第二条规则还是看到如规则一的全部数据,根据every=2,分成如下段:AB,CD,EF,GH,JK,LM……,根据规则将匹配,A,C,E,G,J,L……,根据 passthrough =yes,全部数据继续向下匹配;
第三条,无条件匹配全部数据……
可见,完全背离本意。

/ip firewall mangle
add action=mark-packet chain=prerouting new-packet-mark=AAA nth=3,1 passthrough =no;
add action=mark-packet chain=prerouting new-packet-mark=BBB nth=3,2 passthrough =no;
add action=mark-packet chain=prerouting new-packet-mark=CCC nth=3,3 passthrough =no;

复制代码 第一条,会看见全部数据,根据every=3进行分段,ABC,DEF,GHI,JKL……然后匹配(nth=3,1)A,D,G,J……根据 passthrough =no,已经匹配的数据不再向下匹配;
第二条,会看见除第一条匹配以外的数据,根据every=3再分段,BCE,FHI,KLN……然后匹配(nth=3,2)C,H,L……,结果同上;
第三条,会看见除已经匹配上一条的数据,根据every=3再分段,结果同上。
这样会丢失很多数据……

至于接口带宽不相等的问题,我能想到的就是用random做,让带宽大的获得更高的random, passthrough =no,然后一定要在最后放上一条random=100%的兜底,呵呵。
如果执意要用nth,也不是不可能,例如线路A带宽=100M,线路B带宽=50M

/ip firewall mangle
add action=mark-packet chain=prerouting new-packet-mark=线路A nth=3,1 passthrough =yes;
add action=mark-packet chain=prerouting new-packet-mark=线路A nth=3,2 passthrough =yes;
add action=mark-packet chain=prerouting new-packet-mark=线路B nth=3,3 passthrough =yes;

这样就会有2/3的数据走线路A,1/3的数据走线路B。