Si tiene una red grande, probablemente tenga que encargarse de las necesidades de diferentes personas, que deberían ser servidas de forma diferente. La base de datos de normas de rutado (routing policy database) le permite hacerlo teniendo varios conjuntos de tablas de rutado.
Si quiere usar esta característica, asegúrese de que compila su núcleo con las opciones «IP: advanced router» e «IP: policy routing».
Cuando el núcleo necesita tomar una decisión de encaminamiento, busca la tabla que necesita consultar. Por defecto, hay tres tablas. La antigua herramienta "route" modifica las tablas principal y local, al igual que la herramienta ip (por defecto).
Las reglas por defecto:
[ahu@home ahu]$ ip rule list 0: from all lookup local 32766: from all lookup main 32767: from all lookup default
Aquí se lista la priorida de todas las reglas. Vemos que todas son aplicables a todos los paquetes («from all»). Hemos visto anteriormente la tabla «main», mostrada por ip route ls, pero las tablas «local» y «default» son nuevas.
Si queremos hacer cosas interesantes, generaremos reglas que se refieran a diferentes tablas que nos permitirán saltarnos las reglas generales de rutado del sistema.
Si desea ver la semántica exacta de lo que hace el núcleo cuando hay más de una regla válida, vea la documentación ip-cref de Alexey.
Tomando de nuevo un ejemplo real, tengo 2 cable módems (en realidad 3, pero acabé devolviendo uno), conectados a un router Linux NAT («masquerading»). La gente que vive aquí me paga por acceder a Internet. Suponga que uno de mis compañeros de casa sólo visita hotmail y desea pagar menos. Esto me parece bien, pero acabará usando el cable módem de menos prestaciones.
El cable módem «rápido» se conoce como 212.64.94.251 y es un enlace PPP a 212.64.94.1. El «lento» es conocido por varias IP, por ejemplo 212.64.78.148, y es un enlace a 195.96.98.253.
La tabla local:
[ahu@home ahu]$ ip route list table local broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1 local 10.0.0.1 dev eth0 proto kernel scope host src 10.0.0.1 broadcast 10.0.0.0 dev eth0 proto kernel scope link src 10.0.0.1 local 212.64.94.251 dev ppp0 proto kernel scope host src 212.64.94.251 broadcast 10.255.255.255 dev eth0 proto kernel scope link src 10.0.0.1 broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1 local 212.64.78.148 dev ppp2 proto kernel scope host src 212.64.78.148 local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1 local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
Montón de cosas obvias, pero que hace falta especificar en algún sitio. Bien, aquí están. La tabla por defecto está vacía.
Veamos la tabla «main»:
[ahu@home ahu]$ ip route list 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 10.0.0.0/8 dev eth0 proto kernel scope link src 10.0.0.1 127.0.0.0/8 dev lo scope link default via 212.64.94.1 dev ppp0
Ahora generaremos una nueva regla que llamaremos «John», por nuestro hipotético compañero. Aunque podemos trabajar con números, es mucho más sencillo añadir nuestras tablas a /etc/iproute2/rt_tables.
# echo 200 John >> /etc/iproute2/rt_tables # ip rule add from 10.0.0.10 table John # ip rule ls 0: from all lookup local 32765: from 10.0.0.10 lookup John 32766: from all lookup main 32767: from all lookup default
Ahora todo lo que queda es generar la tabla John, y refrescar la caché de rutas:
# ip route add default via 195.96.98.253 dev ppp2 table John # ip route flush cache
Ya hemos terminado. Dejamos como ejercicio al lector implementar esto en ip-up.