staging.inyokaproject.org

Von „iptables2“ weitergeleitet.

iptables

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

Mit Hilfe von iptables 🇬🇧 wird Netfilter 🇬🇧, der IP-Paketfilter des Linux-Kernels konfiguriert. Paketfilter werden üblicherweise in Routern und Firewalls eingesetzt.

iptables und Netfilter wurden mit dem Linux Kernel 2.4 eingeführt und unverändert in den Kernel 2.6 übernommen.

iptables selbst dient nur zur Kommunikation mit Netfilter im Linux-Kernel. Eine modernere Alternative hierfür ist Nft, welches das Netfilter-Projekt ebenfalls entwickelt und pflegt.

Installation

Das Paket iptables ist üblicherweise in der Standardinstallation von Ubuntu enthalten und muss daher in der Regel nicht selbst installiert werden.[1]

  • iptables (Verwaltungswerkzeuge für Paketfilterung und Network Address Translation (NAT))

Befehl zum Installieren der Pakete:

sudo apt-get install iptables 

Oder mit apturl installieren, Link: apt://iptables

Hinweis:

Die Installation des Pakets iptables erstellt die Befehle iptables und ip6tables als symbolische Verknüpfungen (über mehrere Zwischenstufen) auf ein allgemeineres Programm (bis 20.04: xtables-legacy-multi, ab 22.04: xtables-nft-multi). Diese verhalten sich beim Aufruf mit den alten Namen so wie die früher eigenständigen Programme iptables und ip6tables:

  • iptables bearbeitet Regeln für IPv4-Pakete

  • ip6tables bearbeitet Regeln für IPv6-Pakete

Wenn im Artikel nur von iptables als Programm gesprochen wird, gilt das entsprechend auch für ip6tables.

Grundlagen der Paketprüfung

Ist der Paketfilter des Kernel aktiv (d.h. sind mit iptables erstellte Filterregeln konfiguriert), so werden alle IP-Datenpakete geprüft. Ankommende Pakete werden geprüft, bevor sie an die Zielanwendung geleitet werden, ausgehende Pakete werden geprüft, bevor sie den Rechner verlassen. Agiert der Rechner als Router (z.B. in einem Netzwerk), so werden die Pakete während der Weiterleitung geprüft. Außerdem besteht auch die Möglichkeit der Paketmanipulation. Die Art der Prüfung lässt sich mit Hilfe von iptables sehr detailliert vorgeben.

Funktionsweise von iptables

Die Paketprüfung und die mit iptables zu erstellenden Filterregeln sind dreistufig aufgebaut. Es gibt (hierarchisch von oben nach unten):

  • Tabellen (tables), diese enthalten

  • Regelketten (chains), davon gibt es vordefinierte Standardketten und vom Benutzer selbst erstellte zusätzliche Ketten, und in diesen stehen

  • die eigentliche Filterregeln

Man kann sich vereinfachend die Regelketten als Prozeduren vorstellen, die in einer bestimmten Reihenfolge aufgerufen werden und dann die enthaltenen Filterregeln sequentiell abarbeiten. Abhängig von der in einer Regel enthaltenen Aktion kann diese die Bearbeitung der Regelkette beenden oder nicht. Eine Regelkette kann auch eine andere aufrufen und die aufgerufene kann wieder zurückkehren.

Aus Sicht eines IP-Paketes betrachtet, erklärt man die Arbeitsweise von Netfilter als eine Reise durch die verschiedenen Tabellen und Regelketten, wie in folgender Abbildung dargestellt. Abb. Reise von IP-Paketen durch Netfilter

Ein von einem externen Prozess gesendetes IP-Paket trifft über das Netzwerk (blauer Blockpfeil) an einer der Schnittstellen interface 1-N ein und reist in Pfeilrichtung auf den blauen Wegen durch die Tabellen und Standardketten. Nach den PREROUTING-Ketten erfolgt das (gelb dargestellte) Routing, welches möglicherweise das Paket in die Warteschlangen INPUT zur lokalen Zustellung und/oder FORWARD zur Weitergabe an andere Rechner einreiht oder verwirft. conntrack ist keine Tabelle, sondern eine interne Klassifizierung des Pakets, die in den Ketten der folgenden Tabellen ausgewertet werden kann.

Für ein von einem lokalen Prozess stammendes Paket wird zunächst per Routing die zuständige Schnittstelle ermittelt, dann durchlaufen diese Pakete aus OUTPUT zusammen mit den Paketen aus FORWARD noch POSTROUTING, bevor sie entweder über die Schnittstelle lo wieder zurück geführt werden oder über die Schnittstellen interface 1-N und das Netzwerk zu anderen Rechnern gelangen.

In jeder der gezeigten Ketten kann das Paket spezifisch für die jeweilige Tabelle bearbeitet oder ggf. auch endgültig verworfen (DROP) werden. Eine „Akzeptierung“ (ACCEPT) bedeutet also im Grunde nur ein „darf weiter zur nächsten Stelle“. Dies gilt auch für die Standardkette INPUT. Nicht jedes Paket, welches hier akzeptiert wird, kann auch – möglicherweise schädlich – auf den Rechner einwirken. Vielmehr prüft noch als letzte Instanz der (rot dargestellte) Netzwerk-Stack im Kernel jedes Paket, ob überhaupt ein aktiver Prozess auf ein IP-Paket mit den Eigenschaften Empfänger-Adresse, Protokoll und Empfänger-Port wartet. Wenn dies nicht der Fall ist, wird des Paket stillschweigend vernichtet.

Trifft eine in einer Tabelle und Kette definierte Regel zu, so wird die in der Regel hinterlegte Aktion ausgeführt. Sollte keine Regel zutreffen (was durchaus nichts ungewöhnliches ist), so wird die in der Tabelle hinterlegte, allgemein gültige Policy angewendet.

Bein praktischen Umgang mit dem Programm iptables muss man in den meisten Fällen ziemlich viele Optionen angeben. Dies ist Folge der indirekten Arbeitsweise: iptables selbst filtert gar nichts, sondern mit Hilfe dieses Programms erklärt der Systemverwalter dem Linux-Kernel, was dieser tun soll. Bei jedem Aufruf des Programms muss man also angeben, an welcher Stelle im Regelwerk – d.h. in welcher Tabelle (table) und welcher Regelkette (chain) sowie ggf. an welcher Position in der Kette – etwas verändert werden soll, wie diese Veränderung aussehen soll, und zusätzlich muss man sagen, welche Regel an der so festgelegten Stelle denn stehen soll. Dabei besteht die Regel selbst auch noch aus möglicherweise mehreren Bedingungen (Selektoren), die für das Paket alle zutreffen müssen, damit dann die in der Regel definierte Aktion ausgeführt wird.

Tabellen

Die Tabellen unterteilen das gesamte Regelwerk nach der grundsätzlichen Aufgabe. Es gibt vier wichtige Tabellen (= Regelsätze):

⚓︎

Tabelle 1: Tabellen von iptables
TabelleBeschreibung
filter Diese Standardtabelle enthält alle reinen Filterregeln.
nat Diese Tabelle wird für Adressumsetzung (NAT = Network Address Translation) und spezielle Weiterleitungen (Port Forwarding) eingesetzt.
mangle Diese Tabelle wird zur Manipulation des Pakets eingesetzt.
raw Diese Tabelle ermöglicht, Ausnahmen vom normalerweise aktiven Connection Tracking zu definieren oder dieses sogar ganz auszuschalten.

Es gibt eine fünfte, noch ungebräuchliche Tabelle security. Eigene Tabellen kann man nicht anlegen.

Regelketten

Jede Tabelle enthält verschiedene Regelketten.

Es gibt fünf verschiedene Standardketten, davon kommt nicht jede in jeder Tabelle vor. Diese bestimmen, wann ein Paket geprüft wird und unterscheiden, woher ein Paket stammt und/oder wohin es gesendet werden soll:

⚓︎

Tabelle 2: Standardketten von iptables
Chain für Tabelle Wann? Beschreibung
PREROUTING raw, mangle, nat bevor Routing von einer Schnittstelle (inkl. lo) empfangene Pakete
INPUT mangle, nat, filter nach Routing an eine lokalen IP-Adresse gerichtete Pakete
FORWARD mangle, filter nach Routing von anderen Rechnern stammende und für einen anderen Rechner bestimmte Pakete
OUTPUT raw, mangle, nat, filter bevor Routing von einem lokalen Prozess stammende Pakete
POSTROUTING mangle, nat nach Routing alle Pakete vor Übergabe an ihre vorgesehene Schnittstelle (inkl. lo)

Man kann in jeder Tabelle zusätzliche Regelketten anlegen, eine solche ist dann aus den Standardketten quasi als Unterprogramm aufrufbar.

Definition der Filterregel

In den Regelketten werden die Regeln festgelegt. Dies geschieht über einen Aufruf von iptables im Terminal[2].

Hinweis:

Der Aufruf von iptables erfordert immer Root-Rechte:

sudo iptables OPTION… 

Im folgenden Text wird immer voraus gesetzt, dass bei Befehlen mit iptables als root gearbeitet wird[3] oder sudo voran gestellt wird.

Bei der Arbeit mit iptables sollte man wegen der Übersichtlichkeit die benötigten Optionen in einer einheitlichen Reihenfolge angeben, z.B.:

iptables «Stelle-im-Regelwerk-und-Art-der-Bearbeitung» «Eigenschaft-des-IP-Pakets»… «Aktion» 

Durch die Notation „«...»“ wird angedeutet, dass hierfür mehrere zusammengehörende Optionen stehen können:

  • Für «Stelle-im-Regelwerk-und-Art-der-Bearbeitung» benötigt man die Option -t mit dem Namen einer Tabelle, eine der Optionen -I/A/D usw., ggf. mit einer Regelkette und ggf. eine Zahl zur Angabe der Position in der Regelkette.

  • Für «Eigenschaft-des-IP-Pakets» benutzt man die Optionen -i, -o, -s, -d, -p, --sport, --dport und -m und ggf. weitere zusätzliche Optionen. Man muss keinen und kann mehrere Selektoren angeben.

  • Die ggf. auszuführende «Aktion» wird mit der Option -j bezeichnet. Man kann höchstens eine Aktion angeben; wenn man für bestimmte IP-Pakete mehrere Aktionen benötigt, muss man mehrere Regeln anlegen.

Dazu kennt iptables eine Vielzahl von Optionen, von den im folgenden einige (primär für die Tabelle filter und die Chains INPUT, OUTPUT und FORWARD) erklärt werden.

⚓︎

Tabelle 3: Optionen für Filterregeln
OptionBeschreibung
Optionen für «Stelle-im-Regelwerk-und-Art-der-Bearbeitung»
-t TABLE Auswahl der Tabelle TABLE zur Bearbeitung. Für TABLE ist eine Bezeichnung aus Tabelle 1 einzusetzen. Zur Auswahl der Tabelle filter kann man diese Option weglassen.
-A CHAIN Regel wird an die Kette CHAIN angehängt.
-I CHAIN INDEX Regel wird an Position INDEX der Kette CHAIN eingefügt. Für INDEX ist eine positive ganze Zahl oder nichts anzugeben; bei Nichtangabe der Position wird die Regel am Anfang der Kette eingefügt.
-D CHAIN INDEX Regel an der Position INDEX wird aus der Kette CHAIN entfernt. Die Position muss angegeben werden.
Optionen für «Eigenschaft-des-IP-Pakets»
-i SCHNITTSTELLE Das Paket muss über Netzwerkschnittstelle SCHNITTSTELLE eingegangen ist. Aus Sicht von iptables kann man für SCHNITTSTELLE fast jede beliebige Zeichenkette einsetzen, Sinn macht aber nur ein Name für eine vom Befehl ip link aufgeführte Schnittstelle.
-o SCHNITTSTELLE Das Paket muss zur Versendung über die angegebene Netzwerkschnittstelle SCHNITTSTELLE vorgesehen sein.
-s IP-ADRESSE Das Paket enthält die IP-Adresse IP-ADRESSE als Absender.
-d IP-ADRESSE Das Paket enthält die IP-Adresse IP-ADRESSE als Empfänger.
-p PROTOKOLL Das Paket muss das angegebene höhere Protokoll PROTOKOLL (z.B. TCP, UDP, ICMP) enthalten. Für PROTOKOLL ist dessen Identifizierungsnummer oder der in der Datei /etc/protocols definierte Kurzname einzusetzen, also z.B. für TCP: 6 oder tcp
--sport PORT oder --source-port PORT Das Paket enthält die Port-Nummer PORT als Absender. Dieser Selektor ist nur möglich nach der Option -p zur Auswahl eines Protokolls, welches Ports benutzt!
--dport PORT oder --destination-port PORT Das Paket enthält die Port-Nummer PORT als Empfänger. Muss zwingend in Verbindung mit -p benutzt werden!
! OPTION Negation: Das Paket wird selektiert, wenn es die folgende Option OPTION nicht erfüllt. Beispiel: "! -o lo" selektiert alle Pakete, die nicht von der Schnittstelle lo stammen.
-m MODUL Lädt für die aktuelle Regel die zusätzliche Funktionalität mit dem Namen MODUL. Nach dieser Option werden abhängig von MODUL weitere Optionen verfügbar.
Optionen für «Aktion»
-j AKTION Legt fest, dass die Aktion AKTION auf das Paket angewendet wird, wenn alle Prüfkriterien erfüllt wurden. AKTION kann eine der Tabelle 4 beschriebenen durch iptables implementierten Aktionen oder der Name einer selbst definierten Regelkette sein; in diesem Fall besteht die Aktion in der Prüfung der dort hinterlegten Regeln.
Optionen zur Bearbeitung ganzer Regelketten
-P STANDARD-CHAIN METHODE Legt für die Standard-Regelkette STANDARD-CHAIN Tabelle 2 die Methode METHODE fest, wie mit dem Paket verfahren werden soll, falls keine Filterregel zutrifft. Für METHODE ist DROP oder ACCEPT einzusetzen. Weitere Details siehe Policy.
-L CHAIN Listet alle Regeln in der Regelkette CHAIN oder ohne Angabe von CHAIN in allen Regelketten der ausgewählten Tabelle.
-N NEUER-NAME Erzeugt in der ausgewählten Tabelle eine neue leere Regelkette mit dem Namen NEUER-NAME.
-F CHAIN Löscht alle Regeln in der Regelkette CHAIN oder ohne Angabe von CHAIN in allen Regelketten der ausgewählten Tabelle.
-X CHAIN Löscht in der ausgewählten Tabelle eine leere Regelkette mit dem Namen CHAIN.

⚓︎ Trifft eine Filterregel auf ein Paket zu, muss noch festgelegt werden, wie mit dem Paket verfahren werden soll (Option -j Aktion, siehe oben). Bei normaler Filterung sind die häufigsten Aktionen:

Tabelle 4: Häufig angewendete Aktionen
AktionBeschreibung
ACCEPT Das Paket wird vorläufig akzeptiert und die Bearbeitung dieses Paketes in dieser Tabelle wird beendet. Es kann aber noch in später durchlaufenden Tabellen weiter bearbeitet und auch noch verworfen werden.
DROP Das Paket wird endgültig verworfen, der Sender erhält keine Nachricht.
REJECT Das Paket wird endgültig verworfen, der Sender wird benachrichtigt. Diese Aktion kann nicht in allen Chains, sondern nur in INPUT, FORWARD und OUTPUT verwendet werden.
LOG Die Paketdaten werden lediglich im System-Log festgehalten, damit ist aber keine Entscheidung über das spätere Schicksal des Pakets verbunden.
RETURN Die Bearbeitung des Pakets in der aktuellen Regelkette wird beendet. Wenn diese Aktion in einer Standardkette (wie z.B. INPUT) verwendet wird, entscheidet die Policy dieser Standardkette über das Schicksal des Pakets. Bei Verwendung in einer selbst definierten Regelkette wird die Bearbeitung des Paketes nach der aufrufenden Stelle fortgesetzt.
(keine) Man kann auf die Option -j verzichten. Das Paket wird dann nur gezählt und seine Prüfung mit der nächsten Regel fortgesetzt.

Das sind nur einige wenige Optionen und Aktionen, welche hauptsächlich zur reinen Filterung angewendet werden. iptables kennt noch viele weitere Optionen und Möglichkeiten.

Policy

Aufgrund der Vielzahl von Möglichkeiten wird nicht immer für jedes mögliche Paket (d.h. Kombination aus Protokoll, Netzwerkschnittstelle, Port etc.) eine Filterregel existieren. Daher wird für jede Standardkette als Grundsatzregel (policy) eine Methode für den Fall vereinbart, dass keine Filterregel zutrifft.

Die Policy setzt sich aus dem Tabellennamen, dem Namen der Standardkette und der Methode (DROP oder ACCEPT) zusammen. Beispiele:

iptables -P INPUT DROP
iptables -t mangle -P PREROUTING ACCEPT 

Im ersten Beispiel wird festgelegt, dass für die Standardkette INPUT in der Tabelle filter (im Befehl nicht explizit erwähnt, da Standard) alle eingehenden Pakete verworfen werden, sofern sie keiner Filterregel entsprechen. Im zweiten Beispiel wird für die Standardkette PREROUTING in der Tabelle mangle als Standard-Verfahrensweise „vorläufig annehmen“ eingestellt, was auch der Vorgabe für alle Standardketten entspricht.

Für eine selbst definierte Regelkette kann keine Policy festgelegt werden; sie ist unveränderlich immer RETURN.

Weitere Optionen und Möglichkeiten

Neben den oben beschriebenen Funktionen können mit Hilfe von iptables noch viele andere Regeln und Aktionen für Netfilter erstellt werden.

  • Beispielsweise beherrscht iptables / Netfilter mit dem Modul Connection Tracking auch "stateful inspection", d.h. Pakete werden in Abhängigkeit vom Zustand der Verbindung geprüft. „Zustand der Verbindung“ bedeutet, ob das Paket z.B. zu einer bestehenden Verbindung gehört (also ein Folgepaket ist) oder ob es sich um eine neue Verbindung handelt. Lese weitere Erläuterungen im Beispiel Firewall.

  • Weiterhin lassen sich mit iptables in Abhängigkeit vom Paket (bzw. der Paketprüfung) Sprünge in andere Regelketten realisieren.

  • Außerdem können mit iptables eine Vielzahl von Paketmanipulationen durchgeführt werden, die unter dem Begriff NAT (engl. Network Address Translation, Netzwerkadressumschreibung) zusammengefasst werden. Die Konfiguration solcher Funktionen wird in einem eigenen Artikel behandelt: Router/NAT

Eine sehr ausführliche Übersicht und Anleitung geben die Dokumentation 🇬🇧 auf der Homepage sowie die Manpages zu iptables:

man iptables
man iptables-extensions  

Beispiele

Regelwerk anzeigen

Zur Überprüfung, welche Filterregeln in einer Tabelle bereits hinterlegt sind, kann man diesen Befehl benutzen:

iptables -t filter -L 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Das funktioniert natürlich auch mit den anderen Tabellen, wenn man anstatt filter deren Namen raw, mangle oder nat einträgt.

In der Grundinstallation von Ubuntu sollten in jeder Tabelle nur leere Standardketten mit jeweils der Policy ACCEPT angezeigt werden.

Die Ausgabe von iptables mit Option -L kann noch mit zusätzlichen Optionen beeinflusst werden:

Zusätze für Option -L
AktionBeschreibung
-v Die Regeln werden mit ihren Zählern gezeigt.
-n Es wird nicht versucht, numerische Angaben bei Adressen und Ports in Namen zu übersetzen. (Eine solche Übersetzung verursacht zusätzlichen Netzwerkverkehr, welcher bei einer Diagnose stören kann.)

Im laufenden Betrieb ist zur Kontrolle der Arbeitsweise dieser Befehl praktisch: (Hier am Beispiel der Tabelle nat.)

iptables -t nat -nvL 

Regelsatz löschen

Zur Entfernung eines Regelsatzes (also aller Regeln in jeder Regelkette einer Tabelle, hier beispielhaft. mangle) dient dieser Befehl:

iptables -t mangle -F 

Damit werden in selbst definierten Regelketten zwar alle Regeln gelöscht, jedoch die dann leeren Ketten selbst nicht entfernt. Das erfolgt erst mit einem weiteren Befehl, der jedoch nur bei leeren Regelketten funktioniert:

iptables -t mangle -X 

Vorstehende Befehle ändern auch nicht die Policy! Die Rücksetzung auf den Standardwert ACCEPT muss man für jede Standardkette einzeln vornehmen:

iptables -t mangle -L | grep Chain | while read _ Chain _ ; do iptables -P $Chain ACCEPT ; done 

Firewall

Im Artikel Router/Paketfilter wird ein mit iptables realisierter Paketfilter als Firewall für einen Router auf der Grenze (border) des eigenen Bereiches zum Internet vorgestellt.

Hier wird zur Illustration der Bedienung von iptables eine rudimentäre Personal Firewall betrachtet, welche

  1. die Kommunikation im Rechner intern und

  2. im lokalen Netzwerk (hier beispielhaft: 192.168.178/24) uneingeschränkt zulässt,

  3. allen Stationen im Internet die Kontaktaufnahme mit diesem Rechner verbietet,

  4. dem lokalen Rechner die Kontaktaufnahme zu Stationen im Internet nur über die Protokolle HTTP (= Port 80) und HTTPS (= Port 443) erlaubt.

Hinweis:

In der Desktop Grundinstallation hat Ubuntu keine offenen Ports, die speziell über eine Personal Firewall geschützt werden müssten. Die bei einer Grundinstallation wenigen offenen Ports sind nur vom eigenen Rechner aus oder aus dem Netzwerk vor dem Gateway zum Internet (d.h.z.B. LAN des eigenen Routers) erreichbar, jedoch nicht aus dem Internet. Weitere Informationen findet man in den Artikeln Sicherheit und Personal Firewalls.

Zur Einrichtung des Regelwerks ist iptables mehrmals mit folgenden Optionen aufzurufen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
-F									# in Tabelle filter alle Regeln löschen
-X									# in Tabelle filter zusätzliche Ketten löschen
-P INPUT	ACCEPT			 				# Policy für Tabelle filter, INPUT Chain 
-P OUTPUT	ACCEPT			 				# Policy für Tabelle filter, OUTPUT Chain
-P FORWARD	ACCEPT		 					# Policy für Tabelle filter, FORWARD Chain

-N LogDrop
-A LogDrop	-j LOG
-A LogDrop	-j DROP

-A INPUT	-i lo					-j ACCEPT 	# eingehende Kommunikation für lo (Localhost) zulassen
-A INPUT	-m state    --state INVALID,UNTRACKED	-j DROP		# Schrott von draussen verbieten
-A INPUT	-s 192.168.178.0/24			-j ACCEPT	# LAN erlauben
-A INPUT	-m state  ! --state NEW			-j ACCEPT	# Verbindungsaufbau aus dem Internet verbieten
-A INPUT						-j LogDrop	# Catch all

-A OUTPUT	-o lo					-j ACCEPT	# ausgehende Kommunikation für lo (Localhost) zulassen
-A OUTPUT	-d 192.168.178.0/24			-j ACCEPT	# LAN erlauben
-A OUTPUT	-m state    --state RELATED,ESTABLISHED	-j ACCEPT	# ausgehende Pakete für existierende Verbindungen zulassen
-A OUTPUT	-p tcp --dport  80			-j ACCEPT	# Verbindungsaufbau von drinnen für HTTP Verbindungen zulassen
-A OUTPUT	-p tcp --dport 443			-j ACCEPT	#   und ebenso für HTTPS
-A OUTPUT						-j LogDrop	# Catch all
  • In der Zeilen 1-5 werden in der Tabelle filter zuerst alle Regeln gelöscht und ggf. verbliebene leere selbst definierte Regelketten entfernt und dann für die Standardketten die Standard-Policy ACCEPT definiert.

  • Oft wird empfohlen, die Policies auf DROP zu ändern, weil dann alle „Ports geschlossen werden“ und man dann „sicherer“ wäre. Das beruht auf einem Missverständnis: Da Setzen der Policies selbst ändert gar nichts daran, ob ein Port im fremden Portscanner als „offen“, „geschlossen“ oder „gefiltert“ erscheint. Das Ergebnis des fremden Portscanners kann nur dadurch geändert werden, indem man Pakete tatsächlich verwirft oder nicht verwirft und ob man verworfene Pakete zurück meldet oder nicht. In diesem Beispiel werden die Policies auf dem Standardwert ACCEPT belassen, weil die Policies ohnehin niemals benutzt werden sollen. Dies erfordert Regelsätze, die ausnahmslos jedes Paket erfassen.

  • In den Zeilen 7-9 wird eine eigene Regelkette definiert, welche später als Unterprogramm aufgerufen werden kann. Alles was in diese Regelkette gerät, wird im Systemlog notiert und vernichtet.

  • Die Zeilen 11 und 17 realisieren Aufgabe 1. Unter Linux läuft ein Teil der Interprozesskommunikation über das (interne) Netzwerk unter Verwendung der Netzwerkschnittstelle lo (z.B. XServer oder CUPS). Blockierung dieser Schnittstelle kann zu Fehlfunktionen bis hin zum Einfrieren/Absturz des Systems führen.

  • Zeilen 13 bzw. 18 erlauben eingehenden Verkehr von allen Stationen im LAN (d.h. Absender Adresse in 192.168.178/24) bzw. ausgehenden Verkehr an alle Stationen im LAN (d.h. Empfänger Adresse in 192.168.178/24).

  • Zeile 12 ist optional und verbietet mit Hilfe des zusätzlichen Moduls Connection Tracking, hier in der Variante state, Paket mit Sonderstatus INVALID oder UNTRACKED, die aber ohnehin vom Netzwerkstack verworfen würden. Da solcher Schrott auch von Stationen im LAN unerwünscht ist, steht die Regel vor der Regel in Zeile 13. Das Modul state kennt außer diesen beiden auch als Status NEW, ESTABLISHED und RELATED, die in anderen Zeilen verwendet werden.

  • Zeile 14 realisiert Aufgabe 3: Nach der Regel in Zeile 13 erreichen nur noch Pakete von Absendern außerhalb des LANs diese Zeile, also aus dem Internet. (Das stimmt nicht exakt, weil es Multicast-Verkehr übersieht! Aber für das Beispiel ist es richtig genug.) Verkehr von Stationen im Internet erlauben wir, aber nur, wenn es keine neue Kontaktaufnahme ist.

  • Zeile 15 (und entsprechend auch Zeile 22) übergibt alle restlichen Pakete an die Regelkette LogDrop zur Vernichtung. Es ist eine gute Praxis, die Regelketten immer mit einer solchen "Catch-All"-Regel zu beenden. Alternativ kann man auch andere Aktionen vorsehen oder auch eine reine Zählregel verwenden. Die Aktion LOG macht natürlich nur dann Sinn, wenn man auch regelmäßig die Systemlogs liest. Eine Überwachung und Nachdenken über die Pakete, welche das Ende der Regelketten INPUT und OUTPUT erreichen, sollte sich aber jeder Systemverwalter als Pflicht auferlegen.

  • Aufgabe 4: Zeile 19 erlaubt dem lokalen Rechner, bestehende Verbindungen weiterhin aufrecht zu erhalten, indem Pakete an Rechner im Internet gesendet werden. Der Empfang solcher Pakete wurde bereits in Zeile 14 erlaubt. Diese beiden Zeilen erlauben aber noch nicht den Aufbau neuer Verbindungen.

  • Um dem lokalen Rechner den Aufbau von Verbindungen zu erlauben, wird dies in Zeilen 20 und 21 explizit erlaubt. Jedoch werden nicht beliebige Verbindungen, sondern nur Verkehr über das Protokoll TCP mit den Zielports 80 und 443 zugelassen.

In der Datei /etc/services befindet sich eine vollständige Liste aller (systemspezifischen) Ports und der zugehörigen Protokolle.

Es handelt sich hier um ein Beispiel und keine vollständig eingerichtete Firewall!

Regelwerk speichern und laden

Hinweis:

Die mit iptables erstellten Regeln sind flüchtig, d.h. sie bleiben nur bis zum Ausschalten des Computers erhalten!

Will man dauerhaft Regeln einrichten, müssen die Regeln in Dateien gesichert und beim Hochlauf wieder aus diesen Dateien in den Kernel geladen werden. Dazu kann man ein Skript verwenden, welches von Init-System (systemd) automatisch gestartet wird.

Das Paket iptables bringt auch die Programme iptables-save und iptables-restore mit, die tun, was ihre Namen versprechen, wenn sie von root benutzt werden.

iptables-save  > /etc/Netfilter
ip6tables-save > /etc/Netfilter-6 

bzw.

iptables-restore  < /etc/Netfilter
ip6tables-restore < /etc/Netfilter-6 

iptables-restore löscht die aktiven Regeln, bevor es die Regeln aus der Datei in den Kernel schreibt. Wenn man dies nicht möchte, sondern die Regeln aus der Datei den aktiven Regelsatz ergänzen sollen, kann man dies mit der Option --noflush erreichen.

Weitere Details kann man der Manpage des Programms entnehmen:

man iptables-save
man iptables-restore 

Alternativ zur Benutzung dieser beiden Programme kann man natürlich auch die vollständigen Befehle für iptables in ein Skript schreiben.

Im UbuntuUsers.de-Wiki gibt es hierfür bereits einige nützliche Skripte:

  • IPTadmin – Bash-Skript zum Laden/Überwachen/Sichern/Verwalten von Netfilter-Regelwerken

  • nathelper – Perl-Skript zum Einrichten von NAT

In den Ubuntu-Paketquellen gibt es mehrere Hilfsprogramme zur Einrichtung und Verwaltung von Regelwerken, teilweise auch mit graphischer Bedienoberfläche.

Graphische Benutzeroberfläche

Die richtige Konfiguration von iptables auf der Kommandozeile ist sicherlich alles andere als trivial oder übersichtlich, insbesondere wenn man komplexere Regelwerke erstellen möchte (z.B. für einen Netzwerkrouter, der ggf. auch noch Firewall-Funktionalität haben soll).

Es gibt eine Reihe von (teilweise graphischen) Benutzeroberflächen, die diese Arbeit mit iptables erleichtern sollen. So sind z.B. folgende Oberflächen über die Paketverwaltung[1] von Ubuntu verfügbar:

  • firehol – Konfigurationswerkzeug für Firewalls, benutzt eigene Sprache zur Formulierung der Regeln

  • guidedog – Qt5-GUI für NAT

  • pyroman – Konfigurationswerkzeug für Firewalls in komplexen Netzwerken

  • shorewall – Konfigurator für Router-/Firewall-/Gateway-Anwendungen, arbeitet mit Beschreibungen in Dateien

  • ufw – Frontend für iptables, um die Handhabung der Netfilter-Module zu vereinfachen

Diese Revision wurde am 20. Mai 2022 13:30 von kB erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Sicherheit, Netfilter, Netzwerk, Paketfilter, Firewall, Internet