任何时间指向相同目标网络的路由都会被多台路由器重新分配到路由选择域,其中可能会存在错误的路由选择,在某些情况下,可能会发生路由选择环路和黑洞。被通告路由沿错误方向穿过重新分配路由器的现象叫做路由回馈(route feedback)。
路由过滤可以使网络管理员对路由通告施加严格的控制。任何时刻路由器从一种协议向另一种协议重新分配路由,管理员可以使用路由过滤控制哪些路由被重新分配,同样的,路由器执行相互重新分配,在两个或多个路由选择协议之间相互共享路由,使用路由器过滤器可以确保沿着唯一的方向通告路由。
路由过滤
如下给出了路由过滤器的另一种用途,在这里,一个路由选择域被分割成多个子域,连接两个子域的路由器将对路由进行过滤,以便子域 B 中的路由器仅知道子域 A 中的部分路由。
![](/fuchencong.github.io/2019/05/22/routing-tcp-ip-13/images/01.jpg)
此外,路由过滤器的另一个常见用途是建立路由防火墙,在互联路由器上使用路由过滤,将确保路由器仅接收合法的路由,这种方法是一种安全的形式。无论哪一种应用,路由过滤器都作为基本构建单元,被用于创建路由选择策略(routing policy)。路由选择策略是控制网络中数据包如何转发以及改变数据包缺省转发属性的一组规则。
外部的路由可以进入到路由表中,路由表中的路由也可以被通告出去,路由过滤器正是通过管制这些出入路由表的路由来工作的。路由过滤器对链路状态路由选择协议的影响和对距离矢量路由选择协议的影响有点不同:
- 运行距离矢量协议的路由器是基于自身路由表通告路由的,其结果是路由过滤器将会对路由器通告给其邻居路由器的路由产生影响
- 运行链路状态协议的路由器是基于自身链路状态数据库的信息来确定他们的路由,而不是基于被邻居路由器通告的路由条目。路由过滤器对链路状态的通告或链路状态数据库没有影响。所以路由过滤器会对配置了过滤器的路由器的路由表产生影响,但不会对邻居路由器的路由条目有任何影响。正因为这种特性,路由过滤器主要被用在进入链路状态域的重新分配节点上。例如 OSPF 的 ASBR(自主系统边界路由器),在那里路由过滤器可以控制那些进入或离开该域的路由。在链路状态域内,路由过滤器的作用是有限的。
配置路由过滤器
使用下面给出的任意一种方法都可以实现路由过滤:
- 使用命令 distribute-list 过滤特定路由
- 使用命令 distance 操作路由的管理距离
案例研究:过滤特定路由
如下网络运行 RIPv2 和 RIPng。Barkis 经 Traddles 提供了到网络其余部分的连接,除了 BigNet 内 700 个明确的 IPv4 路由之外,Traddles 还向 Barkis 通告了一条 IPv4 缺省路由。由于这条缺省路由,Barkis、Micawber、Peggotty 和 Heep 不需要知道 BigNet 中 700 条以外的路由。因此,在 Barkis 上配置过滤器的目的是从 Traddles 仅接收缺省路由,并拒绝其他所有路由。
![](/fuchencong.github.io/2019/05/22/routing-tcp-ip-13/images/02.jpg)
Barkis 的配置如下:
![](/fuchencong.github.io/2019/05/22/routing-tcp-ip-13/images/03.jpg)
该路由过滤器检查从 S1 入站的路由,指定 Barkis 的 RIP 进程仅接收那些被访问列表 1 许可的路由,而访问列表 1 仅允许 0.0.0.0。IPv6 的路由也可以按照相同的方法进行过滤,唯一的不同是,IPv4 的命令 distribute-list 参照访问列表,而 IPv6 则参照一个前缀列表(prefix-list)。
这里沿串行链路通告的 700 条路由在链路远端被全部丢弃,这对带宽而言是一种浪费,因此更好的配置方法是将过滤器放在 Traddles 上,仅允许向 Barkis 通告缺省路由。如下所示,配置 Traddle 过滤出站的 RIP IPv4 路由:
![](/fuchencong.github.io/2019/05/22/routing-tcp-ip-13/images/04.jpg)
![](/fuchencong.github.io/2019/05/22/routing-tcp-ip-13/images/05.jpg)
当在链路状态协议(例如 OSPF)下配置命令 distribute-list 时,关键字 out 不能与接口联合使用。因为不像距离矢量协议,链路状态协议不从自身的路由表中通告路由,没有更新信息被过滤。
案例研究:路由过滤和重新分配
路由器在任何时候执行相互重新分配时,路由回馈都可能会存在。如下所示,来自 RIP 方的路由会被重新分配到 OSPF,并且再从 OSPF 重新分配回到 RIP。
![](/fuchencong.github.io/2019/05/22/routing-tcp-ip-13/images/06.jpg)
因此,使用路由过滤器控制路由通告的方向是一种明智的方法,Cruncher 可以在几个接口上同时使用 RIP 和 OSPF,其配置示例如下:
![](/fuchencong.github.io/2019/05/22/routing-tcp-ip-13/images/07.jpg)
到 OSPF 域内目标网络的路由将不会从 RIP 向 OSPF 通告,同样到 RIP 域内目标网络的路由也不会从 OSPF 向 RIP 通告。
在重新分配点部署路由过滤的另一种方法是借助路由进程进行过滤,而不是接口。如下的配置仅允许重新分配某些 IPv4 路由:
![](/fuchencong.github.io/2019/05/22/routing-tcp-ip-13/images/08.jpg)
在 OSPF 配置下的路由过滤器允许 OSPF 通告 RIP 协议发现的路由,但是这些路由必须是访问列表 10 许可的路由。同样的,在 RIP 配置下的路由过滤器允许 RIP 通告 OSPF 25 发现的路由,但这些路由必须是访问列表 20 许可的路由。在这两种情况下,路由过滤器对其他协议发现的路由没有影响。
同样的配置也可以应用在 IPv6 前缀上,对于 RIPng 和 OSPFv3,分配列表会参照前缀列表,而不是访问列表,其中前缀列表被用来允许和禁止 IPv6 前缀,而不是 IPv4 地址。
当通过进程进行过滤时,仅允许使用关键字 out。在 OSPF 下使用 distribute-list 10 in rip 是没有意义的,因为路由已经通过 RIP 进入路由表了,OSPF 要么通告它(out),要么不通告。
虽然通过路由选择协议进行过滤对于指定那些将要被重新分配的路由是很有用处的,但是它并不是防止路由回馈的好办法。为了阻止路由回馈,必须在路由进入路由表之前,在路由入站时进行过滤。
案例研究:协议迁移
命令 distance 可以为路由指定管理距离,这些路由是从一个特殊的 IPv4 或 IPv6 路由协议那里学习到的。命令在使用时不带任何可选参数。在最初考虑时,该操作看上去不像路由过滤功能,但是当运行多个路由协议时就不同了,这时会基于路由的管理距离来确定是否接受或拒绝路由。
如下网络运行 RIP,并且计划将路由选择协议转换为 EIGRP。有几种方法可以完成这样的迁移。一种方法是在每一台路由器上关闭老的协议,然后打开新的协议。对于小型网络这种方法是合适的,但是对于更大的网络,这是不切实际的。另一种选择是不删除旧协议的同时添加新的协议。如果新协议的缺省管理距离小于旧协议,那么每台路由器将选择新协议通告的路由。随着路由器转换完毕,网络将收敛到的新的协议上。在整个网络收敛到新的协议之后,则可以从所有路由器上删除旧的协议。
![](/fuchencong.github.io/2019/05/22/routing-tcp-ip-13/images/09.jpg)
这种方法的问题是,在重新配置的时候可能会存在路由环路和黑洞,对这种双协议方法的改进是使用命令 distance,以确保禁止新协议的路由,一直到所有路由器为转换做好准备。虽然这种方法仍然可能产生环路和黑洞,但是因为仅需要修改管理距离,所以这种转换速度会更快,认为的错误也更小。这种方法的另一个优点是,万一出现问题可以很容易地停止切换工作。
在使用双协议方法之前需要考虑一件事情,即同时在每台路由器上运行两个协议可能会影响路由器的内存用量和处理速度。如果路由器不能胜任,那么在配置新协议之前需要更加复杂的过程来删除旧协议,这可能是唯一的选择。
使用双协议迁移到新的路由选择协议还需要注意一点的是:确认你已经理解两种协议的行为。例如,某些协议(例如 EIGRP)不会老化自身的路由条目。因此,如果要取代 EIGRP,需要额外增加的一步,就是在改变管理距离之后使用命令 clear ip route *
清除路由表。
案例研究:多个重新分配点
在多个重新分配点时,可能由于管理距离而导致路由器选择了不满意的路由,解决这个问题的一种方法是,在重新分配点使用命令 distribute-list 来控制路由源点。
使用这种配置方法的问题是,消除了多个重新分配点内在的冗余性。对 IPv4 来说,一种更好的方法是使用命令 distance 的两种形式来设置首选路由。
还有另一种在互相重新分配路由的路由选择协议之间帮助过滤地址的方法,就是路由标记(tag)。当路由被重新分配到某个路由选择协议时,这些路由标记可以被标记。标记是管理员设置的一个数字,可以唯一地标识重新分配到该路由器的一组路由集合。这个标记可以在另一台路由器上用于在重新分配会原来的路由选择协议时过滤掉这些路由。标记可以使用路由映射进行设置。
案例研究:使用管理距离设置路由器优先权
在上述网络中,假设策略规定把 Grimwig 作为到 OSPF 域的主路由器,仅当 Grimwig 不可达时才选择经过 Bumble 的路由。策略实施前,Monks 通过在 Grimwig 和 Bumble 之间执行等价负载均衡到达 OSPF 的网络。通过降低来自 Grimwig 的路由的管理距离,可以使得 Monks 优先选择 Grimwig,相应的配置如下:
![](/fuchencong.github.io/2019/05/22/routing-tcp-ip-13/images/10.jpg)
在这里,命令 distance 没有参考访问列表。所有 Grimwig(192.168.6.2)通告的路由的管理距离都被指定为 100。所有其他路由(来自 Bumble)都被指定为 RIP 的缺省管理距离 120。因此 Grimwig 的路由被优先选择。
总结
对控制网络的行为来说,路由过滤器是一个非常有用的工具。在大型网络中,路由过滤器几乎是不可缺少的。但是路由过滤器的所有效用仅限于允许或不接受路由。接下来将介绍另一个强大的工具:路由映射。路由映射不仅可以标识路由,还可以主动地修改路由。