← Todos los artículos

El router que nunca debe transportar un paquete

Tres protocolos de estado de enlace, tres formas distintas de unirse a una red y serle inútil a propósito

Michel Wijnberg

El artículo dos sostenía que Osprey no toca su red. Esta serie es el nivel de debajo de esa afirmación: cómo se entra realmente en cada protocolo, qué se niega a entregar cada uno, y dónde ser un invitado bien educado resulta más difícil de lo que suena.

Empecemos por el requisito más duro, porque de él se deriva todo lo demás.

Para leer una base de datos de estado de enlace hay que estar dentro de ella. No al lado, no consultándola: una adyacencia real, intercambiando LSA reales, apareciendo en la base de datos de todos los demás como un router. No hay modo observador en OSPF ni en IS-IS. O se une o no obtiene nada.

Y en el momento en que se une, cada router del área ejecuta camino más corto sobre un grafo que ahora le contiene a usted. Nadie preguntó si quería el tráfico.

Así que el requisito es:

Sea un router plenamente conforme. No sea nunca seleccionado como camino.

Los dos están en tensión por diseño, y los tres protocolos lo resuelven de forma distinta.


OSPFv2: el coste máximo

El RFC 2328 exige que un router OSPFv2 origine un Router-LSA por cada área en la que participa. No hay adyacencia de solo observación a la que recurrir: participar significa ser descrito. Así que el grabador origina uno, anunciando su único enlace punto a punto con coste 65535, el máximo que cabe en una métrica de 16 bits.

Todos los demás routers del área ejecutan Dijkstra incluyendo obedientemente ese enlace, y gana cualquier camino alternativo. El grabador está en el grafo, visible, conforme, y nunca en un camino más corto salvo que la red no tenga realmente nada más, en cuyo caso tiene problemas mayores que su monitorización.

Ese es todo el mecanismo en OSPFv2, y conviene notar lo que no es. No es una bandera que diga “no me uséis”. Es una métrica ordinaria puesta tan alta que la respuesta cae sola del algoritmo normal. Los routers conformes no necesitan tratamiento especial, porque no está pasando nada especial.

Hay una segunda mitad que costó una caída aprender, y es la más interesante. El grabador anuncia el enlace punto a punto y nada más, en particular no la red stub de la subred interna del propio túnel GRE. Anunciar eso, incluso a coste máximo, hace que todos los demás routers instalen una ruta para el prefijo del túnel. Esa ruta puede entonces dirigir los propios paquetes externos del túnel, lo que mata la adyacencia que transportaba la observación. La monitorización rompe justo aquello que necesita para monitorizar. El artículo siete cuenta la versión de esa historia en la que lo descubrí por las malas.

El coste máximo le mantiene fuera del camino más corto. No le mantiene fuera de la tabla de rutas, y son problemas distintos.


OSPFv3: lo mismo, más un bit que lo dice explícitamente

OSPFv3 hereda el truco de la métrica y luego añade algo para lo que OSPFv2 no tiene equivalente.

OSPFv3 lleva un bit R en las opciones del Router-LSA (RFC 5340). Cuando el bit está a cero, el router anunciante no se considera capaz de reenviar tráfico de tránsito. Sigue participando en la distribución de topología; simplemente no es elegible como nodo de tránsito.

Eso no es una métrica. Es una declaración, así que el grabador deja el bit R a cero, y un router OSPFv3 conforme lo excluye por completo del cálculo de tránsito en lugar de limitarse a ponerlo el último.

La diferencia importa más de lo que parece. Una métrica máxima es una afirmación sobre preferencia que resulta ser decisiva. Un bit R a cero es una afirmación sobre capacidad, y no puede ser sobrepasada por una topología en la que todos los demás caminos son peores.

También cierra un bucle en el lado lector. El propio SPF de Osprey respeta ese mismo bit mediante una bandera de no-tránsito por área, de modo que un grabador queda excluido del tránsito tanto por los routers conformes como por el propio cálculo de caminos de Osprey, por la misma razón declarada. Dos implementaciones, un bit, ningún caso especial en ninguna de las dos.

OSPFv2 sencillamente no tiene dónde poner esa frase. El campo de opciones no tiene equivalente, así que v2 se queda con la métrica y solo con la métrica, y la asimetría es una propiedad de los protocolos y no del esfuerzo invertido en ellos.


IS-IS: dos puertas y un cerrojo

IS-IS tiene el mecanismo individual más fuerte y, en esta implementación, la mayor redundancia alrededor.

El LSP autooriginado activa el bit de sobrecarga. ISO 10589 es inequívoco sobre lo que significa: otros routers pueden alcanzar este sistema, pero no deben calcular caminos a través de él. Es la misma clase de afirmación que el bit R de OSPFv3, y lo precede por mucho.

Luego dos más, y no son del mismo tipo:

CampoValorQué detiene
Bit OLactivadoser calculado como nodo de tránsito
Bits ATT0000ser instalado como puerta de enlace por defecto
Métrica del TLV 220xFFFFFFcualquier cosa que trate el bit de sobrecarga como orientativo

La fila ATT se gana su sitio porque cierra una puerta distinta. El bit de sobrecarga va de cálculo de caminos. El bit attached va de encaminamiento por defecto: un router L1L2 lo activa para decir a los routers de nivel 1 que puede alcanzar fuera del área, y esos routers apuntan entonces una ruta por defecto hacia él. Eso no es un camino calculado a través del grabador, es cada paquete sin mejor coincidencia enviado hacia él, que es peor y llega por una vía que el primer mecanismo no cubre.

La fila de la métrica es pura defensa. Una métrica de 24 bits de 16.777.215 hace el truco de OSPFv2 por debajo de un mecanismo que ya debería hacerlo innecesario, bajo el supuesto de que en alguna parte hay una implementación que trata el bit de sobrecarga como orientativo.

(El LSP también pone a cero el bit de reparación de partición, que es realmente menor y se menciona solo para que nadie tenga que preguntarse por qué está ahí.)

Los dos grabadores GRE tal como los guarda realmente la base de datos OSPF, filtrados al rango de los túneles de grabación. Cada uno es un router de pleno derecho con su propio LSA y su propio número de secuencia, y cada uno tiene exactamente un enlace y ninguna marca ABR ni ASBR: presente, mínimo y por construcción un callejón sin salida
Los dos grabadores GRE tal como los guarda realmente la base de datos OSPF, filtrados al rango de los túneles de grabación. Cada uno es un router de pleno derecho con su propio LSA y su propio número de secuencia, y cada uno tiene exactamente un enlace y ninguna marca ABR ni ASBR: presente, mínimo y por construcción un callejón sin salida

Ese es el argumento entero en una tabla. Los grabadores están dentro de la base de datos, con sus propios LSA y sus propios números de secuencia, igual que cualquier otro router. Un enlace cada uno, sin marcas, nada que redistribuir. El modelo de seguridad no es lo que los mantiene fuera; es lo que hace inofensivo estar dentro.


Lo que el título no afirma

Conviene separarlo antes de seguir, porque el título exagera si se lee como una afirmación sobre la máquina.

Nada de lo anterior hace al host físicamente incapaz de reenviar. En el grabador del laboratorio da la casualidad de que es incapaz, porque net.ipv4.ip_forward está a 0 y el equivalente IPv6 también. Pero eso es un ajuste del host. Alguien puede cambiarlo con un comando, y nada de la capa de protocolo se enteraría.

Así que el requisito no es “esta caja no puede reenviar un paquete”. Es:

Ningún cálculo de rutas en ninguna parte de la red puede seleccionar esta caja como nodo de tránsito.

La diferencia está en dónde vive la garantía. Si la inocuidad del grabador dependiera de un sysctl, entonces cada operador que despliegue uno estaría a un sysctl -w de meter un host de monitorización en la ruta de reenvío, y la red no se enteraría. Como depende de la topología, el propio cálculo de camino más corto de la red se niega a enrutar por el grabador, hubiera reenviado el kernel o no.

El sysctl es un buen cinturón. Solo es lo más débil de este artículo, y la siguiente sección va exactamente sobre ese gradiente.


El que es un valor por defecto y no un invariante

Los tres grabadores corren además con prioridad de elección de DR igual a cero, así que nunca pueden convertirse en router designado de un segmento. Un grabador que ganara una elección de DR se convertiría en aquello de lo que todos los demás routers del segmento dependen para inundar, que es lo contrario de toda la premisa.

Prioridad cero es el valor por defecto, y quiero ser preciso sobre qué clase de protección es: es un campo de configuración. Nada en el código rechaza un valor más alto. Póngalo y el grabador competirá en la elección como cualquier otro router.

Eso conviene separarlo del resto del artículo, porque todo lo de arriba es una constante en código. El bit de sobrecarga es OLBit: true en el punto de originación, sin manera de desactivarlo por configuración. La métrica de OSPFv2 es 65535 en el constructor de LSA. El bit R nunca se activa. Eso son invariantes. La prioridad de DR es un valor por defecto, y los valores por defecto son la clase de seguridad que sobrevive exactamente mientras nadie edite un fichero YAML.


Hacer que el error no esté disponible

Lo que me lleva a la parte que de verdad me importa.

Prevenir el tránsito es un problema de preferencia. Prevenir la inyección es un problema de corrección, y es mucho peor, porque el modo de fallo no es un camino subóptimo. Es una ruta en la tabla de otro que no corresponde a nada.

Por eso el LSP autooriginado de IS-IS no lleva ninguna alcanzabilidad IP. Ni TLV 128, 130, 135 ni 236. Ni TLV 134 de router-id de ingeniería de tráfico, que metería al grabador en la base de datos TE. Ni TLV 222, ni TLV 242.

La forma en que eso se impone es lo importante. La rutina de originación toma su entrada de una pequeña estructura de configuración con un nivel, un identificador de sistema, una dirección de área, un identificador de sistema del par, un número de secuencia, una dirección de interfaz y un autenticador opcional. No hay en ella ningún campo capaz de contener un prefijo. Quien la llama no puede pasarle una ruta, porque no hay dónde pasarla.

Quiero ser exacto sobre el límite de eso, porque es tentador afirmar más. El LSP que se construye contiene una lista genérica de TLV, y la rutina añade a ella. Alguien que editara esa rutina podría añadir un TLV de alcanzabilidad; el sistema de tipos no objetaría. Lo que el diseño elimina no es la posibilidad, es el accidente: ninguna configuración, ningún llamante y ninguna combinación de ajustes puede introducir una ruta. Inyectar una exige editar una función cuyo bloque de documentación enumera los invariantes para los que existe.

Esa distinción es toda la diferencia entre las dos mitades de este artículo, y a estas alturas hay cuatro peldaños en juego. Un ajuste del host es algo que un operador puede cambiar sin saber jamás qué protegía. Una comprobación en tiempo de ejecución es algo que se puede olvidar escribir. Un valor por defecto es algo que se puede sobrescribir sin notarlo. Una superficie de entrada sin sitio donde poner el error es algo que hay que esforzarse por derrotar, y ese esfuerzo es visible en un diff.

Ninguno de estos es absoluto. Solo son cantidades muy distintas de accidentalidad, y la ingeniería que merece la pena consiste en bajar una garantía por esa lista en vez de añadir otra comprobación arriba.


La idea

Tres protocolos, tres mecanismos, un requisito, y los mecanismos no son intercambiables. OSPFv2 solo puede expresar “caro”. OSPFv3 e IS-IS pueden expresar “no soy un router de tránsito”, que es algo más fuerte y más honesto de decir, y lo expresan en bits que anteceden a todo esto por décadas.

La ingeniería interesante no fue escribir el drenaje. Fue darse cuenta de que el coste máximo no le mantiene fuera de una tabla de rutas, de que un valor por defecto no es un invariante, y de que el sitio más seguro para una regla es aquel donde la regla no se puede expresar mal.


Siguiente: marcharse. Un grabador que reinicia encuentra que la red todavía sostiene su yo anterior con un número de secuencia mayor, y el mensaje que lo arregla es el que envía mientras se apaga. El LSA que no puedes retirar.