在BGP路由选择协议中,可以对BGP路由选择更新进行过滤,要完成这个工作要用到前缀列表。
一、前缀列表的特点:
(1)、可以增量修改,我们知道对于普通访问控制列表,我们不能删除该列表中的某个条目,如果想删除列表中的某个条目只能将该访问列表全部删除,而前缀列表中,一个条目可以单独地删除或添加。
(2)、前缀列表在Cisco IOS 12.0及其以后的版本中可以使用。
(3)、在大型列表的加载和路由查找方面比访问控制列表有显著的性能改进。
(4)、前缀列表用于BGP路由。
二、前缀列表的命令描述
(1)、“ip prefix-list list-name [seq seq-value] {deny|permit} network/len [ge ge-value] [le le-value]
list name代表被创建的前缀列表名(注意该列表名是区分大小写的)
seq-value代表前缀列表语名的32bit序号,用于确定过滤语句被处理的次序。缺省序号以5递增(5,10,15等等)。
deny|permit代表当发现一个匹配条目时所要采取的行动
network/len代表要进行匹配的前缀和前缀长度。Network是32位的地址,长度是一个十进制的数。
ge-value代表比“network/len”更具体的前缀,要进行匹配的前缀长度的范围。如果只规定了“ge”属性,该范围被认为是从“ge-value”到32.
le-vlaue代表比“network/len”更具体的前缀,要进行匹配的前缀长度的范围。如果只规定了“le”属性,该范围被认为是从“le”到“le-value”。
(2)、“neighbor {ip-address | peer-group-name} prefix-list prefix-listname {in|out}”
ip-address代表要为之进行路由过滤的BGP邻居的IP地址。
peer-group-name代表BGP对等体组的名称。
prefix-listname代表要被用来过滤路由的前缀列表的名称。
in说明前缀列表要被应用在来自邻居的入路由通告。
out说明前缀列表要被应用在发送给邻居的外出的路由通告。
三、在“ip prefix-list”命令中“ge”和“le”任选项的使用可能令人迷惑,理解起来比较难,下面我们做了一个测试,以便更好的了解这些选项的含义。
网络拓朴描述如下:
路由器A属于AS65000,路由器B与路由器C是路由器A的邻居,路由器A从路由器B学到了,172.16.10.0/24, 172.16.11.0这两条路由,路由器C接路由器A的端口地址是:10.1.1.1
在这个测试中使用了3台路由器:路由器B,路由器A和路由器C,路由器C是路由器A的EBGP邻居,路由器C的接口地址为10.1.1.1,如上所示。
假设配置前缀列表之前,路由器A学到了下面的路由(从路由器B那里学来的):
172.16.0.0 subnetted:
172.16.10.0/24
172.16.11.0/24
我们测试了如下5种情况:
第一种情况、在这种情况下,对路由器A做了如下配置:
router bgp 65000
aggregate-address 171.16.0.0 255.255.0.0
neighbor 10.1.1.1 prefix-list tenonly out
in prefix-list tenonly permit 172.16.10.0/8 le 24
当用“show run”命令查看路由器的配置时,我们将看到路由器A自动地将这个配置的最后一行改为下面这样:
ip prefix-fix tenonly permit 172.0.0.0/8 le 24
这时路由器C学到了三个路由器,即:
172.16.0.0/16
172.16.10.0/24
172.16.11.0/24
下面就祥细的说明一下路由器C为什么会学到这三条路由:
因为我们在路由器A中用aggregate创建了一条聚合路由器172.16.0.0/16,
而且在使用这个命令的时候没有加参数summary-only所以,路由器A的EBGP邻居,即路由器C有可能学到三条路由,即聚合路由172.16.0.0/16,具体路由172.16.10.0/24,
具体路由172.16.11.0/24.
在命令“in prefix-list tenonly permit 172.16.10.0/8 le 24”中,len等于8,len-value等24,。前面我们说过对于比“network/len”更具体的前缀,要加上参数len-value,如果只规定了“le”属性,该范围被认为是从“le”到“le-value”,这里的8和24是长度的概念,即可以精确匹配前8位,前9位,前11位,……。一直到可以精确匹配前24位。172.16.0.0/16被认为是精确匹配了前16位,而172.16.10.0/24和172.16.11.0/24则被认为是精确匹配了前24位,如果是172.0.0.0/8则被认为是精确匹配了前8位,即这里的8至24可是掩码位的概念,就是说从路由器C的角度上来说,我可以学到路由器A的BGP路由表中的掩码为/8,/9,/10,/11,/12,/13,/14,/15,/16,/17,/18,/19,/20,/21,/22,/23,/24的路由器,所以在这种情况下路由器C学到了三条路由即:
172.16.0.0/16
172.16.10.0/24
172.16.11.0/24
第二种情况、在这种情况中,对路由器A做了如下配置:
router bgp 65000
aggregate-address 171.16.0.0 255.255.0.0
neighbor 10.1.1.1 prefix-list tenonly out
in prefix-list tenonly permit 172.16.10.0/8 le 16
在这里从路由器C的角度来说,我有可能学到的路由是172.16.0.0/16,172.16.11.0/24
,172.16.10.0/24,但实际我只学到172.16.0.0/16这一条路由器,原因是,len-value的值已经改为16,即我只能学到掩码为/8,/9,/10,/11,/12,/13,/14,/15,/16的路由,在上面的三条路由中,符合条件的只有172.16.0.0/16,所以路由器C只学到172.16.0.0/16这一条路由。
第三种情况、在这个情况中,对路由器A做了如下配置:
router bgp 65000
aggregate-address 171.16.0.0 255.255.0.0
neighbor 10.1.1.1 prefix-list tenonly out
in prefix-list tenonly permit 172.16.10.0/8 ge 17
在这里从路由器C的角度来说,我有可能学到的路由是172.16.0.0/16,172.16.11.0/24,172.16.10.0/24,但路由器C只学到172.16.11.0/24,172.16.10.0/24这两条路由,为什么呢,这是因为这里ge-value的值为17,它精确匹配前17位,前19位,前20位,一直可以精确匹配前32位,即从路由器C的角度上来看,我能说到路由器A中的BGP路由表中的掩码为/17,/18,/19,/20,/21,/22,/23,/24,/25,/26,/27,/28,/29,/30,/31,/32的路由,所以路由器C学到了两条路由:172.16.11.0/24,172.16.10.0/24.
第四种情况、在这个情况中,对路由器A做了如下配置:
router bgp 65000
aggregate-address 171.16.0.0 255.255.0.0
neighbor 10.1.1.1 prefix-list tenonly out
in prefix-list tenonly permit 172.16.10.0/8 ge 16 le24
在这里从路由器C的角度来说,我有可能学到的路由是172.16.0.0/16,172.16.11.0/24,172.16.10.0/24,路由器C能从路由器A的BGP路由表中学到掩码为
/16,/17,/18,/19,/20,/21,/22,/23,/24的路由,以上三条路由都符合条件,所以都被路由器C学到了。
第五种情况、在这个情况中,对路由器A做了如下配置:
router bgp 65000
aggregate-address 171.16.0.0 255.255.0.0
neighbor 10.1.1.1 prefix-list tenonly out
in prefix-list tenonly permit 172.16.10.0/8 ge 17 le24
在这里从路由器C的角度来说,我有可能学到的路由是172.16.0.0/16,172.16.11.0/24,172.16.10.0/24,路由器C能从路由器A的BGP路由表中学到掩码为/17,/18,/19,/20,/21,/22,/23,/24的路由,以上三条路由中只有172.16.11.0/24,172.16.10.0/24符合条件,所以路由器C学到了172.16.11.0/24,172.16.10.0/24这两条路由。