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:~]$ |
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 |
# ip route add default via 195.96.98.253 dev ppp2 table Pedro # ip route flush cache |
A continuación vemos los identificadores que se pueden usar en la base de datos:
from: determina la origen del paquete
to: determina el destino del paquete
iis: determina la interfaz de llegada
tos: determina el valor de TOS
fwmark: determina el valor de 'marca' del paquete (puesto por iptables por ej., ver el ejemplo siguiente)
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.
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.