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

6

Hoje e ontem, meu servidor reinicializou automaticamente e não conseguiu abrir o dispositivo de rede durante a inicialização. Se eu reiniciar a máquina novamente, ele será iniciado corretamente. Também não encontrei nenhum problema com isso durante os últimos dois meses.

Os únicos logs de erro 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 dando errado com isso de uma forma intermitente, e como posso ter certeza de que isso não aconteça novamente?

    
por Sam Bull 23.08.2018 / 14:55

1 resposta

2

Eu ainda suspeito que duas execuções de /etc/network/if-pre-up.d/iptables estão sendo executadas ao mesmo tempo durante todo o processo de inicialização. Devido ao comportamento systemd 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 interface lo e outro para a interface ens16 . Isso resultaria em uma execução simultânea de iptables-restore , o que pode causar erros, como iptables-restore: line 10 failed . Eu sou incapaz de fornecer evidências embora.

Estou acostumado a gerenciar sistemas CentOS e Red Hat. Era uma vez, um desses servidores falhou ao inicializar iptables service na inicialização porque systemd estava iniciando ip6tables simultaneamente. Esse erro específico está documentado aqui: link

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

Como alternativa, você pode verificar o valor real da variável ${IFACE} antes de restaurar as regras iptables (referência: man 5 interfaces ):

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

Além disso, se você quiser apenas carregar as regras iptables no momento da inicialização, sugiro que 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
    
por 23.10.2018 / 14:48