Warum speichert der beständige Dienst von Iptables meine Änderungen nicht?

18

Ich habe dieses Tutorial befolgt , um IP-Regeln für Ubuntu 12.04 einzurichten. Beim Setup hat alles einwandfrei funktioniert - aber jetzt habe ich Änderungen an der Firewall vorgenommen, die beim Neustart nicht bestehen bleiben. Ich verstehe nicht, warum das so ist. Hier ist eine Demonstration, wie ich iptables-persistent verwende. Was mache ich falsch?

$ sudo service iptables-persistent start
 * Loading iptables rules...                                                                                             *  IPv4...                                                                                                              *  IPv6...   

$ sudo iptables -L   //shows a certain rule
$ iptables -D INPUT ... //command successfully drops the rule
$ sudo iptables -L   //shows rule has been deleted

 $ sudo service iptables-persistent restart
 * Loading iptables rules...                                                                                             *  IPv4...                                                                                                              *  IPv6...                                                                                                      [ OK ] 
 $ sudo iptables -L  //rule is back
bernie2436
quelle
Ich stelle fest, dass die iptables -D INPUTRegel nicht erfüllt ist. Sind sudoSie sicher, dass sie tatsächlich einen Erfolg meldet? Ändert sich das Verhalten, wenn Sie es in ausführen sudo?
Bratchley

Antworten:

41

iptables-persistentfunktioniert nicht so. Durch einen Neustart des iptables-persistent"Dienstes" wird nicht der aktuelle Status der iptables erfasst und gespeichert . Es werden lediglich die Iptables-Regeln wiederhergestellt, die beim letzten Konfigurieren des Pakets gespeichert wurden.

Zum Konfigurieren iptables-persistentmüssen Sie ihn über Ihren aktuellen iptables-Regelsatz informieren.

Ein Weg, dies zu erreichen, ist wie folgt:

iptables-save >/etc/iptables/rules.v4
ip6tables-save >/etc/iptables/rules.v6

Oder gleichermaßen bietet das iptables-persistentPaket Folgendes:

dpkg-reconfigure iptables-persistent

(Sie müssen die Fragen zum Speichern der Regeln mit Ja beantworten.)

Danach werden beim nächsten iptables-persistentStart / Neustart die erwarteten iptables-Regelsätze geladen.

Steven Montag
quelle
9

Mit dem folgenden Befehl können Sie die aktuellen iptables-Regeln ganz einfach speichern:

sudo service netfilter-persistent save

Unter Verwendung des oben genannten Befehls, der zumindest in Ubuntu nach der Installation des Pakets netfilter-persistent(und iptables-persistent) funktioniert , ist es nicht erforderlich, die iptables-Befehle manuell auszuführen oder das Paket neu zu konfigurieren (wie dies selbst in der oben akzeptierten Antwort vorgeschlagen wird).

OpenITeX
quelle
Ist es sudo service netfilter-persistent saveoder sudo service netfilter-persistent save .? (Punkt am Ende.)
Tomasz
Vielen Dank, dass Sie dies bemerkt haben. Der richtige Befehl ist ohne den Punkt am Ende der Zeile. Die Antwort wurde entsprechend korrigiert.
OpenITeX
3
$ iptables ... DROP //command successfully drops the rule
$ sudo iptables -L   //shows rule has been deleted

Das ist nicht was DROPbedeutet oder tut. Von man iptables:

... die Sonderwerte ACCEPT, DROP, QUEUE oder RETURN. ACCEPT bedeutet, das Paket durchzulassen. DROP bedeutet , das Paket auf den Boden fallen zu lassen. WARTESCHLANGE bedeutet ...

Sie haben also eine neue Regel hinzugefügt. Es kann effektiv eine beliebige Anzahl anderer Regeln ersetzen, aber diese Regeln existieren immer noch.

Wenn iptables -Lich so etwas überprüfe (deine Ausgabe), würde ich es trotzdem füttern, grep "string unique to this rule"anstatt deine Augen zu benutzen. Das geht einfacher und schneller und ist weniger fehleranfällig.

iptables -L | grep "some unique string"

Wenn Sie eine Regel löschen möchten, verwenden Sie den -DSchalter. Die Manpage beschreibt zwei Formen davon:

-D, - Kettenregel-Spezifikation löschen

-D, - Kettenrulenum löschen

Löschen Sie eine oder mehrere Regeln aus der ausgewählten Kette. Es gibt zwei Versionen dieses Befehls: Die Regel kann als Zahl in der Kette (beginnend mit 1 für die erste Regel) oder als übereinstimmende Regel angegeben werden.

Goldlöckchen
quelle
Entschuldigung, das war unklar. Ich verwende die Option -D, um eine Regel fallen zu lassen. Siehe die Änderung oben
bernie2436
3
-Dsteht für "Löschen", nicht für "TROPFEN". ​​Der Begriff "TROPFEN" bedeutet etwas anderes als ein Sprungziel iptables.
Bratchley
1

Wie von @ steven-monday erklärt , können Sie Ihren Regelsatz selbst im richtigen Verzeichnis (nämlich :) speichern /etc/iptables/rules.v{4,6}.

Allerdings @OpenITeX hat Recht: Aufruf der saveAktion ist service netfilter-persistentbesser.

Ab heute (in 18,10), iptables-save wird builtin, aber iptables-persistentist nicht installiert. Daher ist das von aufgerufene Plugin-Verzeichnis service netfilter-persistentleer, und der Dienst gibt aus, dass der Regelsatz gespeichert wurde, während dies nicht der Fall war.

TLDR: Installieren iptables-persistentund überprüfen Sie, ob das Plugin-Verzeichnis /usr/share/netfilter-persistent/plugins.dPlugins enthält.


So habe ich das herausgefunden:

$ cat /etc/init.d/netfilter-persistent 
...
case "$1" in
...
save)
    log_action_begin_msg "Saving netfilter rules"
    /usr/sbin/netfilter-persistent save
    log_action_end_msg $?
    ;;

Überprüfen Sie dann das /usr/sbin/netfilter-persistentSkript und stellen Sie fest, dass es externe Skripte aufruft:

$ cat /usr/sbin/netfilter-persistent
...
PLUGINS=/usr/share/netfilter-persistent/plugins.d
...
run_plugins () {
    if [ -d ${PLUGINS} ]; then
        run-parts -v -a ${1} ${PLUGINS}
    fi
}

case $1 in
start|save|flush)
    run_plugins ${1}
    ;;

Dann bemerkte ich, dass /usr/share/netfilter-persistent/plugins.ddas leer war.

Aif
quelle
1

Installieren Sie iptables-persistent:

sudo apt install iptables-persistent

Speichern Sie die Regeln, nachdem Sie die gewünschten Änderungen vorgenommen haben:

sudo netfilter-persistent save
Zack A
quelle