linux – iptables-restore有时会在重启时失败

前端之家收集整理的这篇文章主要介绍了linux – iptables-restore有时会在重启时失败前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
今天和昨天,我的服务器自动重启,无法在启动过程中启动网络设备.如果我重新启动机器,那么它启动正常,我也没有在过去的两个月内遇到任何问题.

我能找到的唯一错误日志是:

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

猜你在找的Linux相关文章