今天和昨天,我的服务器自动重启,无法在启动过程中启动网络设备.如果我重新启动机器,那么它启动正常,我也没有在过去的两个月内遇到任何问题.
我能找到的唯一错误日志是:
Aug 23 06:37:14 server systemd[1]: Started ifup for ens16. Aug 23 06:37:14 server systemd[1]: ifup@ens16.service: 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]: ifup@ens16.service: Main process 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的两次执行在整个启动过程中同时运行.由于系统正常的并发启动行为,除非建议不这样做,我相信启动过程会触发lo接口的一个脚本进程和ens16接口的另一个脚本进程.这将导致iptables-restore的并发执行,这可能导致错误,例如iptables-restore:第10行失败.我无法提供证据.
我习惯于管理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
或者,您可以在恢复iptables规则之前检查${IFACE}变量的实际值(参考:man 5 interfaces):
#!/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