diff --git a/workloads/docs-portal/docs/playbooks/incidente-tmux-host-cadena-fallos-2026-09-25.md b/workloads/docs-portal/docs/playbooks/incidente-tmux-host-cadena-fallos-2026-09-25.md index 86a5df7..c1a5697 100644 --- a/workloads/docs-portal/docs/playbooks/incidente-tmux-host-cadena-fallos-2026-09-25.md +++ b/workloads/docs-portal/docs/playbooks/incidente-tmux-host-cadena-fallos-2026-09-25.md @@ -176,7 +176,8 @@ en caliente y persistente: sysctl -w net.ipv6.conf.all.disable_ipv6=1 sysctl -w net.ipv6.conf.default.disable_ipv6=1 -# Persistente: /etc/sysctl.conf del host +# Persistente: /etc/sysctl.d/99-disable-ipv6.conf del host +# (NO /etc/sysctl.conf -- ver "Validación tras reinicio real" abajo) net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 ``` @@ -207,12 +208,59 @@ pero `/etc` es un overlay con capa de escritura en `/mnt/overlay/upper_etc` (ext4 en `/dev/sdc7`), así que el archivo persiste. +### Validación tras reinicio real: `/etc/sysctl.conf` no alcanzaba (2026-09-26) + +Se reinició el NAS a propósito (~17:13Z) para probar la persistencia. +Resultado **(verificado)**: + +- `/etc/sysctl.conf` **sí** sobrevivió al reinicio con las dos líneas + (el overlay de `/etc` persiste). +- Pero `sysctl net.ipv6.conf.all.disable_ipv6` volvió a dar **`0`**: el + archivo existía y **nunca se aplicó** al arrancar. + +**Causa.** En ZimaOS, `systemd-sysctl` solo carga `/etc/sysctl.d/*.conf` +(y `/usr/lib/sysctl.d/`, `/lib/sysctl.d/`). Otras distros traen un +symlink `/etc/sysctl.d/99-sysctl.conf -> ../sysctl.conf` que hace que +`/etc/sysctl.conf` también se lea al arrancar. **ZimaOS no lo trae**, así +que escribir en `/etc/sysctl.conf` funciona solo en caliente (con +`sysctl -p`) y no sobrevive un reinicio. Nada avisa del problema: el +archivo está, el contenido es correcto y el valor igual vuelve a `0`. + +**Por qué no se rompió enseguida.** Tras el reinicio el host no tenía +ninguna IPv6 global utilizable, así que `getaddrinfo` no devolvía la AAAA +de `api.anthropic.com` y todo salía por IPv4. Pero `curl -6` seguía +fallando (`Could not connect to server`). Si el router vuelve a entregar +una IPv6 global por SLAAC, vuelve el timeout. Funcionaba por casualidad, +no porque estuviera corregido. + +**Fix.** Mover la configuración a un drop-in que ZimaOS sí lee: +`/etc/sysctl.d/99-disable-ipv6.conf` (mismas dos líneas). + +Para aplicarlo en caliente sin reiniciar: dentro de `tmux-host`, +`/proc/sys` es de solo lectura (`sysctl -w` → `Read-only file system`). +Hace falta un contenedor privilegiado de un solo uso en la red del host, +o `sudo sysctl -p` directo en el host: + +```bash +docker run --rm --privileged --network host \ + -v /etc/sysctl.d:/etc/sysctl.d:ro \ + alpine sysctl -p /etc/sysctl.d/99-disable-ipv6.conf +``` + +**Validado en vivo (verificado, 2026-09-26 ~19:15Z):** +`disable_ipv6 = 1` en `all` y `default`, ninguna dirección IPv6 global en +el host y `curl` a `api.anthropic.com` por IPv4 (`connect=0.035s`). + +!!! warning "Lección" + "El archivo de configuración persistió" no es lo mismo que "la + configuración se aplica al arrancar". La única validación real de + algo persistente es **reiniciar y medir el valor efectivo**, no + revisar que el archivo siga ahí. + !!! note "Pendiente de validar" - Todavía no se probó que el sysctl persistente se aplique después de un - **reinicio real del NAS**. Tampoco se sabe si una actualización de - ZimaOS pisa `upper_etc`. En el próximo reinicio, revisar - `sysctl net.ipv6.conf.all.disable_ipv6` antes de dar por cerrado este - punto. + Falta confirmar que el drop-in de `/etc/sysctl.d/` se aplique solo en + el **próximo** reinicio. Tampoco se sabe si una actualización de + ZimaOS pisa `upper_etc`. --- @@ -312,13 +360,16 @@ con un dato observable, no por deducción. ## Pendientes -- [ ] **Commitear el fix de `entrypoint.sh`.** La imagen `fix-real` que - corre en producción lo tiene, pero en el repo `scripts` el cambio - sigue como modificación local sin commitear (`git status` → - `M tmux-host/entrypoint.sh`). Si alguien reconstruye la imagen - desde `main`, vuelve el `set -eu` sin supervisor. -- [ ] Validar que IPv6 siga deshabilitado después del próximo reinicio - real del NAS (ver la nota de la causa c). -- [ ] Limpiar las etiquetas de imagen viejas de `tmux-host` - (`supervised`, `supervised-v2`, `local`, `test-fix`, etc.) para no - confundir cuál es la vigente. +- [x] ~~Commitear el fix de `entrypoint.sh`.~~ Mergeado a `main` del repo + `scripts` el 2026-09-26 (`510cc41`). Antes se verificó que + `entrypoint.sh` y `healthcheck.sh` del repo fueran idénticos (md5) a + los de la imagen `fix-real` en producción. +- [x] ~~Validar que IPv6 siga deshabilitado después de un reinicio + real del NAS.~~ Probado el 2026-09-26 y **falló**: `/etc/sysctl.conf` + no se aplica al arrancar en ZimaOS. Se movió a + `/etc/sysctl.d/99-disable-ipv6.conf` (ver la causa c). +- [ ] Confirmar en el próximo reinicio que el drop-in de + `/etc/sysctl.d/` deja IPv6 en `1` sin intervención. +- [x] ~~Limpiar las etiquetas de imagen viejas de `tmux-host`.~~ Hecho el + 2026-09-26: quedan solo `2026-09-26-fix-real` (vigente) y + `2026-09-20-uv` (rollback).