
Heute und gestern wurde mein Server automatisch neu gestartet und konnte das Netzwerkgerät während des Bootvorgangs nicht starten. Wenn ich den Rechner erneut neu starte, startet er einwandfrei. Auch hier hatte ich in den letzten 2 Monaten keine Probleme.
Die einzigen Fehlerprotokolle, die ich hierzu finden kann, sind:
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
Und
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
enthält:
#!/bin/sh
/sbin/iptables-restore < /etc/iptables.up.rules
/etc/iptables.up.rules
enthält:
*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
Was könnte hier zeitweise schief laufen und wie kann ich sicherstellen, dass dies nicht erneut passiert?
Antwort1
/etc/network/if-pre-up.d/iptables
Ich vermute immer noch, dass während des gesamten Startvorgangs zwei Ausführungen von gleichzeitig ausgeführt werden. Da systemd
es normal ist, Dinge gleichzeitig zu starten, sofern nicht anders abgeraten wird, gehe ich davon aus, dass der Startvorgang einen Skriptprozess für die lo
Schnittstelle und einen anderen für die ens16
Schnittstelle auslöst. Dies würde zu einer gleichzeitigen Ausführung von führen iptables-restore
, was zu Fehlern wie führen kann iptables-restore: line 10 failed
. Ich kann jedoch keine Beweise liefern.
Ich bin es gewohnt, CentOS- und Red Hat-Systeme zu verwalten. Es war einmal, als einer dieser Server iptables
den Dienst beim Booten nicht initialisieren konnte, weil er gleichzeitig systemd
gestartet wurde ip6tables
. Dieser spezielle Fehler ist hier dokumentiert:https://bugzilla.redhat.com/show_bug.cgi?id=1477413
Ich schlage vor, dass Sie die Parallelität in Ihrem Skript behandeln, beispielsweise indem Sie Folgendes verwenden flock
:
#!/bin/sh
/usr/bin/flock /run/.iptables-restore /sbin/iptables-restore < /etc/iptables.up.rules
Alternativ können Sie den tatsächlichen Wert der ${IFACE}
Variablen überprüfen, bevor Sie iptables
die Regeln wiederherstellen (Referenz:man 5 Schnittstellen):
#!/bin/sh
if [ "${IFACE}" == ens16 ]; then
/sbin/iptables-restore < /etc/iptables.up.rules
fi
iptables
Wenn Sie außerdem nur Regeln beim Booten laden möchten , empfehle ich Ihnen iptables-persistent
stattdessen Folgendes zu verwenden:
# 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