在开始阅读本章之前,你应该已经非常熟悉JUNOS软件中路由策略(routing policy)的功用并且能够运用它。你也应当理解一个多条件策略(multiterm policy)是如何使用匹配标准和动作来执行它的功能。最后,我们也假定你已经掌握了路由过滤器(router filter)和与之相关的匹配类型的相关知识。
在本章,我们要探索如何在JUNOS软件中运用路由策略。我们首先要考察改变一条策略处理过程的方法,包括策略链,子程序和表达式。之后我们还要讨论利用BGP团体值和AS路径信息来使用路由策略定位路由。本章之中贯穿着如何建立和运用路由策略的例子。我们还会考察一些在应用你的路由策略之前使用test policy命令来校验它们的方法。
路由策略处理过程
JUNOS软件中策略语言的一个优点(或者一个缺点,取决于你的观点)就是它的巨大灵活性。总的来说,你通常有四到五种方法来实现同一个目的。一个具有多个条件的单个策略是一种常见的构建高级策略的方法。此外,JUNOS软件允许你使用策略链、子程序、前缀列表或者策略表达式来实现同一目的。这其中的每种方法在实现方面都是独特的,从不同角度来解决问题。让我们来对它们逐个详细考察。
策略链
我们在JNCIA Study Guide中第一次引入了策略链的概念。它虽然听起来很正式,但一个策略链仅仅就是很简单的在配置的某个特定位置应用多个策略而已。在Merlot路由器上可以看到下面这个策略链:
[edit protocols bgp]
user@Merlot#show
group Internal-Peers {
type internal;
local-address 192.168.1.1;
export [ adv-statics adv-large-aggregates adv-small-aggregates ];
neighbor 192.168.2.2;
neighbor 192.168.3.3;
}
除了缺省的BGP策略,“adv-statics”、“adv-large-aggregates”和“adv-small-aggregates”这三个附加的策略组成了应用于Merlot的BGP peer的策略链。当我们查看当前应用的策略时,我们发现它们还是相当简单的:
[edit policy-options]
user@Merlot#show
policy-statement adv-statics {
term statics {
from protocol static;
then accept;
}
}
policy-statement adv-large-aggregates {
term between-16-and-18 {
from {
protocol aggregate;
route-filter 192.168.0.0/16 upto /18;
}
then accept;
}
}
policy-statement adv-small-aggregates {
term between-19-and-24 {
from {
protocol aggregate;
route-filter 192.168.0.0/16 prefix-length-range /19-/24;
}
then accept;
}
}
你可能马上就会想到一招:仅仅把这个策略链转换为单独的一个多参数策略来应用在IBGP peer来达到同样效果。这肯定是正确的。但是你就丢掉了使用策略链的一个好处:为了达到不同目的来复用策略的能力。
图1.1显示了路由器Merlot和它的IBGP peer Muscat和Chablis。此外还与在AS65010中的路由器Cabernet和在AS65030中的路由器Zinfandel建立了EBGP邻接关系。当前在AS65020中的管理策略是仅发送静态路由给其他的IBGP邻居。任何提供穿透服务的EBGP邻居都只接受掩码长度小于18位的汇聚路由。任何提供邻接服务的EBGP邻居都要接受所有的客户路由以及所有掩码长度大于19位的汇聚路由。这些管理策略的每一个单独部分都用单独的路由策略在[edit policy-option]配置层次来编写。然后它们就可以为AS 65020的管理员提供一种对邻居广播路由的多样化的配置方式
注:Cabernet为AS 65020提供穿透服务,这允许它以最大化的形式广播分配给它们的路由空间到Internet。另一方面,Zinfandel提供的邻接服务允许AS 65020直接在AS之间为所有客户路由进行路由转发。
首先配置调通与Cabernet和Zinfandel质检的EBGP邻接会话:
[edit]
user@Merlot#show protocols bgp
group Internal-Peers {
type internal;
local-address 192.168.1.1;
export [ adv-statics adv-large-aggregates adv-small-aggregates ];
neighbor 192.168.2.2;
neighbor 192.168.3.3;
}
group Ext-AS65010 {
type external;
peer-as 65010;
neighbor 10.100.10.2;
}
group Ext-AS65030 {
type external;
peer-as 65030;
neighbor 10.100.30.2;
}
[edit]
user@Merlot#run show bgp summary
Groups: 3 Peers: 4 Down peers: 0
Table Tot Paths Act Paths Suppressed History Damp State Pending
inet.0 12 10 0 0 0 0
Peer AS InPkt OutPkt OutQ Flaps Last Up/Dwn State
192.168.2.2 65020 170 172 0 0 1:22:50 5/6/0
192.168.3.3 65020 167 170 0 0 1:21:39 5/6/0
10.100.10.2 65010 30 32 0 0 12:57 0/0/0
10.100.30.2 65030 55 57 0 0 24:49 0/0/0
策略“adv-large-aggregates”被应用在了Cabernet上,用来广播子网掩码在16位和18位之间的路由。在commit这个配置之后,我们来检查被发送到AS 65010的路由:
[edit protovols bgp]
user@Merlot#set group Ext-AS65010 export adv-large-aggregates
[edit protovols bgp]
user@Merlot#commit
[edit protocols bgp]
user@Merlot#run show route advertising-protocol bgp 10.100.10.2
inet.0: 32 destinations, 36 routes (32 active, 0 holddown, 0 hidden)
Prefix Nexthop MED Lclpref AS path
192.168.0.0/16 Self I
192.168.2.0/24 Self I
192.168.2.16/28 Self I
192.168.2.32/28 Self I
192.168.2.48/28 Self I
192.168.2./28 Self I
192.168.3.0/24 Self I
192.168.3.16/28 Self I
192.168.3.32/28 Self I
192.168.3.48/28 Self I
192.168.3./28 Self I
汇聚路由192.168.0.0、16依据管理策略被发送出去,但是大量具有更长子网掩码的其他路由也被发送给了Cabernet。让我们先来校验一下我们是否应用了正确的策略:
[edit protocols bgp]
user@Merlot#show group Ext-AS65010
type external;
export adv-large-aggregates;
peer-as 65010;
neighbor 10.100.10.2;
策略“adv-large-aggregates”的确是正确应用了。让我们来看看其他的路由都从何而来。“show route”命令给出了重要线索:
[edit]
user@Merlot#run show route 192.168.3.16/28
inet.0: 32 destinations, 36 routes (32 active, 0 holddown, 0 hidden)
+ = Active Route, - = Last Active, * = Both
192.168.3.16/28 *[BGP/170] 05:51:24, MED 0, localpref 100, from 192.168.3.3
AS path: I
> via so-0/1/1.0
Merlot是通过与Chabolis的BGP会话学到这些路由的。因为这是一个活动的BGP路由,它依照BGP缺省策略被自动地通告出去。记住对于JUNOS软件,缺省的策略总是被应用在在所有的策略链底部。我们现在需要一个屏蔽通告这些明细路由的策略。我们创建一个叫做“not-larger-than-18”的策略来拒绝在192.168.0.0/16地址空间中的所有子网掩码等于或长于19位的路由这就保证了所有子网掩码在16位至18位的汇聚路由能够被通告—这正是我们管理策略想要的。
[edit policy-options]
user@Merlot#show policy-statement not-larger-than-18
term reject-greater-than-18-bits {
from {
route-filter 192.168.0.0/16 prefix-length-range /19-/32;
}
then reject;
}
[edit policy-options]
user@Merlot#top edit protocols bgp
[edit protocols bgp]
user@Merlot#set group Ext-AS65010 export not-larger-than-18
[edit protocols bgp]
user@Merlot#show group Ext-AS65010
type external;
export [ adv-large-aggregates not-larger-than-18 ];
peer-as 65010;
neighbor 10.100.10.2;
[edit protocols bgp]
user@Merlot#commit
commit complete
[edit protocols bgp]
user@Merlot#run show route advertising-protocol bgp 10.100.10.2
inet.0: 32 destinations, 36 routes (32 active, 0 holddown, 0 hidden)
Prefix Nexthop MED Lclpref AS path
192.168.0.0/16 Self I
看起来你的策略链工作还算正常—只有192.168.0.0/16路由被通告给了Cabernet。事实上,一旦“not-larger-than-18”策略在你的策略链中先于BGP缺省策略出现,我们就得到了想要的结果。
我们现在开始来关注Zinfandel,我们在AS 65030中的邻居。我们的管理策略表明这个邻居只能接收到大于18位的汇聚路由和所有客户路由。由于我们预期到我们会遇到同样的麻烦,我们预先创建了一个叫做“notsmaller-than-18”的策略来拒绝所有子网掩码长度在16位和18位之间的汇聚路由。此外,我们还应用了“adv-statics”和“adv-small-aggregates”这两个策略来向邻居通告那些明细路由:
[edit policy-options]
user@Merlot#show policy-statement not-smaller-than-18
term reject-less-than-18-bits {
from {
protocol aggregate;
route-filter 192.168.0.0/16 upto /18;
}
then reject;
}
[edit policy-options]user@Merlot# top edit protocols bgp
[edit protocols bgp]
user@Merlot# set group Ext-AS65030 export adv-small-aggregates
user@Merlot# set group Ext-AS65030 export adv-statics
user@Merlot# set group Ext-AS65030 export not-smaller-than-18
[edit protocols bgp]
user@Merlot# show group Ext-AS65030
type external;
export [ adv-small-aggregates adv-statics not-smaller-than-18 ];
peer-as 65030;
neighbor 10.100.30.2;
[edit protocols bgp]
user@Merlot# commit
commit complete
[edit protocols bgp]
user@Merlot# run show route advertising-protocol bgp 10.100.30.2
inet.0: 32 destinations, 36 routes (32 active, 0 holddown, 0 hidden)
Prefix Nexthop MED Lclpref AS path
192.168.1.0/24 Self I
192.168.1.16/28 Self 0 I
192.168.1.32/28 Self 0 I
192.168.1.48/28 Self 0 I
192.168.1./28 Self 0 I
192.168.2.0/24 Self I
192.168.2.16/28 Self I
192.168.2.32/28 Self I
192.168.2.48/28 Self I
192.168.2./28 Self I
192.168.3.0/24 Self I
192.168.3.16/28 Self I
192.168.3.32/28 Self I
192.168.3.48/28 Self I
192.168.3./28 Self I
192.168.20.0/24 Self 0 I
看起来策略链正在按照我们的设计来工作。实际上,在逐个配置完成我们的策略之后,我们可以在路由器上以各种组合来使用它们。另一个可以重利用你配置的某一部分的有用工具就是策略子程序,所以下面让我们来研究一下这个概念。