
Hoje e ontem, meu servidor foi reinicializado automaticamente e não conseguiu ativar o dispositivo de rede durante a inicialização. Se eu reiniciar a máquina novamente, ela iniciará bem. Também não encontrei nenhum problema com isso nos últimos 2 meses.
Os únicos logs de erros que posso encontrar relacionados a isso são:
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
e
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
contém:
#!/bin/sh
/sbin/iptables-restore < /etc/iptables.up.rules
/etc/iptables.up.rules
contém:
*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
O que poderia estar errado com isso de forma intermitente e como posso garantir que isso não aconteça novamente?
Responder1
Ainda suspeito que duas execuções /etc/network/if-pre-up.d/iptables
estejam sendo executadas ao mesmo tempo durante todo o processo de inicialização. Devido ao systemd
comportamento normal de iniciar coisas simultaneamente, a menos que seja aconselhado a não fazê-lo, acredito que o processo de inicialização aciona um processo de script para a lo
interface e outro para a ens16
interface. Isso resultaria em uma execução simultânea de iptables-restore
, o que pode causar erros como iptables-restore: line 10 failed
. No entanto, não posso fornecer evidências.
Estou acostumado a gerenciar sistemas CentOS e Red Hat. Era uma vez, um desses servidores falhou ao inicializar iptables
o serviço na inicialização porque systemd
estava iniciando ip6tables
simultaneamente. Esse erro específico está documentado aqui:https://bugzilla.redhat.com/show_bug.cgi?id=1477413
Sugiro que você lide com a simultaneidade em seu script, por exemplo, usando flock
:
#!/bin/sh
/usr/bin/flock /run/.iptables-restore /sbin/iptables-restore < /etc/iptables.up.rules
Alternativamente, você pode verificar o valor real da ${IFACE}
variável antes de restaurar iptables
as regras (referência:homem 5 interfaces):
#!/bin/sh
if [ "${IFACE}" == ens16 ]; then
/sbin/iptables-restore < /etc/iptables.up.rules
fi
Além disso, se você quiser apenas carregar iptables
regras no momento da inicialização, sugiro que você use 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