B13【路由控制】ACL、路由策略、策略路由
前言
本文将介绍路由策略与策略路由,它们名字很相似,很容易混淆。其实只要分清主语就可以了。
路由策略是作用于路由的策略,是对路由去做一个过滤筛选与自定义参数,主要用在引入路由的时候。
策略路由是有策略的路由,是对数据包的走向进行自定义,这也相当于是对数据包进行路由。
总的来说,一个是策略,另一个是路由。
而ACL是一种用在路由策略的“策略”。因此本文会先介绍它。
ACL
ACL(Access Control List,访问控制列表)是由一条或多条规则组成的集合,是用于控制数据包流动的一种机制。
所谓规则,是指描述报文匹配条件的判断语句,这些条件可以是报文的源地址、目的地址、端口号等。
ACL本质上是一种报文过滤器,设备基于规则进行报文匹配,可以过滤出特定的报文。
配置完ACL后,必须在具体的业务模块中应用ACL,才能使ACL正常下发和生效。
最终根据应用ACL的业务模块的处理策略来允许或阻止该报文通过。
业务分类 | 应用场景 | 涉及业务模块 |
---|---|---|
对转发的报文进行过滤 | 基于全局和接口,对转发的报文进行过滤,从而使设备能够进一步对过滤出的报文进行丢弃、修改优先级、重定向等处理。 例如,可以利用ACL,降低P2P下载、网络视频等消耗大量带宽的数据流的服务等级,在网络拥塞时优先丢弃这类流量,减少它们对其他重要流量的影响。 |
简化流策略/流策略 |
对上送CPU处理的报文进行过滤 | 对上送CPU的报文进行必要的限制,可以避免CPU处理过多的协议报文造成占用率过高、性能下降。 例如,当发现某用户向设备发送大量的ARP攻击报文,造成设备CPU繁忙,引发系统中断时,可以在本机防攻击策略的黑名单中应用ACL,将该用户加入黑名单,使CPU丢弃该用户发送的报文。 |
黑名单 |
登录控制 | 对设备的登录权限进行控制,允许合法主机登录,拒绝非法主机登录,从而有效防止未经授权的非法接入,保证网络安全性。 例如,一般情况下设备只允许管理员登录,非管理员用户不允许随意登录。这时就可以在Telnet中应用ACL,并在ACL中定义哪些主机可以登录,哪些主机不能。 |
Telnet、STelnet、FTP、SFTP、HTTP、SNMP |
路由过滤 | ACL可以应用在各种动态路由协议中,对路由协议发布、接收的路由信息以及组播组进行过滤。 例如,可以将ACL和路由策略配合使用,禁止设备将某网段路由发给邻居路由器。 |
BGP、IS-IS、OSPF、OSPFv3、RIP、RIPng、组播协议 |
在各类业务模块中应用ACL时,ACL的默认动作各有不同。
所以各业务模块对命中/未命中ACL规则报文的处理机制也各不相同。
例如:
流策略中的ACL默认动作是permit(允许),也就是说在流策略中应用ACL时,如果报文未匹配上ACL中的任何一条规则,该报文仍可以正常通过。
而登录控制中的ACL默认动作是deny(阻止),在登录控制中应用ACL时,如果遇到此种情况,该报文会被拒绝通过。
此外,黑名单模块中的ACL处理机制与其他模块有所不同。在黑名单中应用ACL时,无论ACL规则配置成permit还是deny,只要报文命中了规则,该报文都会被系统丢弃。
ACL的编号和步长
用户在创建ACL时必须为其指定编号或名称,不同的编号对应不同类型的ACL。
ACL类型 | 编号范围 | 规则可制定的匹配依据 |
---|---|---|
基本ACL | 2000~2999 | 报文的源IP地址 |
高级ACL | 3000~3999 | 报文的源IP地址、目的IP地址、报文优先级、IP承载的协议类型及特性等三、四层信息 |
二层ACL | 4000~4999 | 报文的源MAC地址、目的MAC地址、802.1p优先级、链路层协议类型等二层信息 |
除了ACL编号外,ACL中的每条rule(规则)也有自己的编号,这个rule编号在一个ACL中是唯一的。
ACL的匹配是按顺序的,以rule编号小的为优先匹配。
创建规则时,可以手工为其指定一个rule编号;如未手工指定rule编号,则由系统为其自动分配一个rule编号
由于规则的编号可能影响规则匹配的顺序,因此当由系统自动分配rule编号时,为了方便后续在已有规则之前插入新的规则,系统通常会在相邻rule编号之间留下一定的空间,这个空间的大小(即相邻编号之间的差值)就称为ACL的步长。
一般默认ACL的rule编号步长为5,系统会将编号5、10、15、20……依次分配给新创建的规则。
因此,一般手动配置的时候,不要使用连号;
否则后期再想插入新的规则,就只能先删除已有的规则,然后再配置新规则,最后再将之前删除的规则重新配置还原。
ACL的匹配
一条ACL可以由多条“deny”或”permit”语句组成,每一条语句描述一条规则,这些规则可能存在重复或矛盾的地方。
例如,在一条ACL中先后配置以下两条规则:
1 | rule deny ip destination 10.1.0.0 0.0.255.255 //表示拒绝目的IP地址为10.1.0.0/16网段地址的报文通过 |
对于目的IP=10.1.1.1的报文,如果系统先将deny规则与其匹配,则该报文会被拒绝通过。
相反,如果系统先将permit规则与其匹配,则该报文会得到允许通过。
也就是说,数据报文经过ACL时,遵循“一旦命中则停止”的原则。
因此,对于规则之间存在重复或矛盾的情形,报文的匹配结果与ACL的匹配顺序是息息相关的。
设备支持两种ACL匹配顺序:配置顺序(config模式)和自动排序(auto模式)。默认ACL匹配顺序是config模式。
配置顺序,即系统按照ACL规则编号从小到大的顺序进行报文匹配,规则编号越小越容易被匹配。
- 如果配置规则时指定了规则编号,则规则编号越小,规则插入位置越靠前,该规则越先被匹配。
- 如果配置规则时未指定规则编号,则由系统自动为其分配一个编号。该编号是一个大于当前ACL内最大规则编号且是步长整数倍的最小整数,因此该规则会被最后匹配。
自动排序,是指系统使用“深度优先”的原则,将规则按照精确度从高到低进行排序,并按照精确度从高到低的顺序进行报文匹配。(类似路由转发中的“最长匹配原则”)
规则中定义的匹配项限制越严格,规则的精确度就越高,即优先级越高,系统越先匹配。
相比config模式的ACL,auto模式ACL的规则匹配顺序更为复杂,但是auto模式ACL有其独特的应用场景。
例如:
在网络部署初始阶段,为了保证网络安全性,管理员定义了较大的ACL匹配范围,用于丢弃不可信网段范围的所有IP报文。
随着时间的推移,实际应用中需要允许这个大范围中某些特征的报文通过。
此时,如果管理员采用的是auto模式,则只需要定义新的ACL规则,无需再考虑如何对这些规则进行排序避免报文被误丢弃。
ACL的规则
配置基本ACL规则的命令具有如下的结构。
rule [rule-id] {deny | permit} [source (source-address source-wildcard | any) I fragment | logging | time-range time-name]
命令中各个组成项的解释如下。(大括号为必选、中括号为可选,黑体为固定命令,斜体为变量。)
rule:表示这是一条规则。
rule-id:表示这条规则的编号。
deny | permit:这是一个二选一选项,表示与这条规则相关联的处理动作。deny表示“拒绝”; permit表示“允许”。
source:表示源 IP 地址信息。
source-address:表示具体的源 IP 地址。
source-wildcard:表示与 source-address 相对应的通配符。 source-wildcard 和source-address 的结合使用,可以确定出一个 IP 地址的集合。该集合中也可以只包含一个 IP 地址。
any:表示源 IP 地址可以是任何地址。
fragment:表示该规则只对非首片分片报文有效。
logging:表示需要将匹配上该规则的 IP 报文进行日志记录。
time-range time-name:表示该规则的生效时间段为time-name。
以下rule的表达方式仅是示意形式。
- rule permit xxx:表示允许指定的报文通过,xxx表示指定报文的标识,可以是源IP地址、源MAC地址、生效时间段等。
- rule deny xxx:表示拒绝指定的报文通过。
- rule permit:表示允许所有报文通过。
- rule deny:表示拒绝所有报文通过。
根据各业务模块ACL默认动作的不同,ACL的配置原则也不同。
例如,在默认动作为permit的业务模块中,如果只希望deny部分IP地址的报文,只需配置具体IP地址的deny规则,结尾无需添加任意IP地址的permit规则;而默认动作为deny的业务模块恰与其相反。
具体分类如下:
业务模块的ACL默认动作 | permit所有报文 | deny所有报文 | permit少部分报文,deny大部分报文 | deny少部分报文,permit大部分报文 |
---|---|---|---|---|
permit | 无需应用ACL | 配置rule deny | 需先配置rule permit xxx,再配置rule deny xxx或rule deny 说明:以上原则适用于报文过滤的情形。当ACL应用于流策略中进行流量监管或者流量统计时,如果仅希望对指定的报文进行限速或统计,则只需配置rule permit xxx。 |
只需配置rule deny xxx,无需再配置rule permit xxx或rule permit 说明:如果配置rule permit并在流策略中应用ACL,且该流策略的流行为behavior 配置为deny,则设备会拒绝所有报文通过,导致全部业务中断。 |
deny | 路由和组播模块:需配置rule permit其他模块:无需应用ACL | 路由和组播模块:无需应用ACL其他模块:需配置rule deny | 只需配置rule permit xxx,无需再配置rule deny xxx或rule deny | 需先配置rule deny xxx,再配置rule permit xxx或rule permit |
举例:
例1:在流策略中应用ACL,使设备对192.168.1.0/24网段的报文进行过滤,拒绝192.168.1.2和192.168.1.3主机地址的报文通过,允许192.168.1.0/24网段的其他地址的报文通过。
流策略的ACL默认动作为permit,该例属于“deny少部分报文,permit大部分报文”的情况,所以只需配置rule deny xxx。
1
2
3
4
5#
acl number 2000
rule 5 deny source 192.168.1.2 0
rule 10 deny source 192.168.1.3 0
#例2:在流策略中应用ACL,使设备对192.168.1.0/24网段的报文进行过滤,允许192.168.1.2和192.168.1.3主机地址的报文通过,拒绝192.168.1.0/24网段的其他地址的报文通过。
流策略的ACL默认动作为permit,该例属于“permit少部分报文,deny大部分报文”的情况,所以需先配置rule permit xxx,再配置rule deny xxx。
1
2
3
4
5
6#
acl number 2000
rule 5 permit source 192.168.1.2 0
rule 10 permit source 192.168.1.3 0
rule 15 deny source 192.168.1.0 0.0.0.255
#例3:在Telnet中应用ACL,仅允许管理员主机(IP地址为172.16.105.2)能够Telnet登录设备,其他用户不允许Telnet登录。
Telnet的ACL默认动作为deny,该例属于“permit少部分报文,deny大部分报文”的情况,所以只需配置rule permit xxx。
1
2
3
4#
acl number 2000
rule 5 permit source 172.16.105.2 0
#例4:在Telnet中应用ACL,不允许某两台主机(IP地址为172.16.105.3和172.16.105.4)Telnet登录设备,其他用户均允许Telnet登录。
Telnet的ACL默认动作为deny,该例属于“deny少部分报文,permit大部分报文”的情况,所以需先配置rule deny xxx,再配置rule permit。
1
2
3
4
5
6#
acl number 2000
rule 5 deny source 172.16.105.3 0
rule 10 deny source 172.16.105.4 0
rule 15 permit
#例5:在FTP中应用ACL,不允许用户在周六的00:00~8:00期间访问FTP服务器,允许用户在其他任意时间访问FTP服务器。
FTP的ACL默认动作为deny,该例属于“deny少部分报文,permit大部分报文”的情况,所以需先配置rule deny xxx,再配置rule permit xxx。
1
2
3
4
5
6
7
8#
time-range t1 00:00 to 08:00 Sat
time-range t2 00:00 to 23:59 daily
#
acl number 2000
rule 5 deny time-range t1
rule 10 permit time-range t2
#
路由策略
概述
路由策略主要实现了路由过滤和路由属性设置等功能,它通过改变路由属性(包括可达性)来改变网络流量所经过的路径。
路由协议在发布、接收和引入路由信息时,根据实际组网需求实施一些策略,如:
控制路由的接收和发布
只发布和接收必要、合法的路由信息,以控制路由表的容量,提高网络的安全性。
控制路由的引入
在一种路由协议引入 其它路由协议发现的路由信息 时,只引入一部分满足条件的路由信息。
设置特定路由的属性
修改通过路由策略过滤的路由的属性,满足自身需要。
路由策略具有以下价值:
- 通过控制路由器的路由表规模,节约系统资源。
- 通过控制路由的接收、发布和引入,提高网络安全性。
- 通过修改路由属性,对网络数据流量进行合理规划,提高网络性能。
实际上,路由策略并不是单一的一项技术,而是一种思路、方案的统称。
接下来我们就介绍几种路由策略的实现方式。
Route-Policy
Route-Policy 是一个非常重要的路由策略工具,如图所示,可以把它想象成拥有一个或多个节点(Node)的列表,每一个节点都可以是一系列条件语句及执行语句的集合,这些节点按照编号从小到大的顺序排列。
在每个节点中,用户可以定义条件语句及执行语句,这就有点像程序设计语言里的If语句。
在Route-Policy被执行的时候,设备从编号最小的节点开始进行路由匹配,如果被匹配的对象满足所有条件,则执行该节点中的执行语句,并且不会再继续往下一个节点进行匹配。而如果节点1中,有任何一个条件不满足,则前往下一个节点,也就是到节点2中去匹配条件语句,如果被匹配的对象满足所有条件,则执行该节点中的执行语句;如果不满足,则继续往下一个节点进行匹配,以此类推。

在Route-Policy里,条件语句是if-match,执行语句是apply,可在它们后配置具体的判断条件和执行动作。
过滤器
Route-Policy中If-match子句可匹配多种过滤器,目前我们主要学习以下两种。
注意,此处列举的是过滤器,是独立在Route-Policy之外,预先配置好的,然后引用到Route-Policy里。
- ACL
ACL是将报文中的入接口、源或目的地址、协议类型、源或目的端口号作为匹配条件的过滤器,在各路由协议发布、接收路由时单独使用。在Route-Policy的If-match子句中只支持基本ACL。
在基本ACL中,虽然配置的是“source ip mask”,但应用在路由策略中时,是匹配路由条目中的目标网段。
因此ip字段建议配置为网段的网络地址;mask字段配置为0.0.0.0,表示严格匹配该网络地址。
- 地址前缀列表(IP Prefix List)
地址前缀列表将源地址、目的地址和下一跳的地址前缀作为匹配条件的过滤器,可在各路由协议发布和接收路由时单独使用。
每个地址前缀列表可以包含多个索引(index),每个索引对应一个节点。路由按索引号从小到大依次检查各个节点是否匹配,任意一个节点匹配成功,将不再检查其他节点。
根据匹配的前缀不同,前缀过滤列表可以进行精确匹配,也可以进行在一定掩码长度范围内匹配。
当IP地址为0.0.0.0时表示通配地址,表示掩码长度范围内的所有路由都被Permit或Deny。
因为if-match语句携带的ACL只支持基本ACL,在Route-Policy只能用作过滤指定目标网段的路由信息;
所以对于需要将源地址作为条件的场景就需要使用地址前缀列表了。
配置
执行命令system-view,进入系统视图。
执行命令route-policy route-policy-name { permit | deny } node node-number,创建Route-Policy,并进入Route-Policy视图。
当使用Route-Policy时,node-number的值小的节点先进行匹配。一个节点匹配成功后,路由将不再匹配其他节点。全部节点匹配失败后,路由将被过滤。
下列命令之间是并列关系,请根据实际情况配置路由策略中的if-match子句。
匹配基本ACL:if-match acl { acl-number | acl-name }
使用路由协议下的Route-Policy策略过滤路由时:
- 如果ACL规则的动作是permit时,那么被此条rule规则匹配的路由信息被认为通过if-match子句的检查。
- 如果ACL规则的动作是deny时,那么被此条rule规则匹配的路由信息被认为未通过if-match子句的检查。
- 如果路由信息不在ACL规则指定的范围内,那么这些路由信息被认为未通过if-match子句的检查。
- 如果ACL中不存在规则,那么在此节点检查的所有路由信息被认为未通过if-match子句的检查。
- 未通过if-match子句的检查则匹配route-policy下一个节点(如果有)。
- 对于route-policy中的permit节点,路由信息如果通过if-match子句的检查,则执行apply子句的相应动作。
- 对于route-policy中的deny节点,路由信息如果通过if-match子句的检查,则不被执行apply子句的相应动作。
匹配地址前缀列表:if-match ip-prefix ip-prefix-name
匹配路由信息的开销值:if-match cost cost
匹配路由信息的出接口:if-match interface interface-type interface-number
匹配路由信息的标记:if-match tag tag
根据实际情况配置路由策略中的apply子句。
- 设置路由的开销值:apply cost [ + | - ] cost
- 设置IPv4路由的下一跳地址:apply ip-address next-hop { ipv4-address | peer-address }
- 设置IPv6路由的下一跳地址:apply ipv6 next-hop { peer-address | ipv6-address }
- 设置路由协议的优先级:apply preference preference
- 设置路由的标记域:apply tag tag
- 以上配置删除了使用率很低的命令,比如IS-IS、BGP、MPLS等相关参数的修改。
案例介绍
使用acl作为过滤器,在引入静态路由时,进行筛选
在图示的网络中, R1及R2在各自的GE0/0/0接口上激活OSPF并在Area0内建立邻接关系。
R1还有另外三个直连接口,这三个接口并没有使用network命令激活OSPF。
为了让OSPF域内的路由器能够学习到R1的GE0/0/1及GE0/0/2接口的路由(且路由的度量值为20),就需要在R1上将直连路由引入OSPF。
但是这样一来,R1所有的直连路由都会被引入,这显然并非我们期望看到的结果。
1 | #创建基本acl,acl编号为2000,内容为匹配GE0/0/1及GE0/0/2接口的路由。注意,因为是匹配路由,因此ip地址为网络地址,为了避免“误伤”,通配符填写为0.0.0.0。 |
在R1上进行以上配置,即可达到要求,我们可以在R2上检查路由表。
1 | [R2]display ospf routing |
使用地址前缀列表作为过滤器,在引入静态路由时,进行筛选
如果继续使用刚刚的拓扑图,那么采用地址前缀列表的方式,配置如下
1 | #提前删除之前配置的route-policy与路由引入 |
解释一下,ip-prefix默认动作为deny,也就是说对于没有匹配到规则的报文都一律拒绝通过。
因此此处才没有专门配置“ip ip-prefix no3 deny 10.0.3.0 24”。
关于ip-prefix的语法,还有三个可选参数,分别是:
- index:编号,默认步长为10。与acl的rule编号、route-policy的node编号是一个用途。
- greater-equal:要求掩码长度大于等于指定数值。
- less-equal:要求掩码长度小于等于指定数值。
ip-prefix的默认动作为deny,如果我们的需求是只禁止某几条路由信息,那么我们就可以配置以下命令。(index编号值大于要deny的那几条)
ip ip-prefix name index 10 permit 0.0.0.0 0 less-equal 32
0.0.0.0后面还有一个标识掩码长度的0!
上述语句中,IP 地址为 0.0.0.0,这种形式的 IP 地址被称为任意地址或通配地址,也即该地址能匹配任意的目的网络地址。
因此该语句并不关心被匹配路由的目的网络地址,但是要求路由的目的网络掩码长度须大于或等于0,且小于或等于32;
实际上所有的路由都满足上述要求,因此该条语句相当于“允许所有”。
Filter-Policy
本节将介绍另外一款用于路由过滤的工具——Filter-Policy (过滤-策略),可以将其视为一种路由过滤器。
filter-policy工作在协议的进程下,可以作用于进程的进出两个方向。
但它只能过滤路由信息,并不检查/过滤链路状态信息,因此在OSPF协议下,它不适合用在出方向。
而在入方向,过滤只会影响OSPF路由表加载进ip路由表,对LSDB表与OSPF路由表没有影响(不过实际要看各厂商设备的设定)
(系统会从多个协议的路由表中挑选最优的路由加载进ip路由表中,实际报文的转发就是依照ip路由表进行的。)
有关这部分内容,我们稍后用一个实验演示。
filter-policy本身无法设置滤条件,需要调用其它过滤条件来完成路由信息过滤。
一般可以调用acl、ip-prefix、route-policy这三项进行过滤。
这三项都已经介绍过了,因此我们直接进入案例吧。
在RIP网络中过滤路由
图示的网络中, R1、 R2及R3运行了RIPv2,初始情况下,R2能够学习到192.168.1.0/24、192.168.2.0/24及192.168.3.0/24这三条RIP路由。而R3也能够通过RIP学习到这三条路由,此外还会学习到10.1.12.0/24路由。
现在希望禁止R3通过RIP学习到192.168.2.0/24路由,我们可以在R2上部署Filter-Policy,将192.168.2.0/24路由从通告给 R3 的路由中过滤掉。
1 | #创建基本acl,编号2000,拦截192.168.2.00 /24路由信息 |
filter-policy并不需要像Route-Policy那样提前创建;直接在进程下即可配置。
此处拓扑里,R2不禁止192.168.2.0/24的路由,因此是在出方向调用。
可以分别检查R2与R3的RIP路由表,可以发现R2有192.168.2.0/24的路由,而R3没有。
如果配置在入方向:
1 | [R2]rip 1 |
那么R2的RIP路由表就没有192.168.2.0/24的路由:
如果是刚设的,因为之间收集的路由还没过期,所以暂时会发现还在,等过期后就没有192.168.2.0/24的路由了。
1 | [R2]display rip 1 route |
在OSPF网络中过滤路由
如图所示,R1、R2、R3、R4一起组成一个OSPF网络,R2、R3、R4处于area0区域,R1、R2处于area1区域。
R4一侧连接一个有R5存在的RIP网络。R1上连接了三个直连网段,且并未激活OSPF。
- 现在我们希望R1引入直连路由,但不引入192.168.2.0的路由。
- 而192.168.3.0的路由不传给R4。
- 在R4上引入RIP路由,但不传给area1区域。
让我们一个一个需求来。
过滤引入的直连路由(不引入192.168.2.0的路由)
1 | #创建基本acl,拦截192.168.2.0的路由 |
需要解释一下:
从整个OSPF网络的角度来看,我们是在”引入”路由。然而,在filter-policy命令中使用export而不是import是有原因的。
以R1为视角,它自身是持有这些路由信息了,是与它相连的OSPF网络中的其他路由没有。
我们“引入”路由,其实是“发布”R1已有的路由给其他OSPF路由器。
使用export表示我们要在路由被OSPF接受并准备发送给其他OSPF邻居之前进行过滤。
这样可以确保不符合ACL条件的路由不会进入OSPF的路由数据库,也不会被发送给其他OSPF路由器。
在R1上执行完以上命令,可以检查发现R1确实不会发布带有192.168.2.0的LSA信息给其他路由器。
1 | [R1]display ospf 1 lsdb originate-router 1.1.1.1 |
过滤OSPF中传输的路由(192.168.3.0的路由不传给R4)
我们很容易就想到,可以在R3的出方向过滤拦截,让192.168.3.0的路由不发送给R4。
那我们配置一下试试:
1 | [R3]acl 2000 |
但可以发现,没有作用,甚至通过重新引入路由来刷新lsdb表了,依旧存在192.168.3.0的信息。
1 | [R4]display ospf 1 lsdb |
这是因为filter-policy只会过滤路由信息,而OSPF这边链路状态协议传递的是链路状态信息,不会被filter-policy匹配过滤。
不过,OSPF设计了如果在入方向使用filter-policy的话,可以让OSPF路由表内路由导入到本地ip路由表的这个动作对LSA进行filter-policy过滤。
1 | [R4]acl 2000 |
扩展一下:能不能过滤到达area1的RIP外部路由
在R2上的入方向进行过滤,这次我们用地址前缀的方式过滤吧,换换口味熟悉一下。
1 | #ip-prefix默认动作为拒绝,所以逻辑上我们要放行所有信息,再去单独拦截RIP网络中的10.1.45.0 24。 |
配置完成后,我们在R4上引入RIP路由再来检查一下R2的情况。
1 | [R2]dis ip routing-table |
可以看到代表RIP网络的10.1.45.0的路由并没有加载到R2的ip路由表中,这符合我们之前使用acl在入方向的过滤结果。
另外,我留了一个R5的回环地址5.5.5.5,以表示RIP路由确实已经被引入OSPF网络中了。
然而,R2的LSDB表中还是存在10.1.45.0的LSA信息。(这边就不展示LSDB表了)
因此,R2在传递LSA信息的时候,依旧将带有10.1.45.0的LSA发送到area1区域内。
所以在R1上还是能看到RIP网络的信息。
1 | #在R1上检查宣告者为4.4.4.4的lsdb表,发现存在10.1.45.0 |
小结
对于OSPF来说,只能在宣告路由器上拦截外部路由,对于正在传输的路由不能完全拦截。
只能做到对单独一台路由器禁止指定的路由被启用(加载进ip路由表)。
策略路由
首先让我们回顾一下传统IP路由的概念,所谓的路由,指的是当路由设备收到一个IP报文时,在其路由表中查询该报文的目的IP地址,在找到最匹配的路由表项后,按照该表项所指示的出接口及下一跳IP地址转发该报文。
从这个描述可以看出,路由行为只关心报文的目的IP地址,而并不关心其源IP地址。
当面对一些特殊的需求时,传统的路由行为是存在短板的。
所谓的策略路由,即是基于策略的路由(**Policy-Based Routing, PBR)**。
与单纯依照IP报文的目的地址查找路由表进行转发不同,策略路由是一种依据用户制定的策略进行路由转发的机制。
策略路由可以对于满足一定条件(ACL规则)的报文,执行指定的操作(设置报文的下一跳、SRv6 TE Policy、出接口等)。
为了避免混淆,我们再列举一下路由策略与策略路由的的概念:
名称 | 作用 | 操作对象 |
---|---|---|
路由策略 | 对“路由信息”进行过滤,或修改其属性的策略操作,本质是策略 | 路由信息 |
策略路由 | 对“数据报文”的转发过程进行自带义操作,本质是路由 | 数据报文 |
策略路由一样也是多种具体技术的统称,根据作用对象的不同,策略路由可分为以下两种类型:
- 本地策略路由:对设备本身产生的报文(比如本地发出的ping报文)起作用,指导其发送。
- 接口策略路由:对接口接收的报文起作用,指导其转发。
另外还有一种智能策略路由,主要是增加智能检测链路状态,以满足通过匹配链路质量和网络业务对链路质量的需求,实现智能选路。
本地策略路由
本地策略路由仅对本机下发的报文进行处理,对转发的报文不起作用。
一条本地策略路由可以配置多个策略点,并且这些策略点具有不同的优先级,本机下发报文优先匹配优先级高的策略点。
本机下发报文时,根据本地策略路由节点的优先级,依次匹配各节点绑定的匹配规则,本地策略路由支持基于ACL或报文长度的匹配规则。
本地策略路由的实现逻辑与路由策略中的Route-Policy十分相似。
配置本地策略路由
在配置本地策略路由之前,需完成以下任务:
- 配置接口的链路层协议参数,使接口的链路协议状态为Up。
- 配置用于匹配报文的ACL。
- 如果希望报文进入VPN,则需要预先配置VPN。
配置匹配条件
执行命令system-view,进入系统视图。
执行命令policy-based-route policy-name { deny | permit } node node-id,创建策略路由和策略点,若策略点已创建则进入本地策略路由视图。
- permit表示对满足匹配条件的报文进行策略路由,deny表示对满足匹配条件的报文不进行策略路由。
- 重复执行该命令可以在一条本地策略路由下创建多个策略点,策略点由顺序号node-id来指定,顺序号的值越小则优先级越高,相应策略优先执行。
执行如下命令,可以只执行一条也可以两条都执行,设置IP报文匹配条件。
执行命令if-match acl acl-number,设置IP报文的ACL匹配条件。
- 当ACL的rule配置为permit时,设备会对匹配该规则的报文执行本地策略路由的动作:
- 本地策略路由中策略点为permit时对满足匹配条件的报文进行策略路由;
- 本地策略路由中策略点为deny时对满足匹配条件的报文不进行策略路由,即根据目的地址查找路由表转发报文。
- 当报文匹配的ACL的rule配置为**deny **或 报文未匹配上任何规则,则根据目的地址查找路由表转发报文。
- 当ACL的rule配置为permit时,设备会对匹配该规则的报文执行本地策略路由的动作:
执行命令if-match packet-length min-length max-length,设置IP报文长度匹配条件。
配置执行动作
执行命令policy-based-route policy-name { deny | permit } node node-id ,进入已创建的本地策略路由视图。
执行如下命令,配置策略路由的动作。一个策略点中至少包含一条apply子句,也可以多条apply子句组合使用。
执行命令apply output-interface interface-type interface-number,指定本地策略路由中报文的出接口。
- 报文的出接口不能为以太接口等广播型接口。
- 如果策略中设置了两个出接口,那么报文转发在两个出接口之间负载分担。
- 如果先使用命令配置了两个出接口,然后又执行该命令配置了一个出接口,则后配置的出接口将覆盖前面配置的第一个出接口,而第二个出接口不会被覆盖。
执行命令apply ip-address next-hop ip-address1 [ ip-address2 ],设置本地策略路由中报文的下一跳。
用户可以指定报文的下一跳。
- 报文的下一跳地址不能是本设备的IP地址。
- 如果策略中设置了两个下一跳,那么报文转发在两个下一跳之间负载分担。
- 如果先使用命令配置了两个下一跳,然后又执行该命令配置了一个下一跳,则后配置的下一跳将覆盖前面配置的第一个下一跳,而第二个下一跳不会被覆盖。
执行命令apply ip-address next-hop { ip-address1 track ip-route ip-address2 { mask | mask-length } } &<1-2>,配置本地策略路由的下一跳联动路由功能。
执行命令apply ip-address backup-nexthop ip-address,配置本地策略路由中报文转发的备份下一跳。
配置启用本地策略路由
- 执行命令system-view,进入系统视图。
- 应用本地策略路由:
- 执行命令ip local policy-based-route policy-name,使能本地策略路由。
- 执行命令ip local route-based-source enable,使能等价路由多上行的场景下本机发出的报文会基于报文源地址选择出接口功能。
接口策略路由(流策略)
配置接口策略路由可以将到达接口的三层报文重定向到指定的下一跳地址。
接口策略路由只对转发的报文起作用,对本地下发的报文(比如本地的Ping报文)不起作用。
数据流、流分类、流行为
数据流是指在网络中传输的一系列相关数据包的集合。这些数据包通常属于同一会话或应用程序,具有相同的源和目的地址。
通常是双向的,有上行和下行流量。通过源IP、目的IP、源端口、目的端口和协议这五元组来唯一标识
流分类是对网络中不同数据流的进行分类标识。这是实现网络质量服务(QoS)、安全策略和流量管理的基础。
分类方法:
- 基于协议: 如TCP、UDP、HTTP、FTP等
- 基于应用: 如视频流、语音通话、邮件等
- 基于用户或设备: 通过IP地址或MAC地址识别
- 基于服务等级: 如高优先级业务流、普通业务流等
流行为描述了数据流在网络中的特征和模式。
在策略路由中,我们是要手动配置流行为,修改指定数据流的动作。
配置流分类与流行为
在配置接口策略路由前,需要完成以下任务:
- 配置相关接口的IP地址和路由协议,保证路由互通。
- 如果使用ACL作为接口策略路由的流分类规则,配置相应的ACL。
配置流分类
执行命令system-view,进入系统视图。
执行命令traffic classifier classifier-name [ operator { and | or } ],创建一个流分类,进入流分类视图。
and表示流分类中各规则之间关系为“逻辑与”,指定该逻辑关系后:
- 当流分类中有ACL规则时,报文必须匹配其中一条ACL规则以及所有非ACL规则才属于该类。
- 当流分类中没有ACL规则时,则报文必须匹配所有非ACL规则才属于该类。
or表示流分类各规则之间是“逻辑或”,即报文只需匹配流分类中的一个或多个规则即属于该类。
默认情况下,流分类中各规则之间的关系为“逻辑或”。
请根据实际情况配置流分类中的匹配规则。(可以匹配高级ACL ,因此一般ACL就够满足需求了)
匹配规则 命令 ACL规则 if-match acl { acl-number | acl-name } 外层VLAN ID if-match vlan-id start-vlan-id [ to end-vlan-id ] 目的MAC地址 if-match destination-mac mac-address [ mac-address-mask mac-address-mask ] 源MAC地址 if-match source-mac mac-address [ mac-address-mask mac-address-mask ] 以太网帧头中协议类型字段 if-match l2-protocol { arp | ip | rarp | protocol-value } 所有报文 if-match any 入接口 if-match inbound-interface interface-type interface-number 出接口 if-match outbound-interface Cellular interface-number:channel 部分不常用的匹配条件未列出,可自行翻阅对应产品文档。
执行命令quit,退出流分类视图。
配置流行为
执行命令traffic behavior behavior-name,创建一个流行为并进入流行为视图,或进入已存在的流行为视图。
请根据实际需要进行如下配置:
执行命令redirect ip-nexthop ip-address [ vpn-instance vpn-instance-name ] [ track { nqa admin-name test-name | ip-route ip-address { mask | mask-length } | } ] [ post-nat ] [ discard ] [ sfc-nsh spi spi-index si si-index ],将符合流分类的报文重定向到下一跳,可选配置重定向与NQA测试例或IP路由联动。
NQA(Network Quality Analysis)是网络故障诊断和定位的有效工具,路由状态则可以直接反映出目的IP是否可达,配置NQA/路由与重定向联动功能,可以在目的IP不可达时,实现链路快速切换,保障用户流量正常转发:
- 当NQA/路由模块检测到目的IP可达时,按照指定的IP进行报文转发,即重定向生效。
- 当NQA/路由模块检测到目的IP不可达时,重定向不生效,如果用户未配置discard参数,系统将按原来的转发路径转发报文,否则报文将被丢弃。
执行命令redirect ipv6-nexthop ipv6-address [ track { nqa nqa-admin nqa-name | ipv6-route ipv6–address masklen } ] [ discard ],将符合流分类的IPv6报文重定向到下一跳。
执行命令redirect interface interface-type interface-number [ track { nqa admin-name test-name | ip-route ip-address { mask | mask-length } [ weak ] | ipv6-route ipv6-address mask-length } ] [ discard ],将符合流分类的报文重定向到指定接口。
- 包含重定向动作的流策略只能在接口的入方向上应用。
执行命令quit,退出流行为视图。
执行命令quit,退出系统视图。
配置流策略
- 执行命令system-view,进入系统视图。
- 执行命令traffic policy policy-name,创建一个流策略并进入流策略视图,或进入已存在的流策略视图。
- 执行命令classifier classifier-name behavior behavior-name [ precedence precedence-value ],在流策略中为指定的流分类配置所需流行为,即绑定流分类和流行为。
- 执行命令quit,退出流策略视图。
- 执行命令quit,退出系统视图。
应用流策略
执行命令system-view,进入系统视图。
执行命令interface interface-type interface-number [.subinterface-number ],进入接口视图或子接口视图。
执行命令traffic-policy policy-name inbound,在接口或子接口的入方向应用流策略。
目前,接口策略路由仅支持在接口的入方向上应用。
策略路由应用案例
注:以下都是自嗨式案例介绍,现网中不要这样玩。
本地策略路由的简单验证
如图,设计了2台路由器与2台PC。PC1与R1处于192.168.1.0/24网段,R1与R2处于10.1.12.0/24网段,R2与PC2处于192.168.2.0/24网段。
我们不在R1或R2上配置路由,只保留了直连路由。
1 | [R1]display ip routing-table |
很明显,因为R1缺少到192.168.2.0网段的路由,无法访问PC2。
1 | [R1]ping 192.168.2.2 |
R2一样缺少路由,访问不了PC1,这边就不展示了。
现在我们分别在R1与R2上配置本地策略路由。
1 | #创建高级ACL,编号3001,用于匹配目标地址为192.168.2.0/24网段的数据报文 |
可以发现,即使路由表没有路由信息,配置了本地策略路由,也能实现数据报文的转发,证明了策略路由的本质就是路由!
另外,我们也在R2上配置一下吧,这次我们使用另一种匹配条件。
1 | #创建名为to1的本地策略路由,使用报文长度作为匹配条件(设置为0到1500字节),匹配成功后的动作为转发给10.1.12.1 |
理论上,现在我们实现了全网互通(虽然是使用了策略路由),那么现在让我们试试PC1是否能范围PC2。
1 | PC>ping 192.168.2.2 |
很遗憾,不行。
原因很简单,因为我们配置的是本地策略路由,只针对路由器本身发出的报文有效,对于来自PC的报文无效。
现在就让我们在R1、R2上配置接口策略以实现全网互通吧。
接口策略的简单验证
由于前面给R1配置过匹配到达192.168.2.0/24的ACL规则了,所以我们直接进行如下配置
1 | #创建名为to2的流分类,通过acl3001进行判断匹配。 |
配置完以上命令,PC1已经可以通向PC2了,在PC2上能够抓到PC1的报文。
但由于还未在R2进行接口策略路由的配置,PC2回给PC1的报文,PC1无法收到,因此表现为ping不通(超时)。
现在我们也为R2配置一下吧。(依旧是换换口味熟悉命令)
1 | #创建名为from2的流分类,匹配ipv4报文 |
现在PC1就可以ping通PC2了
1 | PC>ping 192.168.2.2 |
ensp模拟器中似乎不支持mac地址匹配与接口匹配,至少我原本打算使用这两种进行测试的,却无法通网。
二次验证
我们在R1上将本地策略路由取消启用,会发现R1无法ping通PC2了。
但这不影响PC1经过R1去ping通PC2。
这再次说明了,本地策略路由只作用于路由器本身产生的数据报文,接口策略路由只作用于其他设备产生的数据报文(经过自身进行转发)。
此外,再次强调,本案例中并未配置动态路由或静态路由。本地路由表中仅存在直连路由。
策略路由本身就可以提供“路由”的作用。
1 | [R1]display ip routing-table |
但一般来说,很少需要去管路由器自己产生的报文,需求都是针对其他网络设备的。
所以实际说起策略路由都是说的接口策略路由。
另外,值得注意的是,本文是基于华为的设备命令与ensp模拟器编写的。
而在H3C中,并没有接口策略路由这个概念,直接使用policy-based-route就揽括了华为中本地策略路由与接口策略路由的工作。
事实上,华为中这套基于流策略的配置也实在繁琐,比如说需要起三次名字。