
今天和昨天,我的伺服器自動重新啟動,並且在啟動過程中無法啟動網路設備。如果我再次重新啟動機器,它就會正常啟動,在過去的兩個月裡我也沒有遇到任何問題。
我能找到的與此相關的唯一錯誤日誌是:
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