Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2566e06abd | ||
|
|
c7ac1b52be |
+67
-16
@@ -176,7 +176,8 @@ en caliente y persistente:
|
|||||||
sysctl -w net.ipv6.conf.all.disable_ipv6=1
|
sysctl -w net.ipv6.conf.all.disable_ipv6=1
|
||||||
sysctl -w net.ipv6.conf.default.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.all.disable_ipv6 = 1
|
||||||
net.ipv6.conf.default.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
|
`/mnt/overlay/upper_etc` (ext4 en `/dev/sdc7`), así que el archivo
|
||||||
persiste.
|
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"
|
!!! note "Pendiente de validar"
|
||||||
Todavía no se probó que el sysctl persistente se aplique después de un
|
Falta confirmar que el drop-in de `/etc/sysctl.d/` se aplique solo en
|
||||||
**reinicio real del NAS**. Tampoco se sabe si una actualización de
|
el **próximo** reinicio. Tampoco se sabe si una actualización de
|
||||||
ZimaOS pisa `upper_etc`. En el próximo reinicio, revisar
|
ZimaOS pisa `upper_etc`.
|
||||||
`sysctl net.ipv6.conf.all.disable_ipv6` antes de dar por cerrado este
|
|
||||||
punto.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -312,13 +360,16 @@ con un dato observable, no por deducción.
|
|||||||
|
|
||||||
## Pendientes
|
## Pendientes
|
||||||
|
|
||||||
- [ ] **Commitear el fix de `entrypoint.sh`.** La imagen `fix-real` que
|
- [x] ~~Commitear el fix de `entrypoint.sh`.~~ Mergeado a `main` del repo
|
||||||
corre en producción lo tiene, pero en el repo `scripts` el cambio
|
`scripts` el 2026-09-26 (`510cc41`). Antes se verificó que
|
||||||
sigue como modificación local sin commitear (`git status` →
|
`entrypoint.sh` y `healthcheck.sh` del repo fueran idénticos (md5) a
|
||||||
`M tmux-host/entrypoint.sh`). Si alguien reconstruye la imagen
|
los de la imagen `fix-real` en producción.
|
||||||
desde `main`, vuelve el `set -eu` sin supervisor.
|
- [x] ~~Validar que IPv6 siga deshabilitado después de un reinicio
|
||||||
- [ ] Validar que IPv6 siga deshabilitado después del próximo reinicio
|
real del NAS.~~ Probado el 2026-09-26 y **falló**: `/etc/sysctl.conf`
|
||||||
real del NAS (ver la nota de la causa c).
|
no se aplica al arrancar en ZimaOS. Se movió a
|
||||||
- [ ] Limpiar las etiquetas de imagen viejas de `tmux-host`
|
`/etc/sysctl.d/99-disable-ipv6.conf` (ver la causa c).
|
||||||
(`supervised`, `supervised-v2`, `local`, `test-fix`, etc.) para no
|
- [ ] Confirmar en el próximo reinicio que el drop-in de
|
||||||
confundir cuál es la vigente.
|
`/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).
|
||||||
Reference in new issue
Block a user