it-wiki:netzwerk:iptables
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
it-wiki:netzwerk:iptables [2014/09/02 07:22] – 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. | ||
Zeile 7: | Zeile 7: | ||
Iptables arbeitet auf der [[wpde> | Iptables arbeitet auf der [[wpde> | ||
- | \\ ==== Funktionsweise - Chains/ | + | \\ ===== Aufbau und Funktion ===== |
+ | ==== 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}} | {{Iptables1.png}} | ||
- | \\ ==== Funktionsweise - Policy ==== | + | \\ |
+ | ==== Funktionsweise - Policy ==== | ||
Mithilfe von iptables kann man sehr fein definieren, was mit einzelnen Paketen, welche die unterschiedlichen Ketten durchlaufen, | Mithilfe von iptables kann man sehr fein definieren, was mit einzelnen Paketen, welche die unterschiedlichen Ketten durchlaufen, | ||
Zeile 37: | Zeile 39: | ||
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. | 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. | ||
- | \\ ====Funktionsweise - Tabellen ==== | + | \\ ==== Funktionsweise - Tabellen ==== |
Regeln und Ketten werden bei iptables in verschiedenen Tabellen zusammengefasst. Diese Tabellen dienen grundlegenden Aufgaben: | Regeln und Ketten werden bei iptables in verschiedenen Tabellen zusammengefasst. Diese Tabellen dienen grundlegenden Aufgaben: | ||
Zeile 62: | Zeile 64: | ||
|-D|Die erste passende Regel in einer Kette löschen| | |-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 | ||
+ | < | ||
- | ==== iptables Regeln dauerhaft speichern ==== | + | 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.1409642566.txt.gz · Zuletzt geändert: von marko