本篇藉由實作去了解uRPF要如何設定,以及實際的運作情形。
Strict跟Loose的共同點是會去查來源端IP是否可經由Routing Table到達,而Strict是多上一個條件:要從來源端的介面去到達。
甚麼時候要用Strict?甚麼時候要用Loose?取決於介面所在的位置。
內部的網路環境都是封閉且已知的,就可以使用Strict。如L2到L3。
如果是開放的且已知路由,收到的封包已經轉了好幾手,就可以設定Loose。如L3到L3。
allow-default適用會用到default route的介面。如L3到ISP。如果內部網路不連外,就不用下這個選項。
設定

R1為目的端,R2跟R3為ISP,R4是攻擊端或是ISP2。
!R1
conf t
int g0/0
ip addr 12.1.2.1 255.255.255.0
no sh
exit
ip route 0.0.0.0 0.0.0.0 12.1.2.2
!R2
conf t
int loopback 1
ip addr 2.2.2.2 255.255.255.255
ip ospf 1 a 0
exit
int g0/0
ip addr 12.1.2.2 255.255.255.0
no sh
ip ospf 1 a 0
int g1/0
ip addr 23.2.3.2 255.255.255.0
no sh
ip ospf 1 a 0
exit
router ospf 1
exit
ip route 0.0.0.0 0.0.0.0 23.2.3.3
!R3
conf t
int loopback 1
ip addr 3.3.3.3 255.255.255.255
ip ospf 1 a 0
int g0/0
ip addr 23.2.3.3 255.255.255.0
no sh
ip ospf 1 a 0
int g1/0
ip addr 34.3.4.3 255.255.255.0
no sh
ip ospf 1 a 0
exit
router ospf 1
exit
ip route 0.0.0.0 0.0.0.0 34.3.4.4
!R4
conf t
int loopback 1
description Fake_WAN
ip addr 99.99.99.99 255.255.255.255
int loopback 2
description Fake_R2
ip addr 2.2.2.2 255.255.255.255
int loopback 3
description Fake_R2
ip addr 12.1.2.2 255.255.255.255
int g0/0
ip addr 34.3.4.4 255.255.255.0
no sh
exit
ip route 0.0.0.0 0.0.0.0 34.3.4.3
首先要在R1打開debug,方便觀察。
debug ip icmp
接著先在R4用正常ping到R1
R4#ping 12.1.2.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 12.1.2.1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/3/4 ms
觀察R1
R1#
*Feb 2 05:58:28.667: ICMP: echo reply sent, src 12.1.2.1, dst 34.3.4.4
可以看到R1有收到ICMP並且成功回覆。
接著用R4的Loopback 1(99.99.99.99)去ping到R1。
R4#ping 12.1.2.1 source loopback 1
R1#
*Feb 2 06:01:22.507: ICMP: echo reply sent, src 12.1.2.1, dst 99.99.99.99
*Feb 2 06:01:22.527: ICMP: dst (12.1.2.1) host unreachable rcv from 12.1.2.2
99.99.99.99並不在R2的RoutingTable裡,不過還是把ICMP傳到R1去了。這是因為轉送時只檢查目的端在不在RoutingTable,這一點,可以被利用去做網路攻擊。
先檢查R2的G1/0是否有啟用 uRPF ,如果沒有就啟用。
R2#show cef interface g1/0
...
IP unicast RPF check is disabled
在R2的G1/0下指令,將uRPF啟用,由於G1/0是連接L3跟L3,所以使用Loose模式。
ip verify unicast source reachable-via any
any為Loose。rx為Strict。
回頭用R4的Loopback 1(99.99.99.99)去ping到R1,發現R1已經沒有任何log跳出來。
這次改用R4的Loopback 2(2.2.2.2)去ping到R3的Loopback,先在R3打開debug並且用loose的uRPF檢查。
R3#debug ip icmp
ICMP packet debugging is on
R3#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R3(config)#int g1/0
R3(config-if)#ip verify unicast source reachable-via any
2.2.2.2是R2的,現在被R4給冒用,如果在R3的G1/0下Loose模式,會因為在RouteTable中找得到,所以冒用IP的ICMP會被轉送。
現在改下Strict,再PING,由於冒充R2的ICMP來自不是2.2.2.2所屬網段的介面,故直接被drop,R3連log都不會跳出來。
R3(config-if)#ip verify unicast source reachable-via rx
最後一個指令:allow-default。
其實R4的Loopback 1也可以當成是外部合法的IP,但因為Default Route不會被RPF作為檢查,所以在半途就RPF檢查給drop。
Default Route是連接網際網路很重要的Route,如果不能正常轉送,就會不能正常上網。
這次要讓R4的Loopback1(99.99.99.99)跟R1能通,因此要在R2跟R3啟用allow-default。
R2(config)#int g1/0
R2(config-if)#ip verify unicast source reachable-via any allow-default
R3(config)#int g1/0
R3(config-if)#ip verify unicast source reachable-via rx allow-default
結果
R4#ping 12.1.2.1 source loopback 1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 12.1.2.1, timeout is 2 seconds:
Packet sent with a source address of 99.99.99.99
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 12/49/64 ms
結論心得
RPF檢查是很實用的防禦手段,可以盡早阻擋住冒用IP的攻擊。反向檢查也有一點防火牆的味道。
不過想一想,萬一這個沒有下好,就會變成大災難,因此要先很瞭解之後,才建議使用。
為了想出一套清楚的講說跟實際應用,花了不少時間在這之上。能夠想清楚,也是算是有收穫的。