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

ブート プロセス全体を通じて、 の 2 つの実行が/etc/network/if-pre-up.d/iptables同時に実行されているのではないかと私はまだ疑っています。systemd同時に開始しないよう指示されない限り、物事を同時に開始するのが通常の動作であるため、ブート プロセスはインターフェイスに対して 1 つのスクリプト プロセスをトリガーしlo、インターフェイスに対して別のスクリプト プロセスをトリガーすると考えていますens16。その結果、 の同時実行が発生しiptables-restore、 などのエラーが発生する可能性がありますiptables-restore: line 10 failed。ただし、証拠を提供することはできません。

私は CentOS と Red Hat システムの管理に慣れています。かつて、そのようなサーバーの 1 つが、同時に起動していたiptablesために起動時にサービスを初期化できなかったことがありました。その特定のエラーは、ここに記載されています。systemdip6tablesバグ報告

たとえば、次のようにしてスクリプト内で同時実行を処理することをお勧めします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

関連情報