Tablas de routing múltiples

ip nos permite trabajar con tablas de routing múltiples, una gran novedad en la gestión de tráfico IP. ¨De qué se trata ? Hasta ahora habíamos tenido, por cada sistema, una tabla de routing única, que define a qué interfaz esta conectada una red, donde se encuentra el gateway, etc ... Gracias a iproute, podemos trabajar con varias tablas de routing a la vez y elegir que tabla usar según las características del paquete IP.

Imaginemos por ejemplo que tenemos un router con dos interfaces de conexión a Internet. Una interfaz RDSI más lenta pero barata y una interfaz ADSL rápida, pero más cara. La ventaja es que se puede decidir, gracias a iproute, que interfaz será usada, según los paquetes que hay que mandar. Por ejemplo podemos decidir que los paquetes SMTP saldrán por la interfaz RDSI lenta (no hay prisa). A revés, si tenemos aplicaciones de videoconferencia, queremos que vayan por la interfaz ADSL rápida. En este caso, la política de routing se basa en el puerto de destino de los paquetes IP.

También podemos imaginar basar la política de routing sobre la dirección IP de origen de los paquetes. Sería el caso si queremos dar prioridad a determinados servicios de una empresa. Por ejemplo, la dirección de la empresa usará la conexión ADSL rápida, mientras el servicio de mecanografía vera su tráfico dirigido por la interfaz lenta.

En realidad, podemos basarnos en muchos parámetros para establecer nuestra política de routing: IP de origen, IP de destino, puerto de origen, puerto de destino, protocolo usado, TOS e interfaz de llegada.

Hay que destacar que para hacer comprobaciones sobre protocolos IP y puertos de transporte, hay que usar el sistema conjuntamente con ipchains que nos provee fwmark, un sistema para marcar paquetes, los cuales veremos más adelante. Por defecto, hay 3 tablas de routing en la base de datos 'routing policy database':
[eric@mrmime:~]$ ip ru l
0:      from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 
[eric@mrmime:~]$ 

El antiguo comando 'route' nos enseña la tabla 'main'. Las dos otras son nuevas.

La tabla 'local' es especial, no puede ser borrada y tiene la prioridad más alta (0). Se usa para direcciones locales y de broadcast.

La tabla 'main' es la tabla clásica que nos devuelve el antiguo comando 'route'. Se puede borrar o cambiar.

La tabla 'default' esta vacía y se reserva para procesos de post-routing (si las reglas anteriores no coinciden). También se puede borrar.
[eric@mrmime:~]$ ip r l table main                                        
 195.96.98.253 dev ppp2  proto kernel  scope link
               src 212.64.78.148             
 212.64.94.1 dev ppp0  proto kernel  scope link
             src 212.64.94.251
 192.168.2.0/24 dev eth0  proto kernel  scope link
                src 192.168.2.71
 127.0.0.0/8 dev lo  scope link                                                
 default via 212.64.94.1 dev ppp0
[eric@mrmime:~]$

Ejemplo sencillo de routing según origen

Imaginamos que las dos interfaces de red que hemos mencionado antes son: 212.64.94.1 para el tráfico de alta velocidad 195.96.98.253 para el tráfico lento.

Pedro no se ha portado bien esta semana así que le vamos a redireccionar a través de la conexión lenta. Generamos una regla que se llama 'Pedro':
 # echo 200 Pedro >> /etc/iproute2/rt_tables
 # ip rule add from 192.168.2.35 table Pedro
 # ip rule ls
 0:      from all lookup local                                                 
 32765:  from 192.168.2.35 lookup Pedro
 32766:  from all lookup main
 32767:  from all lookup default
Esta regla especifica que todo el tráfico que viene con IP de origen 192.168.2.35 usa la tabla de routing llamada Pedro. Necesitamos entonces crear la misma tabla Pedro:
# ip route add default via 195.96.98.253 dev ppp2 table Pedro
# ip route flush cache
Así de simple.

A continuación vemos los identificadores que se pueden usar en la base de datos:

Es importante no confundir 'tablas de routing' y 'reglas'. Las reglas apuntan a tablas de routing, varias reglas pueden apuntar a la misma tabla de routing. De la misma manera, una tabla de routing puede no tener ninguna regla apuntando a ella sin dejar de existir.

Ejemplo más complejo con marcación de paquetes

En el ejemplo previo, hemos dirigido nuestros paquetes según su dirección IP de origen. Si queremos, por otra parte, basar nuestra política sobre el tipo de tráfico (correo, web, vídeo), usaremos la herramienta de marcación de paquetes proveída por netfilter (iptables).

Siguiendo con los datos previos, vemos ahora como desviar nuestro tráfico de web saliente hacia la interfaz rápida (212.64.94.1, ver arriba).

Marcamos los paquetes que tienen como destino el puerto 25 (SMTP) con un número '1':
# iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 25 \
-j MARK --set-mark 1

Ahora dirigimos los paquetes marcados '1' a una tabla de routing especifica, en este caso, la llamamos web.out:
# echo 201 mail.out >> /etc/iproute2/rt_tables                       
# ip rule add fwmark 1 table web.out                                
# ip rule ls                                                         
0:      from all lookup local                                        
32764:  from all fwmark 1 lookup web.out                     
32765:  from 192.168.2.35 lookup Pedro
32766:  from all lookup main      
32767:  from all lookup default

Sólo nos hace falta ahora crear la tabla de routing:

#ip route add default via 195.96.98.253 dev ppp0 table web.out

Ya lo tenemos todo. La regla de marca que usamos es muy simple, sólo se basa en el puerto de destino del paquete. Obviamente, con la flexibilidad que nos ofrece iptables, podemos hacerlo mucho más complejo, añadiendo excepciones, etc.