uRPF (Unicast Reverse Path Forwarding) Nedir

Merhabalar,
Bu yazimda sizlere DOS/DDOS ve spoofing ataklarindan korumanin ilk adimlarindan biri olarak sayabilecegimiz uRPF yani Unicast Revers Path Forwarding ten bahsedecegim. Normal mutlu bir günde routerimiz bir IP paketi aldigi zaman sordugu tek soru “Gelen IP paketinin hedef IP si nedir?” olur ve bu sorunun cevabina göre routing tablosuna bakacak ve hedef IP ye ulasmak için uygun interface yada next-hop adresine gerekli yönlendirmeyi yapacaktir. Dolayisiyla yönlendirme yaparken IP paketinin kaynak IP sini yönlendirme sürecine katmayacaktir.
Böyle bir durumda kötü niyetli bir sahis IP paketlerinin kaynak IP sini degistirerek spoofing ataklari gerçeklestirebilir. Kali Linux üzerinden kolaylikla ulasilabilen “hping3” toolu kullanilarak source IP degistirebilir(bizim konumuz için önemli olan kisim burasi) ve paket içerisindeki neredeyse bütün headerlari manipüle edebilir duruma gelebiliyorsunuz. Tam da bu noktada bir güvenlik özelligi olan uRPF yani Unicast Reverse Path Forwarding kavrami devreye giriyor.
uRPF spoofing ataklarini engelleyen bir feature dir. uRPF i aktifledikten sonra routera bir IP paketi geldigi zaman artik yalnizca hedef IP ye bakip yönlendirme yapmaz. Ilk olarak gelen paketin kaynak IP headerindaki IP nin routing tablosundaki herhangi bir satira eslesip eslesmedigini kontrol eder ve eslesme bulamaz ise gelen paket droplanir. uRPF’in iki modu vardir.
? Strict mode (Siki Mod)
? Loose mode (Gevsek Mod)

Strict Mode (Siki Mod)

Strict mode da routerin artik belirlenen interface üzerinden gelen her paket için bakacagi iki sey(double check) vardir:
> Kaynak IP routing tablomda herhangi bir satira eslesme sagliyor mu ?
> Paketin geldigi interface ile kaynak IP ye ulasmak için kullandigim interface ayni mi ?
Paket bu iki sarti saglar ise yönlendirmesi yapilir aksi takdirde paket router tarafindan düsürülür. Bu durum IGP protokolleri ile uyum saglar çünkü IGP protokolleri hedefe giden en kisa yolu baz alirlar dolayisyla kaynak ip ye ulasmak için kullanacaginiz interface ile paketin routera ulastigi interface ayni olacaktir.

uRPF1

Yukaridaki çizimde görüldügü üzere routerimizin routing tablosunda 1.1.1.1/32 networküne ulasmak için Fa0/0 interface ini kullanacaktir. Böyle bir durumda kaynak IPsi 1.1.1.1 olan paket routing tablosunda Fa0/0 interface i üzerinden ulasilabilir olarak göründügü için Fa0/0 a gelen paket router tarafindan kabul edilir fakat Fa0/1 üzerinden gelen paketin source IP sine ulasamadigi için Fa0/1 interface inden gelen paket droplanir.
Konfigürasyon kismi için asagidaki topoloji üzerinden devam edecegim.

urpf2

Öncelikle interfacelerimize gerekli IPleri atadiktan sonra, R1 in 1.1.1.1 ip sine ulasabilmesi için statik rota yaziyoruz.

R1(config)#ip route 1.1.1.1 255.255.255.255 192.168.1.2

Statik rotayi yazdiktan sonra routing tablomuz asagidaki gibi olacaktir.

R1#show ip route
     1.0.0.0/32 is subnetted, 1 subnets
S       1.1.1.1 [1/0] via 192.168.1.2
     192.168.1.0/30 is subnetted, 1 subnets
C       192.168.1.0 is directly connected, FastEthernet0/0
     192.168.2.0/30 is subnetted, 1 subnets
C       192.168.2.0 is directly connected, FastEthernet0/1

uRPF strict mode olarak R1 in iki interfaceini de konfigüre ediyoruz. Interface üzerinde RPF in aktif olup olmadigini “show cef interface FastEthernet 0/0 | include RPF” komutunu kullanarak ögrenebiliriz.

R1(config-if)#int fa 0/0
R1(config-if)#ip verify unicast source reachable-via rx
R1(config-if)#exi
R1(config-if)#int fa 0/1
R1(config-if)#ip verify unicast source reachable-via rx
R1(config-if)#exi
R1#sh cef interface fastEthernet 0/0 | i RPF
  IP unicast RPF check is enabled
R1#sh cef interface fastEthernet 0/1 | i RPF
  IP unicast RPF check is enabled

RPF check i aktif ettikten sonra, test için 1.1.1.1/32 den 192.168.1.1 e ping atiyoruz.

R2#ping 192.168.1.1 source lo0
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.1.1, timeout is 2 seconds:
Packet sent with a source address of 1.1.1.1
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 8/15/24 ms

Simdi R3 için de ayni loopback adresini olusturup ping atmayi deneyelim.

R3(config)#interface loopback 0
R3(config-if)#ip address 1.1.1.1 255.255.255.255
R3(config-if)#exi
R3#ping 192.168.2.1 source loopback 0

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.2.1, timeout is 2 seconds:
Packet sent with a source address of 1.1.1.1
.....
Success rate is 0 percent (0/5)
R3#

Paketler R1 e ulasacak fakat droplanacaktir. Paketlerin drop olup olmadigini görmek için asagidaki komutlari R1 üzerinde isletiyoruz. “show ip interface %interface% | i drops” komutu ile interface üzerinden gelen ve drop edilen paketleri gösterir. “show ip traffic | s Drop” komutu ile router üzerinde totalde drop edilen paket sayisini görebilirsiniz.

R1#show ip interface fastEthernet 0/0 | include drops
  0 verification drops  ----->Droplanan paket yok
  0 suppressed verification drops
R1#show ip interface fastEthernet 0/1 | include drops
  5 verification drops   -----> Droplanan pingler
  0 suppressed verification drops
R1#show ip traffic | section Drop
  Drop:  0 encapsulation failed, 0 unresolved, 0 no adjacency
         0 no route, 5 unicast RPF, 0 forced drop
         0 options denied
  Drop:  0 packets with source IP address zero
  Drop:  0 packets with internal loop back IP address
         0 physical broadcast

uRPF strict mode un konfigürasyonu bu sekilde. Loose mode üzerinden devam edelim.

Loose Mode (GevsekMod)

uRPF3

Bu modda ise yine strict mode dan farkli olarak kontrol edilmesi gereken yalnizca tek bir soru vardir. Loose modeda router bir interface i üzerinden bir paket aldigi zaman soracagi uRPF kontrolü için soracagi tek soru(single check).
> Kaynak IP routing tablomda herhangi bir satira eslesme sagliyor mu ?
olacaktir. Paket kabul edildikten sonra kaynak IP ye giden interface ile paketin geldigi interfacein ayni olmasi sarti aranmaz. Adi üzerinde biraz gevsek :). uRPF in loose mode u birden fazla ISP baglantinizin oldugu ve asimetrik routing durumu içeren senaryolarda biçilmis kaftan diyebiliriz.

Loose mode u konfigüre ederken strictten farkli olarak interface altinda yazdigimiz “rx” yerine “any” parametresi gelir.

R1(config-if)#int fa 0/0
R1(config-if)#ip verify unicast source reachable-via any
R1(config-if)#int fa 0/1
R1(config-if)#ip verify unicast source reachable-via any

Yukardaki yaptigim konfigürasyona ek olarak, strict mode yada loose mode farketmeksizin, eger istenilirse bir access-list kullanilarak uRPF check yapilacak ve yapilmayacak trafik üzerinde manipülasyon yapilabilir. Extended acl kullanmak gerekmektedir ve malesef named acl kullanamiyoruz.

R1#show run | i access-list 151
access-list 151 deny ip 192.168.0.0 0.0.255.255 any
access-list 151 deny ip 10.0.0.0 0.0.255.255 any
access-list 151 permit ip any any log

Bu access-listleri interfacein altinda yazdigimiz komutun sonuna ekleyerek uygulayabiliyoruz. ACL de deny edilmis olan satirlar uRPF check kontrolünden geçmezler permit edilenlere uRPF check prosedürü uygulanir ve uygunluga göre yönlendirme yapilir.

ip verify unicast source reachable-via rx 151  ----> strict mode ACL ile birlikte
ip verif  unicast source reachable-via any 151 ----> loose mode ACL ile birlikte

Sonuca gelecek olursak uRPF kullanmanin yarari var mi diye soracak olursaniz, duruma bagli diyebilirim. Strict mode ISP lerin PE routerlarinda sonlanan ve routing islemi statik olarak yapilmis müsteri baglantilarinda kullanmak için uygun gibi duruyor. Bu müsterilerin çogunda güvenlik açiklarinin muhtemel olmasi ve botnet ataklarina daha açik olmasi durumu bu sekilde engellenebilir. ISP – ISP baglantilarinda strict mode kullanilamaz. Loose mode ise IPv6 dünyasinda daha mantikli bir kullanima sahip. IPv4 için olan versiyonu v6 ya göre daha yetersiz kalmaktadir.
uRPF le ilgili yazim bu kadar. Konuyla ilgili olarak sormak istediginiz ya da yanlis görüp uyarmak istediginiz bir yer olursa lütfen bizimle iletisime geçin. Yazimi okudugunuz için simdiden tesekkürler. Esenlikle kalin.

Hüseyin Çapan

huseyin.capan@netoburus.com
Network Mühendisi – Netoburus Team