jueves, 30 de julio de 2009

Chequeo del origen de paquetes IP

Posted by Nicolas | jueves, 30 de julio de 2009 | Category: , , , , , |

A continuación se mostrarán el funcionamiento de uRPF (RFC 3704), el cual Cisco describe en
Understanding Unicast Reverse Path Forwarding y su configuración es detallada en Configuring Unicast Reverse Path Forwarding.

Este mecanismo corresponde a una sencilla herramienta de seguridad que chequea el origen de los paquetes IP, permitiendo descartarlos si por ejemplo el origen no es visible a nivel de la tabla de ruteo por la interface por donde se recibió el paquete, protegiendo la red de ataques que son fácilmente generables como describe Jeremy Stretch en Using uRPF at the access layer to deter DDoS attacks. Otra buena lectura es el RFC 2827; Defeating Denial of Service Attacks which employ IP Source Address Spoofing.

Se utilizará la maqueta de la figura considerando que en primera instancia el link entre R4-R5 estará configurado con la subnet 10.0.0.8/30 para luego pasar a 172.16.0.8/30. Se utilizará EIGRP como protocolo de ruteo.


La prueba piloto será generar dos pings a la Loopback de R3 desde R5 seteando el origen de los paquetes en la subnet 10.0.0.8/30.

R5#ping 10.3.3.3 source 10.0.0.10 repeat 2

Type escape sequence to abort.
Sending 2, 100-byte ICMP Echos to 10.3.3.3, timeout is 2 seconds:
Packet sent with a source address of 10.0.0.10
!!
Success rate is 100 percent (2/2), round-trip min/avg/max = 32/84/136 ms
R5#

En un comienzo, R3 ve la subnet 10.0.0.8/30 a través de su interface FastEthernet que lo conecta a R5.

R3#sh ip rou 10.0.0.8
Routing entry for 10.0.0.8/30
Known via "eigrp 1", distance 90, metric 2172416, type internal
Redistributing via eigrp 1
Last update from 10.0.0.6 on FastEthernet2/0, 00:14:39 ago
Routing Descriptor Blocks:
* 10.0.0.6, from 10.0.0.6, 00:14:39 ago, via FastEthernet2/0
Route metric is 2172416, traffic share count is 1
Total delay is 20100 microseconds, minimum bandwidth is 1544 Kbit
Reliability 255/255, minimum MTU 1500 bytes
Loading 1/255, Hops 1

R3#

Se modifica el delay en la Serial0/0 de R5 de 20000 µS a 50000 µS (ojo con las unidades, ver EIGRP, MTU y métrica) de modo de incidir en la métrica de EIGRP y así R3 vea la subnet por R2.

R5#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R5(config)#int s0/0
R5(config-if)#delay 5000
R5(config-if)#

R3#sh ip rou 10.0.0.8
Routing entry for 10.0.0.8/30
Known via "eigrp 1", distance 90, metric 2684416, type internal
Redistributing via eigrp 1
Last update from 192.168.0.1 on Serial1/1, 00:00:02 ago
Routing Descriptor Blocks:
* 192.168.0.1, from 192.168.0.1, 00:00:02 ago, via Serial1/1
Route metric is 2684416, traffic share count is 1
Total delay is 40100 microseconds, minimum bandwidth is 1544 Kbit
Reliability 255/255, minimum MTU 1500 bytes
Loading 1/255, Hops 2

R3#

Se verifica la prueba piloto sea exitosa antes de comezar a probar uRPF.

R5#ping 10.3.3.3 source 10.0.0.10 repeat 2

Type escape sequence to abort.
Sending 2, 100-byte ICMP Echos to 10.3.3.3, timeout is 2 seconds:
Packet sent with a source address of 10.0.0.10
!!
Success rate is 100 percent (2/2), round-trip min/avg/max = 96/106/116 ms
R5#

Ahora se configura R3 con uRPF para chequear el origen de los paquetes que recibe en su interface FastEthernet2/0 en modo loose (ip verify unicast source reachable-via any), o sea que sólo chequea si el origen está presente en la tabla de ruteo.

R3#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R3(config)#int f2/0
R3(config-if)#ip verify unicast source reachable-via any
R3(config-if)#

A su vez se revisan las estadísticas de paquetes bloqueados con show ip traffic.

R3#sh ip traffic | i RPF
0 no route, 1 unicast RPF, 0 forced drop

Se realiza la prueba y se ve los paquetes son transmitidos sin inconvenientes.

R5#ping 10.3.3.3 source 10.0.0.10 repeat 2

Type escape sequence to abort.
Sending 2, 100-byte ICMP Echos to 10.3.3.3, timeout is 2 seconds:
Packet sent with a source address of 10.0.0.10
!!
Success rate is 100 percent (2/2), round-trip min/avg/max = 164/200/236 ms
R5#

Las respuestas se reciben efectivamente por la interface FastEthernet2/0 y las respuestas son redireccionadas por la interface Serial1/1, el chequeo a sido exitoso.

R3#
*Jul 29 13:22:36.923: IP: s=10.0.0.10 (FastEthernet2/0), d=10.3.3.3, len 100, input feature
*Jul 29 13:22:36.927: ICMP type=8, code=0, uRPF(33), rtype 0, forus FALSE, sendself FALSE, mtu 0
...
*Jul 29 13:22:36.959: IP: s=10.3.3.3 (local), d=10.0.0.10 (Serial1/1), len 100, sending
*Jul 29 13:22:36.963: ICMP type=0, code=0

Las estadísticas siguen intactas.

R3#sh ip traffic | i RPF
0 no route, 1 unicast RPF, 0 forced drop
R3#

Se pasa ahora a modo estricto (ip verify unicast source reachable-via rx), o sea que el origen se debe conocer necesariamente por la interface por donde se recibió el paquete.

R3#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R3(config)#int f2/0
R3(config-if)#ip verify unicast source reachable-via rx
R3(config-if)#

La prueba piloto.

R5#ping 10.3.3.3 source 10.0.0.10 repeat 2

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

Las estadísticas en R3 ayudan a concluir; 2 nuevos paquetes han sido denegados por uRPF.

R3#sh ip traffic | i RPF
0 no route, 3 unicast RPF, 0 forced drop
R3#

Un par de comandos que permiten verificar uRPF esté activo en una interface son tanto show ip interface como show cef interface (a todo esto CEF es requisito para configurar uRPF).

R3#sh ip int f2/0 | i verify
IP verify source reachable-via RX
R3#

R3#sh cef interface FastEthernet 2/0 | i RPF
IP unicast RPF check is enabled
Input features: uRPF
R3#

Pero, ¿Qué pasa si el router intenta hacer ping a la dirección IP que tiene configurada en su propia interface con uRPF?

R3#ping 10.0.0.5 r 2

Type escape sequence to abort.
Sending 2, 100-byte ICMP Echos to 10.0.0.5, timeout is 2 seconds:

..
Success rate is 0 percent (0/2)
R3#

Falla!, pese a que el paquete es originado con la misma IP de destino, éste no es recibido por la interface que la tabla de ruteo dicta (FastEthernet2/0). Para permitir esto se puede configurar la opción allow-self-ping.

R3#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R3(config)#int f2/0
R3(config-if)#ip verify unicast source reachable-via rx allow-self-ping
R3(config-if)#

R3#
R3#ping 10.0.0.5 r 2

Type escape sequence to abort.
Sending 2, 100-byte ICMP Echos to 10.0.0.5, timeout is 2 seconds:
!!
Success rate is 100 percent (2/2), round-trip min/avg/max = 44/68/92 ms
R3#

Con debug ip cef drops rpf se puede chequear el funcionamiento de uRPF.

R3#conf t       
Enter configuration commands, one per line. End with CNTL/Z.
R3(config)#access-list 1 permit any log
R3(config)#^Z
R3#
R3#debug ip cef drops rpf 1
IP CEF drops for RPF debugging is on for access list 1
R3#

Una opción extra que se ofrece para poder ampliar el número de redes con que un cliente puede originar sus paquetes es usar listas de acceso, que entrarán en juego sólo si el chequeo de uRPF falla, es decir NO son revisadas si la dirección IP de origen del paquete es conocido por la interface de origen. A continuación un ejemplo explicatorio utilizando listas de acceso (ACL).

R3#conf t   
Enter configuration commands, one per line. End with CNTL/Z.
R3(config)#access-list 105 permit tcp 10.0.0.8 0.0.0.3 host 10.3.3.3 eq 23
R3(config)#access-list 105 deny ip any any
R3(config)#
R3(config)#int f2/0
R3(config-if)#ip verify unicast source reachable-via rx 105

Básicamente dice que del tráfico que uRPF denegaría, se permitirá transmitir de todos modos algunos paquetes acorde a lo que dicte la ACL referenciada. En este caso es la 105, que deja pasar exclusivamente el tráfico de Telnet a la Loopback de R3 que sea originado desde una dirección IP del bloque 10.0.0.8/30. Se verá entonces cómo el ping falla, sin embargo Telnet no tiene inconvenientes.

R5#ping 10.3.3.3 source 10.0.0.10 repeat 2

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

R5#telnet 10.3.3.3 /source-interface Serial 0/0
Trying 10.3.3.3 ... Open


User Access Verification

Password:
R3>

A continuación se modifica el direccionamiente del link entre R4 y R5 para poder revisar más en detalle el modo loose de uRPF. R4 anunciará la nueva subnet, no así R5.

R4#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R4(config)#int s0/0
R4(config-if)#ip add 172.16.0.9 255.255.255.252
R4(config-if)#router eigrp 1
R4(config-router)#net 172.16.0.8 0.0.0.3
R4(config-router)#

R5#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R5(config)#int s0/0
R5(config-if)#ip add 172.16.0.10 255.255.255.252
R5(config-if)#

Se repite la prueba piloto, con la salvedad que el destino es la Loopback de R2 y que el origen del paquete es seteado a la nueva dirección IP de la interface Serial0/0. Primero se realiza sin chequeo uRPF.

R5#ping 10.2.2.2 source 172.16.0.10 repeat 2

Type escape sequence to abort.
Sending 2, 100-byte ICMP Echos to 10.2.2.2, timeout is 2 seconds:
Packet sent with a source address of 172.16.0.10
!!
Success rate is 100 percent (2/2), round-trip min/avg/max = 64/78/92 ms
R5#

La prueba es exitosa, se procede a configurar entonces uRPF en modo loose.

R3#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R3(config)#int f2/0
R3(config-if)#ip verify unicast source reachable-via any

Pero se verá el resultado es exitoso, básicamente por que la red está en la tabla de ruteo.

R5#ping 10.2.2.2 source 172.16.0.10 repeat 2

Type escape sequence to abort.
Sending 2, 100-byte ICMP Echos to 10.2.2.2, timeout is 2 seconds:
Packet sent with a source address of 172.16.0.10
!!
Success rate is 100 percent (2/2), round-trip min/avg/max = 76/112/148 ms
R5#

R3#sh ip rou 172.16.0.8
Routing entry for 172.16.0.8/30
Known via "eigrp 1", distance 90, metric 2684416, type internal
Redistributing via eigrp 1
Last update from 192.168.0.1 on Serial1/1, 00:04:34 ago
Routing Descriptor Blocks:
* 192.168.0.1, from 192.168.0.1, 00:04:34 ago, via Serial1/1
Route metric is 2684416, traffic share count is 1
Total delay is 40100 microseconds, minimum bandwidth is 1544 Kbit
Reliability 255/255, minimum MTU 1500 bytes
Loading 1/255, Hops 2

R3#

R5 no está anunciando la red a R3 pero sí a R4 el cual se la anuncia a R2 y éste a su vez a R3. Es de interes R2 sepa cómo alcanzar la subnet en cuestión, pero no así R3, por lo tanto se filtra en R2.

R2#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R2(config)#ip prefix-list R2toR3 deny 172.16.0.8/30
R2(config)#ip prefix-list R2toR3 permit 0.0.0.0/0 le 32
R2(config)#router eigrp 1
R2(config-router)#distribute-list prefix R2toR3 out Serial1/0
R2(config-router)#

Se revisa ahora la tabla de ruteo en R3

R3#sh ip rou 172.16.0.8
% Network not in table

Luego al repetir el test recién realizado se comprueba el modo de operación de uRPF en modo loose.

R5#ping 10.2.2.2 source 172.16.0.10 repeat 2

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

En caso que un router como R3 no tenga tabla completa de ruteo, si no más bien una ruta default puede utilizar la opción allow-default. Se configura la ruta default y se verá que el chequeo sigue fallando hasta que no se active la opción.

R3#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R3(config)#ip route 0.0.0.0 0.0.0.0 192.168.0.1
R3(config)#^Z
R3#

R5#ping 10.2.2.2 source 172.16.0.10 repeat 2

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

Por último se aplica el comando

R3#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R3(config)#int f2/0
R3(config-if)#ip verify unicast source reachable-via any allow-default
R3(config-if)#

..y se repite la prueba por última vez.

R5#ping 10.2.2.2 source 172.16.0.10 repeat 2

Type escape sequence to abort.
Sending 2, 100-byte ICMP Echos to 10.2.2.2, timeout is 2 seconds:
Packet sent with a source address of 172.16.0.10
!!
Success rate is 100 percent (2/2), round-trip min/avg/max = 92/102/112 ms
R5#

En total 2 comentarios:

  1. Excelente Nicolas!!
    Gracias!

  2. You're welcome, hope my blog get as good as yours is ;)


Leave a Reply