JUNOS Route-filter最长匹配及“bogon”案例

junos-route-filter_actions
之前已经谈过了JUNOS上route-filter的几种匹配类型,我还特别对于“through”这种匹配类型做了一次详尽的探讨。今天则针对当同一个term里面存在多个route-filter的时候,JUNOS的匹配原则。尽管很多人会将JUNOS的route-filter与IOS的prefix-list联系在一起,然而由于route-filter具有更强的灵活性,很容易让刚开始接触JUNOS的人感到迷惑。

首先你应该了解的是在同一个term底下,当存在多重匹配条件,如community, protocol, tag…的时候,一般而言JUNOS采用的是逻辑与(AND)的匹配标准。即只有当一条路由匹配term里面所定义的全部条件时,JUNOS才认为这条路由与term相匹配,并且执行该term下面的then所定义的行为(action)。然而route-filter是一个例外。对于route-filter的匹配,JUNOS采用的是最长匹配机制,同时一旦找到该路由与term底下的某一个route-filter达成最长匹配,整个匹配流程将结束。也就是说,假如你在term下面定义了多个route-filter,而实际上JUNOS只会将检查的路由与它达成最长匹配的单个route-filter匹配。由于JUNOS允许你直接在route-filter后面定义action,那么这条路由便会直接根据action定义执行。否则,路由下一步同样需要与term下面除route-filter以外的其他条件进行AND匹配,最终确定是否匹配整个term而执行then所定义的action

我们依然使用JUNOS 101拓扑,以及bogon filter作为案例进行分析。通过在R3上设置不同的route-filter组合,观察120.120.69.128/25这条我们预先在R3上定义的静态路由是否能被导出(export)到OSPF,并使得R1接收到。从而来验证JUNOS route-filter的最长匹配行为。

JUNOS Route-filter – IP前缀最长匹配

[edit logical-routers r3 policy-options]
nigel@itaa7.2# show policy-statement bogon term 1
from {
    route-filter 0.0.0.0/0 through 0.0.0.0/7;
    route-filter 0.0.0.0/1 prefix-length-range /1-/7;
    route-filter 172.16.0.0/12 orlonger;
    route-filter 192.168.0.0/16 orlonger;
    route-filter 10.0.0.0/8 orlonger;
    route-filter 0.0.0.0/0 prefix-length-range /25-/32;
}
then reject;

[edit logical-routers r3 policy-options]
nigel@itaa7.2# show policy-statement bogon term 2
then accept;

由于我们的测试网段120.120.68.128/25的第一段Octet(前八位)换算为二进制,则等于01111000,与0.0.0.0/1达成最长匹配,因此JUNOS将直接120.120.68.128/250.0.0.0/1这个route-filter匹配,而不考虑term1内的其它route-filter。

JUNOS Route-filter – 匹配类型

[edit logical-routers r3 policy-options]
nigel@itaa7.2# show policy-statement bogon term 1
from {
    route-filter 0.0.0.0/0 through 0.0.0.0/7;
    route-filter 0.0.0.0/1 prefix-length-range /1-/7;
    route-filter 172.16.0.0/12 orlonger;
    route-filter 192.168.0.0/16 orlonger;
    route-filter 10.0.0.0/8 orlonger;
    route-filter 0.0.0.0/0 prefix-length-range /25-/32;
}
then reject;

[edit logical-routers r3 policy-options]
nigel@itaa7.2# show policy-statement bogon term 2
then accept;

然而,JUNOS除了需要对IP前缀进行匹配以外,达成最长匹配的route-filter,它的匹配类型内的掩码长度也必须与该路由相匹配。这时候,虽然120.120.68.128/25与0/1达成IP前缀的最长匹配,但由于0/1的匹配类型为prefix-length-range /1-/7;与120.120.68.128的25位掩码不符。而JUNOS不会回过头来再重新查找term1内是否还有其他的route-filter能够与该路由匹配,因此JUNOS认为term1与120.120.68.128/25这段路由无法匹配上。将执行下一个term2的匹配,直接将这段路由通告到R1上。

nigel@itaa7.2# run show route logical-router r1 120/8 

inet.0: 11 destinations, 11 routes (11 active, 0 holddown,
0 hidden)
+ = Active Route, - = Last Active, * = Both

120.120.69.128/25  *[OSPF/150] 00:00:30, metric 0, tag 0
                    > to 10.0.4.13 via fxp1.13

JUNOS Route-filter – Policy Terms拆分

我们可以看到,实际上真正与120.120.68.128/25匹配的应该是0/0 prefix-length-range /25-/32这个route-filter,然而由于上述最长匹配的原因,没有被JUNOS在term1内匹配上。此时,我们可以新建一个term1.5,将该route-filter转移到term1.5上。让120.120.68.128/25错过term1的匹配后,在term1.5上被匹配。注意,我们需要使用insert命令调整terms之间的顺序。

[edit logical-routers r3 policy-options policy-statement
bogon]
nigel@itaa7.2# delete term 1 from route-filter 0/0
prefix-length-range /25-/32 

[edit logical-routers r3 policy-options policy-statement
bogon]
nigel@itaa7.2# set term 1.5 from route-filter 0/0
prefix-length-range /25-/32 

[edit logical-routers r3 policy-options policy-statement
bogon]
nigel@itaa7.2# insert term 1.5 before term 2 

[edit logical-routers r3 policy-options]
nigel@itaa7.2# show
policy-statement bogon {
    term 1 {
        from {
            route-filter 0.0.0.0/0 through 0.0.0.0/7;
            route-filter 0.0.0.0/1 prefix-length-range
            /1-/7;
            route-filter 172.16.0.0/12 orlonger;
            route-filter 192.168.0.0/16 orlonger;
            route-filter 10.0.0.0/8 orlonger;
        }
        then reject;
    }
    term 1.5 {
        from {
            route-filter 0.0.0.0/0 prefix-length-range
            /25-/32;
        }
        then reject;
    }
    term 2 {
        then accept;
    }
}

重新查看R1上的路由表,120.120.68.128/25被拒绝从R1的路由表导出至OSPF。

nigel@itaa7.2> show route logical-router r1 120/8 | count
Count: 0 lines

One thought on “JUNOS Route-filter最长匹配及“bogon”案例

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s