iptables-restore a veces falla al reiniciar

iptables-restore a veces falla al reiniciar

Hoy y ayer, mi servidor se reinició automáticamente y no pudo abrir el dispositivo de red durante el arranque. Si reinicio la máquina nuevamente, arranca bien. Tampoco he encontrado ningún problema con esto durante los últimos 2 meses.

Los únicos registros de errores que puedo encontrar relacionados con esto son:

Aug 23 06:37:14 server systemd[1]: Started ifup for ens16.
Aug 23 06:37:14 server systemd[1]: [email protected]: Main process exited, code=exited, status=1/FAILURE

y

Aug 23 06:37:14 server sh[281]: iptables-restore: line 10 failed
Aug 23 06:37:14 server systemd[1]: [email protected]: Main process exited, code=exited, status=1/FAILURE
Aug 23 06:37:14 server sh[281]: run-parts: /etc/network/if-pre-up.d/iptables exited with return code 1
Aug 23 06:37:14 server sh[281]: ifup: failed to bring up ens16

/etc/network/if-pre-up.d/iptablescontiene:

#!/bin/sh
/sbin/iptables-restore < /etc/iptables.up.rules

/etc/iptables.up.rulescontiene:

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [896:90530]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
COMMIT

¿Qué podría estar saliendo mal con esto de manera intermitente y cómo puedo asegurarme de que no vuelva a suceder?

Respuesta1

Todavía sospecho que /etc/network/if-pre-up.d/iptablesse están ejecutando dos ejecuciones al mismo tiempo durante todo el proceso de arranque. Debido al systemdcomportamiento normal de iniciar cosas simultáneamente a menos que se le indique no hacerlo, creo que el proceso de inicio desencadena un proceso de secuencia de comandos para la lointerfaz y otro para la ens16interfaz. Esto daría como resultado una ejecución simultánea de iptables-restore, lo que puede provocar errores como iptables-restore: line 10 failed. Sin embargo, no puedo proporcionar pruebas.

Estoy acostumbrado a administrar sistemas CentOS y Red Hat. Érase una vez, uno de esos servidores no pudo inicializar iptablesel servicio al arrancar porque systemdse estaba iniciando ip6tablesal mismo tiempo. Ese error específico está documentado aquí:https://bugzilla.redhat.com/show_bug.cgi?id=1477413

Le sugiero que maneje la concurrencia en su script, por ejemplo, usando flock:

#!/bin/sh
/usr/bin/flock /run/.iptables-restore /sbin/iptables-restore < /etc/iptables.up.rules

Alternativamente, puede verificar el valor real de ${IFACE}la variable antes de restaurar iptableslas reglas (referencia:hombre 5 interfaces):

#!/bin/sh
if [ "${IFACE}" == ens16 ]; then
    /sbin/iptables-restore < /etc/iptables.up.rules
fi

Además, si solo desea cargar iptablesreglas en el momento del arranque, le sugiero que utilice iptables-persistent:

# apt-get install iptables-persistent netfilter-persistent
# mv -v /etc/iptables.up.rules /etc/iptables/rules.v4
# systemctl enable netfilter-persistent.service
# rm -v /etc/network/if-pre-up.d/iptables

información relacionada