
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/iptables
contiene:
#!/bin/sh
/sbin/iptables-restore < /etc/iptables.up.rules
/etc/iptables.up.rules
contiene:
*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/iptables
se están ejecutando dos ejecuciones al mismo tiempo durante todo el proceso de arranque. Debido al systemd
comportamiento 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 lo
interfaz y otro para la ens16
interfaz. 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 iptables
el servicio al arrancar porque systemd
se estaba iniciando ip6tables
al 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 iptables
las 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 iptables
reglas 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