3  PDRouter

PDRouter es un router IPv4 didáctico escrito en Rust que funciona íntegramente en espacio de usuario. Está escrito por profesores de las asignaturas PST I y PST II de GSyC / EIF / URJC. No utiliza el encaminamiento IP del kernel: recibe y transmite directamente tramas Ethernet mediante pnet y sockets de bajo nivel. Está pensado para ejecutarse en los routers de los laboratorios de Kathará.

Diagrama de bloques de PDRotuer

3.1 Inicialización

Al arrancar, main lee /etc/network/interfaces. El módulo interfaces obtiene de este fichero las direcciones IP, máscaras, gateways y rutas estáticas de las interfaces. Además, genera automáticamente las rutas correspondientes a las redes directamente conectadas.

A continuación se crean los canales de comunicación entre la interfaz de usuario y la pila de red. El programa utiliza dos hilos: el hilo principal ejecuta la interfaz de usuario y un segundo hilo ejecuta la pila de red (stack.rs). Este último abre un canal Ethernet para cada interfaz y mantiene el estado del router: interfaces, tabla de rutas, caché ARP y paquetes pendientes de resolución ARP.

3.2 Recepción de una trama

La pila de red recorre continuamente las interfaces y comprueba si han recibido una trama Ethernet. Cada trama se copia a un Frame de tamaño fijo y se examina su cabecera Ethernet.

Primero se comprueba la dirección MAC destino. Se procesan únicamente las tramas dirigidas a la propia interfaz o a la dirección de broadcast. Después se utiliza el campo EtherType para decidir cómo procesarla:

  • ARP: se entrega al módulo ARP.
  • IPv4: se entrega al procesamiento IP.
  • Otros tipos de trama se ignoran.

Las estructuras EthView, ArpView e Ipv4Header proporcionan vistas sobre los datos recibidos sin necesidad de copiar ni transformar los campos individuales de los protocolos.

3.3 ARP

Cuando llega una trama ARP válida, el router aprende siempre la asociación entre la IP y la MAC del emisor y la almacena en una caché ARP. La caché tiene un máximo de 64 entradas, se mantiene ordenada por IP y utiliza búsqueda binaria. Las entradas caducan después de 30 segundos.

Si la petición ARP pregunta por una de las direcciones IP del propio router, se genera inmediatamente una respuesta ARP.

ARP también interviene al reenviar paquetes. Si el router conoce la MAC del siguiente salto, puede transmitir inmediatamente la trama. Si no la conoce, envía una petición ARP y conserva temporalmente el paquete en una pequeña cola de paquetes pendientes. Cuando llega la respuesta ARP, los paquetes correspondientes se completan con la MAC obtenida y se transmiten. Si no hay respuesta en un segundo, el router genera un mensaje ICMP Host Unreachable para el origen.

3.4 Encaminamiento IPv4

Para una trama IPv4 se comprueba primero si la dirección IP destino pertenece al propio router. En ese caso el paquete se procesa localmente.

Si la dirección no es local, comienza el forwarding. Antes de reenviar el paquete se comprueba el TTL. Si vale 1, el router no lo reenvía y genera un mensaje ICMP Time Exceeded dirigido al origen. En otro caso decrementa el TTL y recalcula la suma de comprobación de la cabecera IPv4.

Después se consulta la tabla de encaminamiento. Cada ruta contiene red destino, máscara, siguiente salto e interfaz de salida. Las rutas se mantienen ordenadas por longitud de prefijo decreciente, por lo que la primera coincidencia implementa el algoritmo Longest Prefix Match. Una ruta sin siguiente salto representa una red directamente conectada; en ese caso la propia dirección destino es el siguiente salto. Si no existe ninguna ruta, se devuelve ICMP Network Unreachable.

Una vez determinada la interfaz de salida, se actualiza la MAC origen de la trama con la MAC de dicha interfaz y se resuelve mediante ARP la MAC destino correspondiente al siguiente salto. Finalmente se transmite la trama Ethernet.

3.5 Paquetes destinados al propio router

Actualmente el procesamiento local está orientado principalmente a ICMP. Si el paquete contiene un ICMP Echo Request dirigido a una de las direcciones del router, PDRouter construye y transmite un Echo Reply.

También puede gestionar los Echo Reply correspondientes al comando ping de la interfaz de usuario.

3.6 Mensajes ICMP de error

Los errores producidos durante el encaminamiento se generan como nuevos datagramas IP y no como una respuesta Ethernet directa. Para ello se construye un mensaje ICMP que incluye la cabecera IP original y los primeros ocho bytes de su carga, tal como establece ICMP.

PDRouter genera principalmente tres tipos de error:

  • Time Exceeded: cuando el TTL se agota.
  • Network Unreachable: cuando no existe una ruta hacia el destino.
  • Host Unreachable: cuando no se consigue resolver mediante ARP el siguiente salto.

Estos mensajes también se encaminan utilizando la propia tabla de rutas, por lo que el router aplica el mismo mecanismo de forwarding para hacer llegar el error hasta el origen.

3.7 Interfaz de usuario

PDRouter dispone de una interfaz de comandos interactiva. Cuando se ejecuta asociado a un TTY utiliza una interfaz basada en ratatui, en caso contrario utiliza una interfaz de texto sencilla. En el modo TUI, las teclas ↑ y ↓ permiten recorrer el historial de comandos.

Los comandos disponibles son:

Comando Descripción
route Muestra la tabla de rutas
arp Muestra la caché ARP
ping <ip> Envía un ICMP Echo Request
add route <red>/<prefijo> [via <gw>] dev <iface> Añade una ruta estática
del route <red>/<prefijo> Elimina una ruta
help Muestra la ayuda
quit / exit Apaga el router

En conjunto, el funcionamiento de PDRouter puede resumirse como:

Ethernet → ARP o IPv4 → procesamiento local o forwarding → tabla de rutas → resolución ARP → Ethernet.

Todo este proceso se realiza en espacio de usuario, lo que permite observar de forma explícita los mecanismos fundamentales de un router: recepción de tramas, ARP, encaminamiento mediante Longest Prefix Match, decremento del TTL y generación de mensajes ICMP.

3.8 Limitaciones

PDRouter está diseñado deliberadamente como un router sencillo y didáctico. Implementa el encaminamiento IPv4 básico, ARP, forwarding y algunos mensajes ICMP, pero no pretende cubrir todas las funcionalidades de un router real. Entre las capacidades que no implementa se encuentran:

  • IPv6 y el encaminamiento de paquetes IPv6.
  • Protocolos de encaminamiento dinámico, como OSPF, RIP o BGP. Las rutas deben configurarse estáticamente.
  • Fragmentación y reensamblado de datagramas IP.
  • El tratamiento completo de las opciones de las cabeceras IPv4.
  • La amplia variedad de mensajes ICMP que puede generar un router. PDRouter se limita a Echo Reply, Time Exceeded y algunos casos de Destination Unreachable.
  • Mecanismos avanzados de gestión de tráfico, como QoS, colas sofisticadas o control de congestión.
  • NAT y otras funciones habituales de los routers domésticos y de acceso.
  • Funciones de firewall y filtrado de paquetes.
  • Protocolos y tecnologías de enlace más allá del escenario Ethernet utilizado en las prácticas.
  • Protocolos de encaminamiento y mecanismos de alta disponibilidad propios de routers de producción.

Estas limitaciones son intencionadas: reducen considerablemente la complejidad del programa y permiten concentrarse en los mecanismos fundamentales del encaminamiento IP.