Auflisten und Löschen von iptables-Firewall-Regeln

Einführung

Iptables ist eine Firewall, die in vielen Linux-Systemen eine wesentliche Rolle bei der Netzwerksicherheit spielt. Während Ihnen viele iptables-Tutorials beibringen, wie Sie Firewall-Regeln erstellen, um Ihren Server zu schützen, wird es hier um andere Aspekte der Firewall-Verwaltung gehen: um das Auflisten und Löschen von Regeln.

In diesem Tutorial behandeln wir folgende iptables-Aufgaben:

  • Regeln auflisten
  • Paket- und Byte-Zähler löschen
  • Regeln löschen
  • Ketten leeren (alle Regeln in einer Kette löschen)
  • Alle Ketten und Tabellen leeren, alle Ketten löschen und allen Datenverkehr akzeptieren

Anmerkung: Passen Sie bei der Arbeit mit Firewalls auf, sich nicht aus Ihrem eigenen Server auszusperren, indem Sie SSH-Verkehr blockieren (standardmäßig an Port 22). Wenn Sie aufgrund Ihrer Firewall-Einstellungen den Zugriff verlieren, müssen Sie sich möglicherweise über eine Out-of-Band-Konsole verbinden, um wieder Zugriff zu erhalten.

Voraussetzungen

In diesem Tutorial wird davon ausgegangen, dass Sie einen Linux-Server mit dem installierten Befehl iptables verwenden und Ihr Benutzer sudo-Berechtigungen aufweist.

Wenn Sie Hilfe bei der Ersteinrichtung benötigen, lesen Sie unseren Leitfaden zur Ersteinrichtung des Servers unter Ubuntu 20.04. Er ist auch für Debian und CentOS verfügbar.

Sehen wir uns zunächst an, wie man Regeln auflistet. Es gibt zwei verschiedene Möglichkeiten, um Ihre aktiven iptables-Regeln anzuzeigen: in einer Tabelle oder als Liste mit Regelspezifikationen. Beide Methoden liefern in verschiedenen Formaten etwa die gleichen Informationen.

Regeln nach Spezifikation auflisten

Um alle aktiven iptables-Regeln nach Spezifikation aufzulisten, führen Sie den Befehl iptables mit der Option -S aus:

  • sudo iptables -S
Output-P INPUT DROP -P FORWARD DROP -P OUTPUT ACCEPT -N ICMP -N TCP -N UDP -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate INVALID -j DROP -A INPUT -p udp -m conntrack --ctstate NEW -j UDP -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP -A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -A INPUT -p tcp -j REJECT --reject-with tcp-reset -A INPUT -j REJECT --reject-with icmp-proto-unreachable -A TCP -p tcp -m tcp --dport 22 -j ACCEPT 

Wie Sie erkennen können, sieht die Ausgabe genauso aus wie die Befehle, die zur Erstellung verwendet wurden, jedoch ohne den vorangehenden Befehl iptables. Dies wird auch den Konfigurationsdateien für iptables-Regeln ähneln, sollten Sie jemals iptables-persistent oder iptables save verwendet haben.

Eine bestimmte Kette auflisten

Wenn Sie die Ausgabe auf eine bestimmte Kette beschränken möchten (INPUT, OUTPUT, TCP etc.), können Sie den Kettennamen direkt nach der Option -S angeben. Um beispielsweise alle Regelspezifikationen in der Kette TCP anzuzeigen, würden Sie folgenden Befehl ausführen:

  • sudo iptables -S TCP
Output-N TCP -A TCP -p tcp -m tcp --dport 22 -j ACCEPT 

Sehen wir uns nun die alternative Methode an, um die aktiven iptables-Regeln als Regeltabelle anzuzeigen.

Regeln als Tabellen auflisten

Eine Auflistung der iptables-Regeln in der Tabellenansicht kann für den Vergleich verschiedener Regeln miteinander nützlich sein.

Um alle aktiven iptables-Regeln in einer Tabelle auszugeben, führen Sie den Befehl iptables mit der Option -L aus:

  • sudo iptables -L

Dadurch werden alle aktuellen Regeln nach Kette sortiert ausgegeben.

Wenn Sie die Ausgabe auf eine bestimmte Kette beschränken möchten (INPUT, OUTPUT, TCP etc.), können Sie den Kettennamen direkt nach der Option -L angeben.

Sehen wir uns eine exemplarische INPUT-Kette an:

  • sudo iptables -L INPUT
OutputChain INPUT (policy DROP) target     prot opt source               destination ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED ACCEPT     all  --  anywhere             anywhere DROP       all  --  anywhere             anywhere             ctstate INVALID UDP        udp  --  anywhere             anywhere             ctstate NEW TCP        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW ICMP       icmp --  anywhere             anywhere             ctstate NEW REJECT     udp  --  anywhere             anywhere             reject-with icmp-port-unreachable REJECT     tcp  --  anywhere             anywhere             reject-with tcp-reset REJECT     all  --  anywhere             anywhere             reject-with icmp-proto-unreachable 

Die erste Zeile der Ausgabe gibt den Kettennamen (in diesem Fall INPUT) an, gefolgt von der Standardrichtlinie (DROP). Die nächste Zeile besteht aus den Kopfzeilen der einzelnen Spalten in der Tabelle, gefolgt von den Regeln der Kette. Sehen wir uns an, was die einzelnen Kopfzeilen angeben:

  • target: Wenn ein Paket der Regel entspricht, gibt das Ziel an, was damit geschehen soll. Beispielsweise kann ein Paket akzeptiert, fallen gelassen, protokolliert oder an eine andere Kette gesendet werden, um mit mehr Regeln abgeglichen zu werden.
  • prot: Das Protokoll wie tcp, udp, icmp oder all.
  • opt: Selten verwendet; in dieser Spalte werden IP-Optionen angegeben.
  • source: Die Quell-IP-Adresse oder das Subnetz des Datenverkehrs oder anywhere.
  • destination: Die Ziel-IP-Adresse oder das Subnetz des Datenverkehrs oder anywhere.

Die letzte Spalte, die nicht gekennzeichnet ist, gibt die Optionen einer Regel an. Das heißt: alle Teile der Regel, die nicht in den vorherigen Spalten angegeben sind. Dies kann alles von Quell- und Ziel-Ports bis hin zum Verbindungszustand des Pakets umfassen.

Paketzahlen und aggregierte Größe anzeigen

Bei der Auflistung von iptables-Regeln ist es auch möglich, die Anzahl der Pakete und die aggregierte Größe der Pakete in Bytes anzuzeigen, die mit den einzelnen Regeln übereingestimmt haben. Dies ist oft nützlich, wenn Sie versuchen, eine ungefähre Vorstellung davon zu erhalten, welche Regeln mit Paketen übereinstimmen. Verwenden Sie dazu gemeinsam die Optionen -L und -v.

Sehen wir uns beispielsweise die INPUT-Kette mit der Option -v erneut an:

  • sudo iptables -L INPUT -v
OutputChain INPUT (policy DROP 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination  284K   42M ACCEPT     all  --  any    any     anywhere             anywhere             ctstate RELATED,ESTABLISHED     0     0 ACCEPT     all  --  lo     any     anywhere             anywhere     0     0 DROP       all  --  any    any     anywhere             anywhere             ctstate INVALID   396 63275 UDP        udp  --  any    any     anywhere             anywhere             ctstate NEW 17067 1005K TCP        tcp  --  any    any     anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW  2410  154K ICMP       icmp --  any    any     anywhere             anywhere             ctstate NEW   396 63275 REJECT     udp  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable  2916  179K REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-proto-unreachable     0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh ctstate NEW,ESTABLISHED 

Beachten Sie, dass die Auflistung nun zwei zusätzliche Spalten (pkts und bytes) enthält.

Nachdem Sie wissen, wie Sie die aktiven Firewall-Regeln auf verschiedene Weise auflisten können, sehen wir uns nun an, wie Sie die Paket- und Byte-Zähler zurücksetzen können.

Paketzähler und aggregierte Größe zurücksetzen

Wenn Sie die Paket- und Byte-Zähler für Ihre Regeln löschen oder auf null setzen möchten, verwenden Sie die Option -Z. Sie werden auch zurückgesetzt, wenn es zu einem Neustart kommt. Dies ist nützlich, wenn Sie sehen möchten, ob Ihr Server neuen Datenverkehr erhält, der mit Ihren vorhandenen Regeln übereinstimmt.

Um die Zähler für alle Ketten und Regeln zu löschen, verwenden Sie nur die Option -Z:

  • sudo iptables -Z

Um die Zähler für alle Regeln in einer bestimmten Kette zu löschen, verwenden Sie die Option -Z und geben Sie die Kette an. Um beispielsweise die Kette INPUT zu löschen, führen Sie folgenden Befehl aus:

  • sudo iptables -Z INPUT

Wenn Sie die Zähler für eine bestimmte Regel löschen möchten, geben Sie den Kettennamen und die Regelnummer an. Um beispielsweise die Zähler für die 1. Regel in der Kette INPUT auf null zu setzen, führen Sie Folgendes aus:

  • sudo iptables -Z INPUT 1

Nachdem Sie wissen, wie Sie die Paket- und Byte-Zähler von iptables zurücksetzen, sehen wir uns nun die beiden Methoden an, die Sie zum Löschen verwenden können.

Regeln nach Spezifikation löschen

Eine der Möglichkeiten, iptables-Regeln zu löschen, besteht in der Regelspezifikation. Dazu können Sie den Befehl iptables mit der Option -D ausführen, gefolgt von der Regelspezifikation. Wenn Sie Regeln mit dieser Methode löschen möchten, können Sie die Ausgabe der Regelliste (iptables -S) für Hilfestellungen verwenden.

Wenn Sie beispielsweise die Regel löschen möchten, die ungültige eingehende Pakete fallen lässt (-A INPUT -m conntrack --ctstate INVALID -j DROP), können Sie folgenden Befehl ausführen:

  • sudo iptables -D INPUT -m conntrack --ctstate INVALID -j DROP

Beachten Sie, dass die Option -A, die die Regelposition zur Erstellungszeit angibt, hier ausgeschlossen werden soll.

Regeln nach Kette und Nummer löschen

Die andere Möglichkeit, iptables-Regeln zu löschen, ist anhand ihrer Kette und Zeilennummer. Um die Zeilennummer einer Regel zu ermitteln, listen Sie die Regeln im Tabellenformat auf und fügen die Option --line-numbers hinzu:

  • sudo iptables -L --line-numbers
[secondary_output Output] Chain INPUT (policy DROP) num  target     prot opt source               destination 1    ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED 2    ACCEPT     all  --  anywhere             anywhere 3    DROP       all  --  anywhere             anywhere             ctstate INVALID 4    UDP        udp  --  anywhere             anywhere             ctstate NEW 5    TCP        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW 6    ICMP       icmp --  anywhere             anywhere             ctstate NEW 7    REJECT     udp  --  anywhere             anywhere             reject-with icmp-port-unreachable 8    REJECT     tcp  --  anywhere             anywhere             reject-with tcp-reset 9    REJECT     all  --  anywhere             anywhere             reject-with icmp-proto-unreachable 10   ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh ctstate NEW,ESTABLISHED ... 

Dadurch wird die Zeilennummer zu den einzelnen Regelzeilen hinzufügt, angegeben durch die Kopfzeile num.

Sobald Sie wissen, welche Regel Sie löschen möchten, notieren Sie sich die Kette und Zeilennummer der Regel. Führen Sie dann den Befehl iptables -D aus, gefolgt von der Kette und Regelnummer.

Wenn wir beispielsweise die Eingangsregel löschen möchten, die ungültige Pakete fallen lässt, können wir sehen, dass es sich um Regel 3 der Kette INPUT handelt. Also sollten wir folgenden Befehl ausführen:

  • sudo iptables -D INPUT 3

Nachdem Sie wissen, wie Sie einzelne Firewall-Regeln löschen, sehen wir uns nun an, wie Sie Regelketten leeren können.

Ketten leeren

Iptables bietet eine Möglichkeit, alle Regeln in einer Kette zu löschen oder eine Kette zu leeren. Dieser Abschnitt behandelt die Vielfalt der Möglichkeiten.

Anmerkung: Passen Sie auf, sich nicht über SSH aus Ihrem Server auszusperren, indem Sie eine Kette mit einer Standardrichtlinie von drop oder deny leeren. Wenn Sie dies tun, müssen Sie sich möglicherweise über die Konsole verbinden, um wieder Zugriff zu erhalten.

Eine einzelne Kette leeren

Um eine bestimmte Kette zu leeren, wobei alle Regeln in der Kette gelöscht werden, können Sie die Option -F oder die äquivalente Option --flush und den Namen der zu leerenden Kette verwenden.

Um beispielsweise alle Regeln in der Kette INPUT zu löschen, führen Sie folgenden Befehl aus:

  • sudo iptables -F INPUT

Alle Ketten leeren

Um alle Ketten zu leeren, wodurch alle Firewall-Regeln gelöscht werden, können Sie die Option -F oder die äquivalente Option --flush verwenden:

  • sudo iptables -F

Alle Regeln leeren, Alle Ketten löschen und Alle akzeptieren

In diesem Abschnitt erfahren Sie, wie Sie alle Ihre Firewall-Regeln, Tabellen und Ketten leeren und allen Netzwerkverkehr zulassen können.

Anmerkung: Dadurch wird Ihre Firewall im Prinzip deaktiviert. Sie sollten diesem Abschnitt nur folgen, wenn Sie mit der Konfiguration Ihrer Firewall neu starten möchten.

Legen Sie zunächst die Standardrichtlinien für die einzelnen integrierten Ketten auf ACCEPT fest. Der Hauptgrund dafür besteht darin, sicherzustellen, dass Sie sich nicht über SSH aus Ihrem Server aussperren:

  • sudo iptables -P INPUT ACCEPT
  • sudo iptables -P FORWARD ACCEPT
  • sudo iptables -P OUTPUT ACCEPT

Dann leeren Sie die Tabellen nat und mangle, leeren alle Ketten (-F) und löschen alle nicht standardmäßigen Ketten (-X):

  • sudo iptables -t nat -F
  • sudo iptables -t mangle -F
  • sudo iptables -F
  • sudo iptables -X

Ihre Firewall lässt nun jeglichen Netzwerkverkehr zu. Wenn Sie Ihre Regeln nun auflisten, sehen Sie, dass es keine gibt und nur die drei Standardketten (INPUT, FORWARD und OUTPUT) übrig sind.

Zusammenfassung

Nach dem Absolvieren dieses Tutorials sollten Sie mit dem Auflisten und Löschen Ihrer iptables-Firewall-Regeln vertraut sein.

Denken Sie daran, dass alle iptables-Änderungen über den Befehl iptables kurzlebig sind und gespeichert werden müssen, um nach Server-Neustarts noch vorhanden zu sein. Dies wird im Abschnitt Speichern von Regeln des Tutorials „Allgemeine Firewall-Regeln und -Befehle“ beschrieben.