目录

简介

先决条件

要求

使用的组件

背景信息

命令语法

示例

数据包流

相关信息

简介

本文档介绍到Null接口的静态路由如何防止路由环路。

先决条件

要求

本文档没有任何特定的前提条件。

使用的组件

本文档中的信息基于以下软件和硬件版本：

- Cisco IOS® 软件版本 12.3。

本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始（默认）配置。如果您的网络处于活动状态，请确保您了解所有命令的潜在影响。

背景信息

空接口通常用于防止路由环路。例如，增强型内部网关路由协议(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连接到由路由器BB-R3代表的主干ISP。路由器BB-R3向ISP-R1发送默认路由，并通过BGP从ISP-R1接收网络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的汇总静态路由是不可行的。例如，如果在上一个示例中：

- 192.168.1.0/24 地址块被连接到另一个路由器上，该路由器通过 ISDN 拨入 cust-R2

- ISP-R1 不分配 192.168.0.0/16，只分配 192.168.1.0/24

- 此时出现 ISDN 链路断开的情况

注意：其结果是，那些试图到达此 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 链路变为活动状态为止。

相关信息

- 思科技术支持和下载