路由策略中的IP-Prefix你了解多少?

时间:2022-07-26
本文章向大家介绍路由策略中的IP-Prefix你了解多少?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
  • 1.技术背景
  • 2.IP-Prefix(IP前缀列表)
  • 3.IP前缀列表的配置
  • 4.配置示例

1.技术背景

在部署路由策略的过程中,我们往往需要通过一些手段“抓取”路由,从而能够针对特定的路由来执行相应的策略,以实现差异化。在“抓取”路由的工具中,ACL无疑是最常用的工具之一。

在上图中,R2部署了RIP到OSPF的路由重发布,在这个场景中,我们有个特殊需求:将引入OSPF后的外部路由192.168.1.0/24的cost设定为10、192.168.2.0/24的cost设定为20,那么我们便要先匹配或者说“抓取”相关路由,然后针对不同的路由在route-policy中apply不同的cost,从而实现策略。

使用ACL来应对这个需求是完全没问题的,定义一个ACL2001,匹配192.168.1.0,定义一个ACL2002匹配192.168.2.0,然后在route-policy RP中写两个node分别针对这两条路由apply不同的cost值,很简单。

但是……

上面这个环境,ACL就无能为力了。为什么呢?因为ACL只能够匹配路由前缀的网络地址部分,无法匹配路由前缀的网络掩码(或者说前缀长度)。准确的说,一条路由前缀是包含网络地址和网络掩码(前缀长度)的,对于192.168.1.0,这算不上一条完整的路由,应该采用192.168.1.0 255.255.255.0或者192.168.1.0/24的方式呈现,这才是一条完整路由。而只要网络地址或者网络掩码中有任何一项不同,这就是两条不同的路由了,例如192.168.1.0/24和192.168.1.0/25,这就是两条不同的路由。

ACL是无法匹配路由前缀的掩码部分的,因此上图所示的需求用ACL是无法完成的。这里顺便多嘴一句,如果使用Basic ACL匹配路由,那么建议在书写ACL时,反掩码使用0.0.0.0,否则会造成匹配不精确的现象。例如要匹配192.168.1.0/24这条路由,如果acl的rule这么写:

rule permit source 192.168.1.0 0.0.0.255

这事实上是不严谨的,因为它将192.168.1.0、192.168.1.1、192.168.1.2、192.168.1.3…………等众多网络地址全匹配住了。也就是说,上面的0.0.0.255,并不能用于匹配网络掩码255.255.255.0,它只不过是与前面的192.168.1.0组合,并用于匹配网络地址而已。所以,建议这么写:

rule permit source 192.168.1.0 0.0.0.0

或者:

rule permit source 192.168.1.0 0

2.IP-Prefix(IP前缀列表)

  1. IP前缀列表匹配路由的可控性比ACL高得多,也更为灵活;
  2. IP前缀列表可匹配路由前缀中的网络地址及网络掩码(前缀长度),增强了匹配的精确度;
  3. IP前缀列表除了能够匹配具体的网络掩码长度,还能够匹配掩码长度范围,非常灵活。
  4. 一个IP前缀列表可以包含一个或多个表项(语句),在匹配过程中依序进行计算。表项中的索引号

(序号)决定了每个表项在整个IP前缀列表中的位置。

3.IP前缀列表的配置

创建一个IP前缀列表的配置如下:

[Huawei] ip ip-prefix name [ index index-number ] { permit | deny } ip-address mask-length [ greater-equal greater-
equal-value ] [ less-equal less-equal-value ],
  • Name参数是本IP前缀列表的名称。
  • Index关键字及参数指示本表项在本IP前缀列表中的序号(或索引号),该关键字及参数是可选的。缺省情况下,该序号值按照配置先后顺序依次递增,每次加10,第一个序号值为10。
  • Permitdeny关键字用于配置本表项的匹配模式。
  • ip-address mask-length参数用于分别制定IP地址及掩码长度。
  • **[ greater-equal greater-equal-value ] [ less-equal less-equal-value ]**是可选配置,用于指定掩码长度的范围。

如果在命令中只指定了greater-equal,则前缀范围为[greater-equal-value,32]

如果在命令中只指定了less-equal,则前缀范围为[mask-length,less-equal-value]

IP前缀列表由列表名称进行标识,每个IP前缀列表可以包含多个表项。下面的配置展示了一个名为abcd,它包含两个表项:

[Huawei] ip ip-prefix abcd index 10 deny 1.0.0.0 8
[Huawei] ip ip-prefix abcd index 20 permit 2.0.0.0 8

在IP前缀列表的匹配过程中,设备按索引号升序依次检查各个表项,只要有一个表项满足条件,就不再去匹配后续表项。

ip ip-prefix abcd index 10 deny 1.0.0.0 8为例,这个表项属于IP前缀列表abcd,它的索引号为10,并且匹配模式为拒绝,在该表项中IP前缀为1.0.0.0,掩码长度为8,因此这个表项用于匹配路由1.0.0.0/8,只有该路由才会被匹配,并且该路由将会被该表项过滤(deny)。这个命令中没有定义掩码长度范围。

如果一条路由无法被一个IP前缀列表中的所有表项匹配,那么这条路由被视为被该前缀列表拒绝通过。也就是说,一个IP前缀列表的末尾,隐含着一条拒绝所有的表项。

4.配置示例

示例1:

匹配某条特定路由192.168.1.0/24:

ip ip-prefix ipprefix1 192.168.1.0 24

匹配默认路由0.0.0.0/0:

ip ip-prefix ipprefix2 permit 0.0.0.0 0

注意:IP前缀为0.0.0.0时表示通配地址。此时不论掩码指定为多少,都表示掩码长度范围内的所有路由全被匹配。

匹配所有/32主机路由:

ip ip-prefix ipprefix3 permit 0.0.0.0 0 greater-equal 32

匹配任意路由(any):

ip ip-prefix ipprefix4 permit 0.0.0.0 0 less-equal 32
示例2:

匹配以下路由(用最精确最简洁的方式):

192.168.4.0/24
192.168.5.0/24
192.168.6.0/24
192.168.7.0/24
ip ip-prefix abcd permit 192.168.4.0 22 greater-equal 24 less-equal 24

上面这条命令的意思是,允许那些网络地址的前22bit与192.168.4.0的前22bit相同,并且网络掩码长度为24的路由。注意此处“greater-equal 24 less-equal 24”要求网络掩码长度既大于或等于24,又小于或等于24,因此只能是24。

示例3:

在以上配置中,我们首先创建了一个名称为1的IP前缀列表,该列表中包含一个表项,这个表项要求被匹配路由的网络地址的前16bit与192.168.0.0的前16bit相同,并且路由的网络掩码长度为16,因此该表项只能用于匹配路由192.168.0.0/16。由于该表项的匹配模式为permit,因此路由192.168.0.0/16被该IP前缀列表允许。

随后我们定义了一个route-policy RP,它包含一个节点,且该节点的匹配模式为permit。该节点调用了IP前缀列表1,如此一来,192.168.0.0/16将被route-policy RP所允许,而由于route-policy的末尾隐含着一个拒绝所有的节点,因此对于route-policy RP而言,只允许了路由192.168.0.0/16。