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.