P1 · Tu red

Cada equipo diseña un sistema autónomo: una oficina, una DMZ y un núcleo con caminos alternativos. Esta red es la que conectarán a las demás en P2. Se usa lo visto en las semanas 3 a 5. Entrega en la semana 6.

Lo que reciben

  • Un número de equipo X (de 1 a 60), su AS 65000 + X, y dos bloques:
    • Direcciones privadas: 10.X.0.0/16.
    • Direcciones “públicas” de Qhapaq Ñan: 100.(64 + X).0.0/16.
  • Una topología de Containerlab, as/topo.clab.yml, con cuatro routers en anillo más una diagonal (r1–r4), un switch de oficina con cuatro hosts y un servidor en la DMZ, srv. También hay un host externo de prueba, ext, conectado a r4.
                    r2
                  /    \
                /        \
 oficina --- r1 ---------- r3 --- srv (DMZ)
                \ diagonal /
                  \      /
                    r4 --- ext

La topología ya está fijada: estas son las interfaces de cada nodo.

Nodo Interfaces
r1 eth1 a r2, eth2 a r3 (la diagonal), eth3 a r4, eth4 trunk a sw
r2 eth1 a r1, eth2 a r3
r3 eth1 a r2, eth2 a r1 (la diagonal), eth3 a r4, eth4 a srv
r4 eth1 a r3, eth2 a r1, eth3 a ext
sw eth1 a h1, eth2 a h2, eth3 a h3, eth4 a h4, eth5 trunk a r1
h1–h4, srv eth1

eth0 es la red de gestión que pone Containerlab. No es parte de su red: no la usen ni la metan en OSPF.

El enlace hacia afuera viene dado, y es la única excepción a sus bloques: r4:eth3 tiene 100.64.0.1/24 y ext tiene 100.64.0.2/24. Ningún equipo usa 100.64.0.0/16. ext manda por r4 todo lo que vaya a 100.64.0.0/10 y a 10.0.0.0/8, como un vecino descuidado o malintencionado. Por eso, que no se llegue a la oficina desde afuera depende de ustedes.

Lo que deben hacer

  1. Plan de direcciones. Documentar en as/plan.md todas las subredes, justificando su tamaño.
  2. VLANs. Separar la oficina en la VLAN 10 (personal: h1 y h2) y la VLAN 20 (invitados: h3 y h4). Las dos llegan a r1 por un trunk. Invitados no puede iniciar conexiones hacia personal; personal sí puede iniciarlas hacia invitados.
  3. OSPF. Todos los routers en el área 0. Costos elegidos para que el tráfico entre r1 y r3 use la diagonal mientras exista.
  4. NAT. La oficina sale con una dirección pública de r4. El servidor de la DMZ usa una dirección pública propia, sin NAT.
  5. Resistencia. Con Hello de 1 s y Dead de 3 s, la red debe seguir funcionando si cae cualquier enlace del núcleo.

Reglas que revisan las pruebas

Direcciones

  • Todas las direcciones están dentro de los bloques del equipo, salvo el enlace r4–ext. Las subredes no se solapan.
  • La oficina usa direcciones privadas y srv, una pública.
  • Cada subred aparece en as/plan.md en notación CIDR, tal como está configurada.

VLANs

  • Los hosts no etiquetan nada: su dirección va en eth1, y a r1 sus frames le llegan por el trunk con la VLAN de cada uno.
  • Las VLANs están separadas en la capa de enlace: un invitado que se ponga una dirección de personal igual no llega a personal.
  • Invitados no inicia conexiones hacia personal, ni con TCP ni con UDP ni con ICMP. Personal sí las inicia hacia invitados, y las respuestas vuelven.

OSPF

  • Hay adyacencia en Full en los cinco enlaces del núcleo, con Hello de 1 s y Dead de 3 s, todo en el área 0.
  • OSPF habla solo por los enlaces del núcleo. En las demás interfaces, o no corre, o es passive-interface.
  • OSPF no reparte la red de gestión. Solo aprende rutas de sus bloques, de 100.64.0.0/24 y la ruta por defecto.
  • traceroute de r1 a cualquier dirección de r3, y de r3 a cualquiera de r1, tiene un solo salto: el de la diagonal. La tabla de routing no muestra otro camino, ni siquiera empatado. Si se cae la diagonal, usa el anillo. Cuando vuelve, vuelve a ella.

Conectividad y NAT

  • Todos los hosts alcanzan al servidor de la DMZ y a ext, con TCP, UDP e ICMP.
  • srv ve a cada host de la oficina con su dirección real: dentro del AS no se traduce.
  • ext ve toda la oficina con una sola dirección pública de r4, de su bloque, que no es la del enlace 100.64.0.1. Ningún paquete de la oficina llega a ext con origen privado.
  • ext ve a srv con su dirección propia, y srv ve a ext con la suya.
  • Desde afuera se alcanza el servidor de la DMZ, pero no un host de la oficina, ni por su dirección privada ni a través de la dirección pública de r4.
  • r1, r2 y r3 alcanzan esa dirección pública de r4: tiene que estar en OSPF. P2 la va a necesitar.

Fallas

  • Al cortar cualquier enlace del núcleo, la conectividad vuelve en menos de 10 s.
  • Se corta de dos formas: bajando la interfaz en un extremo y haciendo que el enlace deje de pasar paquetes sin que las interfaces lo noten. En el segundo caso, solo el Dead detecta la falla. Con los temporizadores normales de OSPF, la red tardaría unos 40 s.

Archivos

Archivo Qué hace ¿Lo modifican?
as/r*/frr.conf Configuración de FRRouting de cada router Sí
as/<nodo>/setup.sh Lo que cada nodo hace al arrancar: VLANs, nftables, direcciones de los hosts Sí
as/plan.md Plan de direcciones y decisiones Sí
as/equipo.env Número de equipo Sí
as/topo.clab.yml, as/arranque.sh La topología y lo que prepara cada nodo No
Makefile, p1_public_test.py Levantan la red y la prueban No

La carpeta as/ debe quedar lista para volver a levantarse desde cero: nada se configura a mano sin dejarlo escrito. Cada nodo monta as/ completa en /as, y no ve nada más. Si sus archivos dependen de algo fuera de as/, no van a funcionar en el hackathon de P2.

Cada setup.sh corre con sh (BusyBox, no bash) y se detiene en el primer comando que falla. Las direcciones de los routers pueden ir en frr.conf o en setup.sh; las de los hosts, en setup.sh.

Agreguen sus pruebas en archivos test_*.py, en esta misma carpeta: make test las corre. Corren después de las públicas, con la red todavía arriba.

Cómo se corren las pruebas

Dentro del contenedor del curso (env/run.sh), desde esta carpeta:

make             # revisa la sintaxis de setup.sh y el número de equipo
make test        # levanta la red, corre todo y la destruye, también si algo falla o con Ctrl+C
make clean       # destruye la red y borra lo generado

Las pruebas leen las direcciones de los nodos, no las suponen: cada equipo elige las suyas. Tampoco exigen una forma de hacer las cosas. Por ejemplo, r1 puede usar subinterfaces o un bridge. Solo miran lo que pasa en la red. make test demora unos dos minutos, y las pruebas tienen márgenes amplios. Si una se queda esperando, falla sola.

La revisión corre además pruebas privadas con otros casos de falla y de tráfico.

Trabajar a mano

make topo-up                 # levanta la red con lo que hay en as/
make vtysh N=r1              # vtysh en r1
make sh N=h1                 # una shell en h1
docker exec clab-p1-red-r1 tcpdump -ni eth4 -e   # capturar en un nodo
make topo-down

Lo que cambien a mano se pierde al bajar la red. as/ se monta solo para lectura, así que write memory termina en Read-only file system: es a propósito. Pasen lo que funcionó a as/r*/frr.conf o a setup.sh, y vuelvan a levantar la red.

Para correr en la red de un nodo las herramientas de este contenedor, como en P0, usen nsenter:

H1=$(docker inspect -f '{{.State.Pid}}' clab-p1-red-h1)
nsenter -n -t $H1 ping -c 1 100.64.0.2

Si una prueba falla

  • Una adyacencia no sube. Revisen con show ip ospf interface el área, la máscara y los temporizadores en los dos extremos. Tienen que coincidir.
  • La prueba de la diagonal encuentra dos interfaces, o una que no es la diagonal. Una dirección de r3 en otro enlace también se alcanza por el anillo, y los dos caminos pueden empatar. Calculen con Dijkstra el costo de cada camino y comparen con show ip route.
  • Funciona a mano y falla en las pruebas. Busquen lo que configuraron a mano y no quedó en as/.
  • ext ve otra dirección. Una regla de NAT sin origen traduce también lo que no debe, y masquerade usa la dirección de la interfaz de salida.
  • La oficina no recibe respuestas de afuera. Las respuestas también pasan por la cadena forward de r4. Con nftables, escriban primero la regla que acepta ct state established,related. La forma ct state != established,related no hace lo que parece: compruébenlo con nft list ruleset.
  • Con una falla, algo sigue sin llegar a los 10 s. Busquen rutas estáticas por el enlace cortado: una estática le gana a OSPF aunque el enlace ya no sirva.
  • setup.sh falla. Las pruebas muestran su salida. También está en /tmp/setup.log, dentro del nodo.