diff --git a/crates/netup/src/main.rs b/crates/netup/src/main.rs index e6bff1fa..4ae72cd8 100644 --- a/crates/netup/src/main.rs +++ b/crates/netup/src/main.rs @@ -32,6 +32,27 @@ fn run() -> Result<(), Box> { println!("netup: interfaz {iface} (index {ifindex}, mac {})", fmt_mac(mac)); let mut nl = netlink::Netlink::open()?; + + // ── EL LOOPBACK, PRIMERO. Nadie más lo levanta. ────────────────────────────────────────── + // En un sistema con systemd/OpenRC esto lo hace el init; con arje-zero no lo hacía NADIE, y + // `lo` quedaba `DOWN` y sin dirección. Medido el 2026-09-10 en la caja de producción: caddy + // escuchando en `0.0.0.0:80` y `curl http://127.0.0.1/` **con TIMEOUT de 30 s** — no + // "connection refused", que se diagnostica en un minuto, sino un cuelgue que parece del + // servidor. Cualquier servicio que hable con 127.0.0.1 (un repo local, un backend detrás de un + // proxy, un socket TCP entre demonios) fallaba igual. + // + // Va acá porque `netup` es el que configura la red, y no es fatal: si ya estaba levantado, los + // errores son EEXIST y no deben tumbar el arranque. + if let Ok(lo) = read_sysfs_int("lo", "ifindex") { + let lo = lo as i32; + if let Err(e) = nl.link_up(lo) { + eprintln!("netup: aviso, no pude levantar lo: {e}"); + } + if let Err(e) = nl.add_addr(lo, [127, 0, 0, 1], 8) { + eprintln!("netup: aviso, no pude direccionar lo: {e}"); + } + } + nl.link_up(ifindex)?; // Esperar el carrier (virtio/e1000 lo levantan en ms, pero damos margen). wait_carrier(&iface, std::time::Duration::from_secs(5));