路由策略中的IP-Prefix你了解多少?
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前缀列表)
- IP前缀列表匹配路由的可控性比ACL高得多,也更为灵活;
- IP前缀列表可匹配路由前缀中的网络地址及网络掩码(前缀长度),增强了匹配的精确度;
- IP前缀列表除了能够匹配具体的网络掩码长度,还能够匹配掩码长度范围,非常灵活。
- 一个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。
- Permit及deny关键字用于配置本表项的匹配模式。
- 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。
- [原创]深入理解C# 3.x的新特性(3):从Delegate、Anonymous Method到Lambda Expression
- a=b=c,但a不等于c?这是什么鬼
- 为什么不是0,1,2,3,4?setTimeout的奇怪问题
- Linux基础(day67)
- 深入理解C# 3.x的新特性(5):Object Initializer 和 Collection Initializer
- 19.10 处理图形中的乱码
- 《深入理解C# 3.x的新特性》博文系列汇总
- 十一国庆节 之 “变量与函数同名时,会输出谁?”
- 挖坑无止境,来看看这个《this的指向》
- T-SQL Enhancement in SQL Server 2005[上篇]
- 初学js钻太深,不太好
- Linux shell 程序设计3——命令行程序
- Linux shell 程序设计2——bash的内置命令
- T-SQL Enhancement in SQL Server 2005[下篇]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法