5.7 Encaminamiento (Routing).
El encaminamiento es un tema amplio. Sería fácil llenar varios volúmenes hablando de él. La mayoría de ustedes tendrán requisitos de encaminamiento relativamente simples, pero algunos no. Cubriré solamente algunos de los fundamentos básicos. Si está interesado en información más detallada, entonces sugiero que se remita a las referencias propuestas al principio del documento.
Comencemos con una definición. ¿Qué es el encaminamiento IP? Esta es la que yo suelo aplicar:
El Encaminamiento IP es el proceso por el que una máquina con múltiples conexiones de red decide por dónde dirigir un datagrama IP que haya recibido.
Sería útil ilustrar esto con un ejemplo. Imagine una oficina con el encaminamiento típico, que podría constar de un enlace PPP con Internet, varios segmentos Ethernet alimentando las estaciones de trabajo, y un enlace PPP hacia otra oficina. Cuando el encaminador recibe un datagrama en cualquiera de sus conexiones de red, el mecanismo que usa para determinar qué interfaz debería enviar el datagrama, es el encaminamiento. Las estaciones sencillas también necesitan encaminar. Todas las estaciones en Internet tienen dos dispositivos de red: uno es la interfaz de pruebas descrita anteriormente, y la otra es la que usa para comunicarse con el resto de la red, quizá una Ethernet, quizá una interfaz serie PPP o SLIP.
Bien... Por tanto, ¿cómo funciona el encaminado? Cada máquina tiene una lista de reglas, llamada tabla de encaminamiento. Esta tabla contiene columnas que suelen contener al menos tres campos: el primero es una dirección de destino, el segundo es el nombre de la interfaz a la que se va a encaminar el datagrama, y el tercero es (opcionalmente) la dirección IP de otra máquina que cogerá el datagrama en su siguiente paso a través de la red. En Linux puede ver esta tabla usando la siguiente orden:
root# cat /proc/net/route
o con cualquiera de estas otras:
root# /sbin/route -n
root# /bin/netstat -r
El proceso de encaminado es relativamente simple: se recibe un datagrama que llega, se examina la dirección de destino (para quién es) y se compara con cada entrada en la lista. Se selecciona la entrada que más se parezca y se reenvía el datagrama a la interfaz especificada. Si el campo de pasarela (gateway) está descrito, el datagrama se reenvía a esa máquina mediante la interfaz especificada, y si no, se asume que la dirección de destino está en la red a la que se accede mediante la interfaz correspondiente.
Para manipular esta tabla se usa una orden especial. Esta instrucción toma sus argumentos en línea de órdenes y los convierte en llamadas al sistema del núcleo, que le piden que añada, borre o modifique entradas en la tabla de encaminamiento. Dicha orden se llama route.
Un ejemplo sencillo. Imagine que tiene una red Ethernet. Le han dicho que pertenece a una red clase C con dirección 192.168.1.0. Le han dado la dirección IP 192.168.1.10 para su uso y también que 192.168.1.1 es un encaminador conectado a Internet.
El primer paso es configurar la interfaz como se describió anteriormente. Puede usar una orden como:
root# ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up
Ahora necesita añadir una entrada en la tabla de rutas para decirle al núcleo que los datagramas destinados a todas las máquinas con direcciones que se ajusten a 192.168.1.*, deberán ser enviados al dispositivo Ethernet. Debería usar una orden similar a:
root# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
Fíjese en el uso del parámetro -net para especificar al programa route que esta entrada es una regla para una red completa. Otra opción es -host, que indica una vía específica a una dirección IP en particular.
Esta ruta le permitirá establecer conexiones IP con todas las estaciones de su segmento Ethernet. Pero ¿qué pasa con todas las máquinas con dirección IP que no están en su segmento Ethernet?
Sería bastante engorroso, por no decir imposible, tener que añadir caminos para cada red de destino posible, por lo que existe un truco que se usa para simplificar la tarea. A este truco se le llama camino por defecto. El camino por defecto se ajusta a todo destino posible, pero con prioridad mínima, por lo que si existe cualquier otra entrada que se ajuste a la dirección requerida, será la que se use en lugar del camino por defecto. La idea del camino por defecto es simplemente permitirle decir: «y todo lo demás debería ir por aquí». En el ejemplo que me he inventado podría usar una orden como:
root# route add default gw 192.168.1.1 eth0
El parámetro gw le dice a la orden route que lo que le sigue es la dirección IP, o nombre, de una pasarela u otra máquina encaminadora a la que se deberían enviar todos los datagramas que se ajusten a esta entrada para futuro encaminamiento.
Por lo tanto, la configuración completa debería parecerse a:
root# ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up
root# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
root# route add default gw 192.168.1.1 eth0
Si echa una mirada a los ficheros rc de red de su máquina, encontrará que al menos uno de ellos se parece mucho a esto. Es una configuración muy común.
Veamos ahora una configuración de encaminamiento un poco más complicada. Imaginemos que estamos configurando el encaminador de antes, el que soportaba el enlace PPP a Internet y los segmentos LAN alimentando las estaciones de trabajo en la oficina. Imaginemos que el encaminador tiene tres segmentos Ethernet y un enlace PPP. Nuestra configuración de encaminamiento debería parecerse a esto:
root# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
root# route add -net 192.168.2.0 netmask 255.255.255.0 eth1
root# route add -net 192.168.3.0 netmask 255.255.255.0 eth2
root# route add default ppp0
Cada una de las estaciones debería usar la forma simple que presentamos anteriormente. Sólo el encaminador necesita especificar cada uno de los caminos de red de forma separada, porque para las estaciones el mecanismo de encaminamiento por defecto enviará todos los paquetes al encaminador, dejándole el problema de repartirlos. Puede estar preguntándose por qué el encaminador por defecto presentado no especifica un gw. La razón es simple: los protocolos de enlace serie como PPP y SLIP sólo tienen dos terminales en su red, uno en cada extremo. Especificar el host al otro extremo como pasarela no tiene sentido y es redundante, ya que no hay otra elección, por lo que no se necesita especificar una pasarela para este tipo de conexión de red. Otros tipos como Ethernet, arcnet o token ring necesitan que se especifique la pasarela, ya que se puede acceder a un gran número de terminales al mismo tiempo.
Entonces ¿qué hace el programa routed?
La configuración de encaminamiento descrita anteriormente se ajusta a necesidades de red simples, donde los posibles caminos hacia los destinos son sencillos. Cuando se tienen necesidades de red más complejas, las cosas se vuelven un poco más complicadas. Afortunadamente la mayoría de ustedes no tendrá este problema.
El gran problema con el «encaminamiento manual» o «encaminamiento estático» que aquí se ha descrito, es que si una máquina o enlace falla en la red, entonces la única manera en que podrá dirigir sus datagramas por otra dirección, si es que existe, es interviniendo manualmente y ejecutando las órdenes apropiadas. Naturalmente esto es poco elegante, lento, nada práctico y peligroso. Se han desarrollado varias técnicas para ajustar automáticamente las tablas de encaminamiento en el caso de fallos en la red donde hubiera caminos alternativos. Todas estas técnicas se agrupan de manera no muy oficial bajo la definición «protocolos de encaminamiento dinámico».
Puede que haya oído de alguno de los protocolos más comunes. Es probable que RIP (Routing Information Protocol) y OSPF (Open Shortest Path First Protocol) sean los más comunes. El Routing Information Protocol es muy común en redes pequeñas, como las redes corporativas pequeñas y medianas o en las redes de edificios. El OSPF es más moderno y más capaz de gestionar grandes configuraciones de red, y está mejor preparado para entornos donde haya un gran número de caminos posibles a través de la red. Las implementaciones habituales de estos protocolos son: routed (RIP) y gated (RIP, OSPF y otros). El programa routed suele venir incluido en las distribuciones de Linux, y si no, estará incluido en el paquete NetKit, detallado más adelante.
Un ejemplo de dónde y cómo debería usar un protocolo de encaminamiento dinámico vendría a ser algo como lo siguiente:
192.168.1.0 / 192.168.2.0 /
255.255.255.0 255.255.255.0
- -
| |
| /-----\ /-----\ |
| | |ppp0 // ppp0| | |
eth0 |---| A |------//---------| B |---| eth0
| | | // | | |
| \-----/ \-----/ |
| \ ppp1 ppp1 / |
- \ / -
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\ /
ppp0\ /ppp1
/-----\
| |
| C |
| |
\-----/
|eth0
|
|---------|
192.168.3.0 /
255.255.255.0
Tenemos tres encaminadores A, B y C. Cada uno da servicio a un segmento Ethernet con una red IP de clase C (máscara de red 255.255.255.0). Cada encaminador tiene también un enlace PPP a cada uno de los otros encaminadores. La red forma un triángulo.
Debería estar claro que la tabla de encaminamiento del encaminador A podría ser algo como:
root# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
root# route add -net 192.168.2.0 netmask 255.255.255.0 ppp0
root# route add -net 192.168.3.0 netmask 255.255.255.0 ppp1
Esto funcionaría bien hasta que el enlace entre los encaminadores A y B falle. Si falla ese enlace, entonces con la entrada de encaminamiento mostrada anteriormente, las máquinas del segmento Ethernet de A no podrán alcanzar a las del segmento Ethernet en B porque sus datagramas serán dirigidos al enlace ppp0 de A que está mal. Podrían seguir comunicándose todavía con las máquinas del segmento Ethernet de C, y las del segmento Ethernet de C con las del segmento Ethernet de B, porque el enlace entre B y C aún está intacto.
Pero espere un momento. Si A puede hablar con C y C puede aún hablar con B, ¿por qué no puede A encaminar sus datagramas para B a través de C y dejar que C se los mande a B? Este es exactamente el tipo de problema para el que fueron diseñados los protocolos de encaminamiento dinámico como RIP. Si cada uno de los encaminadores A, B y C está ejecutando el demonio de encaminamiento, entonces sus tablas deberían ser ajustadas automáticamente para reflejar el nuevo estado de la red si alguno de los enlaces falla. Configurar tal red es sencillo. En cada encaminador sólo necesita hacer dos cosas. En este caso, para el Encaminador A:
root# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
root# /usr/sbin/routed
El demonio de encaminamiento routed encuentra automáticamente todos los puertos de red activos cuando comienza y busca mensajes en cada uno de los dispositivos de red para poder determinar y poner al día la tabla de encaminamiento en el host.
Ésta ha sido una explicación muy concisa del encaminamiento dinámico y de dónde podría usarlo. Si quiere más información, tendrá que acudir a las referencias listadas al principio del documento.
Los puntos importantes relacionados con el encaminamiento dinámico son:
- Sólo necesita ejecutar un protocolo de encaminamiento dinámico cuando su máquina Linux tenga la posibilidad de elegir entre múltiples caminos para llegar a un destino.
- El demonio de encaminamiento dinámico modificará automáticamente la tabla de encaminamiento para ajustarla a los cambios en la red.
- RIP es adecuado para redes de tamaño pequeño y medio.