簡介
本文檔介紹到Null介面的靜態路由如何防止路由環路。
必要條件
需求
本文件沒有特定先決條件。
採用元件
本檔案中的資訊是根據軟體和硬體版本:
本文中的資訊是根據特定實驗室環境內的裝置所建立。文中使用到的所有裝置皆從已清除(預設)的組態來啟動。如果您的網路運作中,請確保您瞭解任何指令可能造成的影響。
慣例
如需文件慣例的詳細資訊,請參閱思科技術提示慣例。
背景資訊
空介面通常用於防止路由環路。例如,增強型內部網關路由協定(EIGRP)在總結一組路由時始終建立通向Null0介面的路由。每當路由協定總結時,它都表示路由器可以接收該總結中任何IP地址的流量。由於並非所有IP地址都始終處於使用狀態,因此如果接收彙總流量的路由器上使用預設路由,則存在轉發資料包的風險。
指令語法
指向Null0的靜態路由是正常的靜態路由,不同之處在於它指向Null0介面,該介面是虛擬Cisco IOS介面。有關ip route 命令的詳細資訊,請參閱: IP Routing Protocol-Independent Commands 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傳送預設路由,並從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地址塊內的IP地址傳送單個ICMP請求,該地址塊在cust-R2上未使用。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。由於以下路由,同一資料包在serial0/0介面上回到ISP-R1,並立即從同一介面傳送到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請求針對在cust-R2上直接連線的192.168.1.x,則不會發生環路:
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鏈路變為活動狀態。
相關資訊