it-wiki:netzwerk:iptables
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
it-wiki:netzwerk:iptables [2014/09/02 06:55] – angelegt marko | it-wiki:netzwerk:iptables [2014/09/02 10:51] (aktuell) – marko | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Firewall mit iptables Rules ====== | ====== Firewall mit iptables Rules ====== | ||
- | ==== Grundsätzliches ==== | + | ===== Grundsätzliches |
Mithilfe des Userspace-Programms iptables (bzw. ip6tables) lassen sich Ketten und Regeln in Form einer Tabelle erstellen, welche dann von der im Linux-Kernel enthaltenen Firewall abgearbeitet werden. | Mithilfe des Userspace-Programms iptables (bzw. ip6tables) lassen sich Ketten und Regeln in Form einer Tabelle erstellen, welche dann von der im Linux-Kernel enthaltenen Firewall abgearbeitet werden. | ||
Das Konfigurieren mittels iptables kann als eine Sicherheitsmaßnahme für sein System verwendet werden, z.B. durch Kontrolle und Einschränkung des Netzverkehrs, | Das Konfigurieren mittels iptables kann als eine Sicherheitsmaßnahme für sein System verwendet werden, z.B. durch Kontrolle und Einschränkung des Netzverkehrs, | ||
- | Iptables arbeitet auf der [[wpde> | + | Iptables arbeitet auf der [[wpde> |
+ | \\ ===== Aufbau und Funktion ===== | ||
==== Funktionsweise - Chains/ | ==== Funktionsweise - Chains/ | ||
Egal, ob ein Paket vom eigenen Rechner ins Netzwerk geschickt werden soll, oder von außerhalb zum Rechner gelangt, oder aber der Rechner das Paket an der einen Stelle annehmen und einfach zur nächsten weiterleiten soll, so durchläuft dieses Paket bei iptables immer mindestens eine Chain (dt. Kette" | Egal, ob ein Paket vom eigenen Rechner ins Netzwerk geschickt werden soll, oder von außerhalb zum Rechner gelangt, oder aber der Rechner das Paket an der einen Stelle annehmen und einfach zur nächsten weiterleiten soll, so durchläuft dieses Paket bei iptables immer mindestens eine Chain (dt. Kette" | ||
- | * INPUT - Der Name der Kette zeigt auch schon die Funtkionsweise auf: Ein Paket wird lokal zugestellt. | + | |
- | | + | * OUTPUT - Ein Paket, welches vom eigenen Rechner erzeugt wurde und weggeschickt werden soll, wird mindestens diese Chain durchlaufen. |
- | | + | * FORWARD - Diese Kette dient allen Paketen, welche geroutet aber nicht lokal zugestellt werden. |
- | | + | * PREROUTING - Pakete durchlaufen diese Chain, noch vor dem Routing. |
- | | + | * POSTROUTING - Pakete durchlaufen diese Kette, nachdem sie geroutet wurden, aber noch bevor sie weitergeleitet werden. |
+ | {{Iptables1.png}} | ||
+ | \\ | ||
+ | ==== Funktionsweise - Policy ==== | ||
+ | Mithilfe von iptables kann man sehr fein definieren, was mit einzelnen Paketen, welche die unterschiedlichen Ketten durchlaufen, | ||
+ | Erreicht ein Paket aber das Ende der Kette, ohne dass eine der definierten Regeln Einfluss auf das Paket genommen hat, so greift die Policy. Diese Entscheidet dann, was mit all' den Paketen geschehen soll, welche das Ende der Tabelle erreichen. Hierzu dienen meist ACCEPT (Pakete dürfen Filterkette passieren), DROP (Paket wird als ungültig verworfen) und REJECT (Paket wird verworfen und ein ICMP Paket mit einer Meldung wie "port unreachable" | ||
+ | Wenn man also z.B. alle eingehenden Pakete, auf welche keine Regel zutrifft, verwerfen möchte, so würde das wie folgt aussehen: | ||
+ | < | ||
+ | \\ ==== Funktionsweise - Regeln ==== | ||
+ | Regeln werden in jeder Chain aufgestellt und können Pakete unterschiedlicher Protokolle, Herkunft, Ziele, usw. betreffen. | ||
+ | Ein Paket durchläuft von der 1. Regel, bis zur leztzten Regel solange die Kette, bis eine Regel auf das Paket zutrifft, oder das Ende der Kette erreicht ist. In letzterem Fall greift dann die oben beschriebene Policy. | ||
+ | < | ||
+ | # iptables -A INPUT -s 192.168.178.61 -p icmp -j DROP</ | ||
+ | in diesem Beispiel, würde ein ICMP-Paket, welche von dem Host mit der IP-Adresse 192.168.178.5 stammt, akzeptiert werden. Das Paket würde an dieser Stelle die Kette verlassen und dürfte passieren. Ein ICMP-Paket, welches von der Adresse 192.168.178.61 stammen würde, würde die Kette bis zur 2. Regel durchlaufen (da die erste nicht auf das Paket zutrifft) und dann laut Regel verworfen werden. | ||
- | ==== iptables Regeln dauerhaft speichern ==== | + | \\ ==== Funktionsweise - Tabellen ==== |
+ | |||
+ | Regeln und Ketten werden bei iptables in verschiedenen Tabellen zusammengefasst. Diese Tabellen dienen grundlegenden Aufgaben: | ||
+ | ^Tabelle^Aufgabe^ | ||
+ | |Filter|Die Standardtabelle von iptables. Dient der reinen Paketfilterung. Beinhaltet die Ketten INPUT, OUTPUT, FORWARD.| | ||
+ | |NAT|Diese Tabelle wird für Adressumsetzung und Routing benötigt. Beinhaltet die Ketten PRE-/ | ||
+ | |MANGLE|Dient der Paketmodifikation. Beinhaltet PRE-/ | ||
+ | |RAW|Paket durchläuft Ketten dieser Tabelle als Erstes. Dient dazu um Ausnahmen vom Connection Tracking zu definieren oder Pakete mittels TRACE-Kette zu verfolgen. Beinhaltet die Ketten TRACE, PREROUTING, OUTPUT.| | ||
+ | |||
+ | \\ ==== Grundlegende Parameter | ||
+ | |||
+ | Hier einmal ein paar grundlegende Parameter, um iptables zu konfigurieren: | ||
+ | ^Parameter^Beschreibung^ | ||
+ | |-N|Legt eine neue Kette an| | ||
+ | |-X|Löscht eine leere, selbsterstellte Kette| | ||
+ | |-P|Ändert die Policy einer Kette| | ||
+ | |-F|Löscht alle Regeln aus einer Kette| | ||
+ | |-Z|Paket- und Bytezähler aller Regeln einer Kette = 0| | ||
+ | |-L|Auflisten aller Regeln| | ||
+ | |-A|Eine neue Regel in einer Kette erstellen| | ||
+ | |-I|Eine neue Regel in einer bestimmten Position einfügen| | ||
+ | |-R|Eine Regel an eine bestimmte Position in der Kette ersetzen| | ||
+ | |-D < | ||
+ | |-D|Die erste passende Regel in einer Kette löschen| | ||
+ | |||
+ | Ein paar Beispiele zur Verdeutlichung einer Möglichen Anwendung: | ||
+ | |||
+ | "Ping of Death" | ||
+ | |||
+ | Mittels des Befehls "ping < | ||
+ | |||
+ | So kann ein Angreifer, einfach mit mehreren Rechnern ein "ping 192.168.178.5 -i 0.00000001" | ||
+ | |||
+ | < | ||
+ | |||
+ | Damit werden alle eingehenden ICMP-Pakete, | ||
+ | |||
+ | Mit | ||
+ | |||
+ | < | ||
+ | |||
+ | wird jetzt auch die neue Regel angezeigt. | ||
+ | |||
+ | Ein | ||
+ | |||
+ | < | ||
+ | |||
+ | löscht die angelegte Regel in der Kette INPUT wieder. | ||
+ | |||
+ | Bei einem "Ping of Death" kann es auch sinnvoll sein, ein REJECT durchzuführen, | ||
+ | |||
+ | < | ||
+ | |||
+ | Mit diesem Befehl werden alle ICMP-Pakete, | ||
+ | |||
+ | Man kann auch ganz einfach " | ||
+ | |||
+ | < | ||
+ | |||
+ | vollkommen aus. Es kann allerdings passieren, dass (je nach DNS-Konfiguration/ | ||
+ | |||
+ | \\ ==== Zusätzliche Paket-Manipulation ==== | ||
+ | |||
+ | Neben DROP, REJECT und ACCEPT existieren allerdings noch zusätzliche Optionen zur Paket-Manipulation. | ||
+ | |||
+ | Folgende Optionen stehen unter anderem zur [[wpde> | ||
+ | |||
+ | SNAT (Source NAT) - manipuliert die Herkunftsadresse eines Paketes. | ||
+ | |||
+ | DNAT - Destination NAT - manipuliert die Ziel-Adresse eines Paketes. | ||
+ | |||
+ | MASQERADE - " | ||
+ | |||
+ | REDIRECT - Diese Option ändert die Ziel-adresse eines Paketes in die des lokalen Rechners. | ||
+ | |||
+ | \\ ==== Explizite Erweiterungen ==== | ||
+ | |||
+ | Neben der schon recht umfangreichen Liste an Optionen, bieten sich noch explizite Erweiterungen an. Diese lassen sich mit dem Parameter -m aufrufen: | ||
+ | |||
+ | -m mac -> Hiermit kann man MAC-Adressen in Frames manipulieren. | ||
+ | |||
+ | -m limit -> Mit dieser Option lassen sich Regeln mit " | ||
+ | |||
+ | -m owner -> manipuliert Pakete auf UID/GID/PID hin. | ||
+ | |||
+ | -m state -> Hiermit können Segmente auf Verbindungszustände hin gefiltert werden. Mögliche Verbindungszustände sind wie folgt: | ||
+ | ^Status^Beschreibung^ | ||
+ | |NEW|Ein Segment, welches eine neue Verbindung aufbaut.| | ||
+ | |ESTABLISHED|Pakete und Segmente, welcher zu einer bereits aufgebauten Verbindung gehören.| | ||
+ | |RELATED|Betrifft " | ||
+ | |INVALID|Pakete, | ||
+ | |||
+ | \\ ==== Protokollierung ==== | ||
+ | |||
+ | Nachdem nun die ersten Schritte mit " | ||
+ | |||
+ | Es ist möglich, ebenfalls mittels " | ||
+ | |||
+ | Es werde ausgehenden DNS-Anfragen protokolliert: | ||
+ | < | ||
+ | #iptables -A OUTPUT -p udp --dport 53 -j ACCEPT</ | ||
+ | |||
+ | Normalerweise durchläuft ein Paket die Tabelle nicht mehr, sobald DROP, ACCEPT oder REJECT über das Schicksal des Paketes entscheiden. Bei LOG wird das Paket allerdings nur " | ||
+ | |||
+ | Man kann hinter -j LOG noch einige weitere Optionen dranhängen, | ||
+ | ^Optionen/ | ||
+ | |--log-level < | ||
+ | |--log-uid|Protokolliert bei einem lokal erzeugten Paket (also ein Paket, welches die OUTPUT-Kette passiert) die UID des Benutzers mit, welcher das Paket erzeugt hat.| | ||
+ | |--log-tcp-sequence|Protokolliert die Sequenznummern der einzelnen TCP-Verbindungen mit.| | ||
+ | |--log-tcp-options|Protokolliert mögliche Optionen des TCP-Headers mit.| | ||
+ | |--log-ip-options|Protokolliert mögliche Optionen des IP-Headers mit.| | ||
+ | |--log-prefix < | ||
+ | |||
+ | Von den Log-Leveln gibt es 7 Stück: | ||
+ | ^Level^Bedeutung^ | ||
+ | |1|alert| | ||
+ | |2|critical| | ||
+ | |3|error| | ||
+ | |4|warning| | ||
+ | |5|notice| | ||
+ | |6|info| | ||
+ | |7|debug| | ||
+ | |||
+ | Eine solche Log-Ausgabe sieht im ersten Moment etwas kryptisch aus, enthält auf den zweiten Blick allerdings alle notwendigen Informationen: | ||
+ | |||
+ | < | ||
+ | |||
+ | In diesem Fall sieht man nochmal deutlich; das ausgehende UDP-Datagram auf Port 53 (und einige Zusatzinformationen), | ||
+ | |||
+ | Was ebenfalls auffällt: " | ||
+ | |||
+ | Aber wo finde ich jetzt diesen Log-Eintrag? | ||
+ | < | ||
+ | kern.alert | ||
+ | kern.critical | ||
+ | kern.error | ||
+ | kern.warning | ||
+ | kern.notice | ||
+ | kern.info | ||
+ | kern.debug | ||
+ | </ | ||
+ | Hierbei sollte man allerdings beachten, dass auch alle anderen Kernel-Meldungen nach in die entsprechenden Log-Dateien geschrieben werden. Es ist sinnvoll hierfür die --log-prefix Option zu nutzen, um daraus später vernünftige Protokolle basteln zu können. | ||
+ | |||
+ | Falls man einen anderen System-Logger als den BSD-Syslogd verwendet (z.B. syslog-ng) so müssen andere Konfigurationsdateien geändert werden, damit die Ausgaben in entsprechende Log-Files (oder wohin auch immer) geschrieben werden. | ||
+ | |||
+ | Bei der Protokollierung sollte einem bewusst sein, dass je nach Nutzung des Netzwerks, durchaus Logfiles von > | ||
+ | |||
+ | \\ ==== Type of Service ==== | ||
+ | |||
+ | Im IP-Header kann das 8Bit große Type of Service Feld manipuliert und so die Priorisierung des Paketes gesetzt werden (Quality of Service). | ||
+ | |||
+ | Betrachte man folgendes Beispiel: | ||
+ | |||
+ | < | ||
+ | |||
+ | Hierbei werden die IP-Pakete bereits in der MANGLE-Tabelle, | ||
+ | ^Value^Effekt^ | ||
+ | |0x10|Minimale Verzögerung| | ||
+ | |0x08|Maximaler Durchsatz| | ||
+ | |0x04|Maximale Zuverlässigkeit| | ||
+ | |0x02|Minimale Kosten| | ||
+ | |0x00 (default)|Normaler Service | | ||
+ | |||
+ | \\ ===== iptables Regeln dauerhaft speichern | ||
Dieser Abschnitt zeigt verschiedene Möglichkeiten, | Dieser Abschnitt zeigt verschiedene Möglichkeiten, |
it-wiki/netzwerk/iptables.1409640909.txt.gz · Zuletzt geändert: von marko