iptables-restore иногда дает сбой при перезагрузке

iptables-restore иногда дает сбой при перезагрузке

Сегодня и вчера мой сервер автоматически перезагрузился и не смог поднять сетевое устройство во время загрузки. Если я снова перезагружу машину, то она запустится нормально, я также не сталкивался с какими-либо проблемами с этим в течение последних 2 месяцев.

Единственные журналы ошибок, которые я смог найти по этому поводу:

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

и

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содержит:

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

/etc/iptables.up.rulesсодержит:

*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

Что может периодически происходить не так, и как я могу убедиться, что это не повторится?

решение1

Я все еще подозреваю, что два выполнения /etc/network/if-pre-up.d/iptablesвыполняются одновременно в течение всего процесса загрузки. Из-за systemdобычного поведения запуска вещей одновременно, если не рекомендовано не делать этого, я полагаю, что процесс загрузки запускает один процесс скрипта для интерфейса loи другой для ens16интерфейса. Это приведет к одновременному выполнению iptables-restore, что может вызвать такие ошибки, как iptables-restore: line 10 failed. Я не могу предоставить доказательства.

Я привык управлять системами CentOS и Red Hat. Однажды один из таких серверов не смог инициализировать iptablesслужбу при загрузке, потому что systemdзапускался ip6tablesпараллельно. Эта конкретная ошибка задокументирована здесь:https://bugzilla.redhat.com/show_bug.cgi?id=1477413

Я предлагаю вам управлять параллелизмом в вашем скрипте, например, с помощью flock:

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

В качестве альтернативы вы можете проверить фактическое значение ${IFACE}переменной перед восстановлением iptablesправил (ссылка:человек 5 интерфейсов):

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

Кроме того, если вы просто хотите загружать iptablesправила во время загрузки, я предлагаю вам использовать 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

Связанный контент