Files
takana/crates
SergioandClaude Opus 5 be383ea485 netup: la puerta puede estar FUERA del prefijo — sin ruta on-link la caja queda con IP y sin salida
Medido en la caja `takana` (Hetzner Cloud, hel1) el 2026-09-10. Hetzner entrega la IPv4 así:

    inet 2.29.29.217/32 scope global eth0
    default via 172.31.1.1 dev eth0
    172.31.1.1 dev eth0 scope link      <-- ESTA es la que faltaba

La dirección es un /32 y la puerta no pertenece a ninguna red conectada. `add_default_route` mandaba
`RTA_GATEWAY` con scope UNIVERSE y nada más, así que el kernel rechazaba la ruta.

**Y el modo de fallo es el peor**: la máquina arranca, `netup` consigue el lease, se pone la IP,
arje-zero levanta sshd... y no se puede entrar, porque las respuestas no tienen por dónde salir. Un
`ssh` desde fuera da `Connection timed out` y desde dentro no hay nada que se vea roto.

Se agrega `add_onlink_host_route` (dst=/32, scope LINK) y se llama ANTES del default. Es lo que hace
`ip route add <gw> dev <if> scope link`, y es literalmente lo que el propio rescue de Hetzner tiene
en su tabla. No es fatal si falla —un EEXIST no debe tumbar la red—; el default sí lo sigue siendo.

**Control causal**, en un netns con una dummy y una /32:

    ip route add default via 172.31.1.1 dev dummy0   => Error: Nexthop has invalid gateway.
    ip route add 172.31.1.1 dev dummy0 scope link    => ok
    ip route add default via 172.31.1.1 dev dummy0   => ACEPTADO

O sea: no es que "ayude", es que era exactamente eso. netup se validaba contra el DHCP de QEMU slirp,
que da un /24 con la puerta dentro — por eso nunca apareció hasta tocar una nube de verdad.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RomoxEGZUhaT4pob1QSX5x
2026-09-10 20:09:10 +00:00
..