uRPF – Strict與Loose

本篇藉由實作去了解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的攻擊。反向檢查也有一點防火牆的味道。

不過想一想,萬一這個沒有下好,就會變成大災難,因此要先很瞭解之後,才建議使用。

為了想出一套清楚的講說跟實際應用,花了不少時間在這之上。能夠想清楚,也是算是有收穫的。