今天和昨天,我的服务器自动重新启动,并且在启动过程中无法启动网络设备。如果我再次重新启动机器,那么它可以正常启动,在过去的 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
间歇性地出现这种情况可能会出现什么问题,我如何确保它不会再次发生?
我仍然怀疑
/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
:${IFACE}
或者,您可以在恢复iptables
规则之前检查变量的实际值(参考: man 5 interfaces):此外,如果您只想
iptables
在启动时加载规则,我建议您iptables-persistent
改用: