简介
本文档介绍到Null接口的静态路由如何防止路由环路。
先决条件
要求
本文档没有任何特定的前提条件。
使用的组件
本文档中的信息基于以下软件和硬件版本:
本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您的网络处于活动状态,请确保您了解所有命令的潜在影响。
规则
有关文档规则的详细信息,请参阅 Cisco 技术提示规则。
背景信息
Null 接口通常用于防止路由环路。例如,增强型内部网关路由协议 (EIGRP) 总是在汇总一组路由时创建一个通往 Null0 接口的路由。每当路由协议进行总结时,它就意味着路由器可以接收该总结中任何IP地址的流量。由于并非所有 IP 地址都在使用中,所以如果收到汇总流量的路由器使用默认路由,就可能造成数据包循环。
命令语法
指向Null0的静态路由是正常的静态路由,不同之处在于它指向Null0接口,该接口是虚拟Cisco IOS接口。有关ip route命令的详细信息,请参阅独立于IP路由协议的命令A至R一章的ip route部分。下一节举例说明如何使用ip route命令创建到Null0的静态路由。
示例
需要向Null0添加静态路由的常见场景是接入服务器,该接入服务器有许多客户端拨入。这种情况会导致主机路由被安装到接入服务器的路由表中。为确保客户端的可达性,同时又不至于造成整个网络充斥着主机路由,网络中的其他路由器通常会有指向接入服务器的汇总路由。在此类配置中,接入服务器必须具有指向接入服务器Null0接口同一汇总路由。如果不是,则当外部主机尝试访问当前未分配给客户端所拨的IP地址(但属于汇总路由的一部分)时,可能出现路由环路。这是因为接入服务器由于缺少通往目标的主机路由,而通过接入服务器的默认路由将数据包反弹回核心网络。
请考虑以下示例:
网络拓扑
小型ISP(ISP-R1)为其中一个用户分配了网络块192.168.0.0/16。在本示例中,用户将192.168.0.0/16划分为/24网络,目前仅使用192.168.1.0/24和192.168.2.0/24。在路由器ISP-R1上,ISP为192.168.0.0/16配置通往用户路由器(cust-R2)的静态路由。然后 ISP 连接到骨干网 ISP,后者用路由器 BB-R3 表示。路由器 BB-R3 向 ISP-R1 发送默认路由,并通过 ISP-R1 的 BGP 接收网络 192.168.0.0/16。
现在可保证从Internet(主干ISP路由器BB-R3)到用户路由器cust-R2的可达性,因为cust-R2已配置默认路由以指向ISP-R1。然而,如果数据包被发往 192.168.0.0/16 范围以外的尚未使用的网络地址块,则 cust-R2 路由器会使用指向 ISP-R1 的默认路由来转发那些数据包。然后,数据包在 ISP-R1 和 cust-R2 之间形成环路,直到 TTL 超时。这会对路由器的 CPU 和链路利用率造成巨大的影响。例如,流向未使用IP地址的流量可能来自拒绝服务攻击、扫描IP块以查找易受攻击的主机等。
相关配置:
cust-R2 |
version 12.3
!
hostname cust-R2
!
ip subnet-zero
!
interface Loopback0
ip address 10.2.2.2 255.255.255.255
!
interface Ethernet0/0
ip address 192.168.1.1 255.255.255.0
!
interface Ethernet1/0
ip address 192.168.2.1 255.255.255.0
!
interface Serial2/0
ip address 10.0.0.2 255.255.255.252
!--- This interface leads to ISP-R1.
!
ip classless
ip route 0.0.0.0 0.0.0.0 10.0.0.1
!--- Default route going to ISP-R1.
!
end |
ISP-R1 |
version 12.3
!
hostname ISP-R1
!
ip subnet-zero
!
interface Loopback0
ip address 10.1.1.1 255.255.255.255
!
interface Serial0/0
ip address 10.0.0.1 255.255.255.252
!--- Interface to cust-R2.
!
interface Serial1/0
ip unnumbered Loopback0
!--- Interface going to BB-R3.
!
router bgp 65501
no synchronization
network 192.168.0.0 mask 255.255.0.0
!--- ISP-R1 injects 192.168.0.0/16 into BGP to !--- advertise it to BB-R3.
neighbor 10.3.3.3 remote-as 65503
neighbor 10.3.3.3 ebgp-multihop 255
no auto-summary
!
ip classless
ip route 10.3.3.3 255.255.255.255 Serial1/0
ip route 192.168.0.0 255.255.0.0 Serial0/0
!--- The first route is necessary for the eBGP !--- session to BB-R3 to come up.
!--- The route to 192.168.0.0/16 points towards cust-R2.
!
!
end |
BB-R3 |
version 12.3
!
hostname BB-R3
!
ip subnet-zero
!
!
interface Loopback0
ip address 10.3.3.3 255.255.255.255
!
interface Serial2/0
ip unnumbered Loopback0
!--- This interface goes to ISP-R1.
!
router bgp 65503
no synchronization
bgp log-neighbor-changes
neighbor 10.1.1.1 remote-as 65501
neighbor 10.1.1.1 ebgp-multihop 255
neighbor 10.1.1.1 default-originate
!--- BB-R3 injects a default route into BGP and !--- sends it to ISP-R1.
no auto-summary
!
ip classless
ip route 10.1.1.1 255.255.255.255 Serial2/0
!--- This route points to ISP-R1 and is !--- used to establish the eBGP peering.
!
end |
数据包流
注意:在路由器上启用了debug命令以更好地说明数据包流,特别是debug ip packet和debug ip icmp。除非已经充分了解后果,否则切勿在生产环境中启用这些命令。
BB-R3#ping ip 192.168.20.1 repeat 1
Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 192.168.20.1, timeout is 2 seconds:
*Oct 6 09:36:45.355: IP: tableid=0, s=10.3.3.3 (local), d=192.168.20.1 (Serial2/0), routed via FIB
*Oct 6 09:36:45.355: IP: s=10.3.3.3 (local), d=192.168.20.1 (Serial2/0), len 100, sending.
Success rate is 0 percent (0/1)
BB-R3#
*Oct 6 09:36:50.943: ICMP: time exceeded rcvd from 10.0.0.1
BB-R3 向一个位于 192.168.0.0/16 地址块内但又未在 cust-R2 上使用的 IP 地址发送单个 ICMP 请求。BB-R3 收到从 ISP-R1 返回的 ICMP 超时。
在 ISP-R1 上:
18:50:22: IP: tableid=0, s=10.3.3.3 (Serial1/0), d=192.168.20.1 (Serial0/0), routed via RIB
18:50:22: IP: s=10.3.3.3 (Serial1/0), d=192.168.20.1 (Serial0/0), g=192.168.20.1, len 100, forward
18:50:22: IP: tableid=0, s=10.3.3.3 (Serial0/0), d=192.168.20.1 (Serial0/0), routed via RIB
18:50:22: IP: s=10.3.3.3 (Serial0/0), d=192.168.20.1 (Serial0/0), g=192.168.20.1, len 100, forward
18:50:22: IP: tableid=0, s=10.3.3.3 (Serial0/0), d=192.168.20.1 (Serial0/0), routed via RIB
18:50:22: IP: s=10.3.3.3 (Serial0/0), d=192.168.20.1 (Serial0/0), g=192.168.20.1, len 100, forward
18:50:22: IP: tableid=0, s=10.3.3.3 (Serial0/0), d=192.168.20.1 (Serial0/0), routed via RIB
初始数据包在ISP-R1的serial1/0接口上从BB-R3接收,然后按预期转发到serial0/0接口的cust-R2。由于以下路由,同一数据包返回到 ISP-R1 的 serial0/0 上,并立即通过同一接口发送到 cust-R2。
ISP-R1#show ip route 192.168.20.1
Routing entry for 192.168.0.0/16, supernet
Known via "static", distance 1, metric 0 (connected)
Advertised by bgp 65501
Routing Descriptor Blocks:
* directly connected, via Serial0/0
Route metric is 0, traffic share count is 1
是什么导致 cust-R2 把流量发送回 ISP-R1 呢?
在 cust-R2 上:
*Oct 6 09:41:43.495: IP: s=10.3.3.3 (Serial2/0), d=192.168.20.1 (Serial2/0), g=10.0.0.1, len 100, forward
*Oct 6 09:41:43.515: IP: tableid=0, s=10.3.3.3 (Serial2/0), d=192.168.20.1 (Serial2/0), routed via RIB
*Oct 6 09:41:43.515: IP: s=10.3.3.3 (Serial2/0), d=192.168.20.1 (Serial2/0), g=10.0.0.1, len 100, forward
*Oct 6 09:41:43.555: IP: tableid=0, s=10.3.3.3 (Serial2/0), d=192.168.20.1 (Serial2/0), routed via RIB
您可以看到,由于以下路由,cust-R2将这些数据包发送回ISP-R1:
cust-R2#show ip route 192.168.20.1 longer-prefixes
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route
Gateway of last resort is 10.0.0.1 to network 0.0.0.0
cust-R2#
路由器cust-R2没有通往192.168.20.1的路由,因为该网络在用户网络中未使用,因此通往192.168.20.1的最佳路由是指向ISP-R1的默认路由。
结果是,数据包在 ISP-R1 和 cust-R2 之间循环,直到 TTL 超时。
如果ICMP请求发送到正在使用的网络中的IP地址,则不会出现此结果。例如,如果 ICMP 请求的是 192.168.1.x,而该地址直接连接到 cust-R2,则不会出现环路:
cust-R2#show ip route 192.168.1.1
Routing entry for 192.168.1.0/24
Known via "connected", distance 0, metric 0 (connected, via interface)
Routing Descriptor Blocks:
* directly connected, via Ethernet0/0
Route metric is 0, traffic share count is 1
此问题的解决方案是,在 cust-R2 上为 192.168.0.0/16 配置指向 Null0 的静态路由。
cust-R2#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
cust-R2(config)#ip route 192.168.0.0 255.255.0.0 Null0
cust-R2(config)#end
cust-R2#
*Oct 6 09:53:18.015: %SYS-5-CONFIG_I: Configured from console by console
cust-R2#show ip route 192.168.20.1
Routing entry for 192.168.0.0/16, supernet
Known via "static", distance 1, metric 0 (connected)
Routing Descriptor Blocks:
* directly connected, via Null0
Route metric is 0, traffic share count is 1
如果您现在将来自BB-R3的ICMP请求重新发送到192.168.20.1,cust-R2会将此流量发送到Null0,这会触发生成ICMP不可达。
BB-R3#ping ip 192.168.20.1 repeat 1
Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 192.168.20.1, timeout is 2 seconds:
U
Success rate is 0 percent (0/1)
BB-R3#
*Oct 6 09:54:33.051: ICMP: dst (10.3.3.3) host unreachable rcv from 10.0.0.2
有时候,使用指向Null0的汇总静态路由是不可行的。例如,如果在上一个示例中:
注意:结果是传输中的数据包或尝试到达此IP地址块的应用程序会创建与前面所述相同的路由环路。
注:要解决此路由环路,必须使用ip route 192.168.1.0 255.255.255.0 Null0 200命令为192.168.1.0/24配置到Null0的浮动静态路由。此命令中的 200 是管理距离。有关详细信息,请参阅什么是管理距离?。
注意:由于我们使用的管理距离比任何路由协议都高,因此如果通过ISDN链路到达192.168.1.0/24的路由变为非活动状态,cust-R2将安装浮动静态路由。随后,数据包将被发送到 Null0,直到 ISDN 链路变为活动状态为止。
相关信息