iptables-restore às vezes falha na reinicialização

iptables-restore às vezes falha na reinicialização

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/iptablescontém:

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

/etc/iptables.up.rulesconté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/iptablesestejam sendo executadas ao mesmo tempo durante todo o processo de inicialização. Devido ao systemdcomportamento 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 lointerface e outro para a ens16interface. 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 iptableso serviço na inicialização porque systemdestava iniciando ip6tablessimultaneamente. 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 iptablesas 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 iptablesregras 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

informação relacionada