In diesem Abschnit werden wir versuchen die Benutzung der neuen Netfilter Targets zu erklären. Die Patche werden in alphabetischer Reihenfolge besprochen. Wir werden hier nicht auf Patche eingehen, die andere Patche negativ beeinflussen; das kommt später mal.
Generell gilt für Targets, dass du die Hilfe für ein bestimmtes Modul wie folgt abfragen kannst:
# iptables -j TARGET_DAS_DU_WILLST --help
Dies wird dir die normale Hilf von iptables ausgeben zuzüglich der speziellen Hilfe zu ``TARGET_DAS_DU_WILLST'' am Ende.
Dieser Patch von Matthew G. Marsh <mgm@paktronix.com> fügt ein neues Target hinzu, welches dir gestattet den TOS eines Paketes auf einen beliebigen Wert zu setzen.
Wenn du zum Beispiel möchtest dass der TOS für alle ausgehenden Pakete den Wert 15 hat, benutzt du folgende Regel:
# iptables -t mangle -A OUTPUT -j FTOS --set-ftos 15
# iptables -t mangle --list
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
FTOS all -- anywhere anywhere TOS set 0x0f
Unterstützte Optionen für das FTOS Target sind:
-> Setzt das TOS Feld im Paketheader auf den gegebenen Wert. Der Wert kann dezimal (z.B. 32
) oder hexadezimal (z.B. 0x20
) angegeben werden.
Dieser Patch von Fabrice MARIE <fabrice@netfilter.org> fügt ein neues Target hinzu, welches dir gestattet alle IP Optionen von einem IPv4 Paket zu entfernen.
Es wird einfache auf die folgende Art aktiviert:
# iptables -t mangle -A PREROUTING -j IPV4OPTSSTRIP
# iptables -t mangle --list
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
IPV4OPTSSTRIP all -- anywhere anywhere
Dieses Target hat keine Optionen.
Dieser Patch von Gianni Tedesco <gianni@ecsc.co.uk> fügt ein neues Target hinzu, welches dir gestattet verworfene Pakete an den Userspace über den Netlink Socket zu senden.
Wenn du zum Beispiel alle Pings verwerfen und sie and den Userspace Netlik Socket weiterleiten möchtest, kannst du das wie folgt erreichen:
# iptables -A INPUT -p icmp --icmp-type echo-request -j NETLINK --nldrop
# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
NETLINK icmp -- anywhere anywhere icmp echo-request nldrop
Unterstützte Optionen für das NETLINK Target sind:
-> Weiterreichen und verwerfen.
-> Mark setzen.
-> Paketgröße limitieren.
Für weitere Informationen über Netlink Sockets, kannst du dir die Netlink Sockets Tour ansehen.
Dieser Patch von Svenning Soerensen <svenning@post5.tele.dk> fügt ein neues Target hinzu, welches dir gestattet ein statisches 1:1 Mapping für Netzwerk Adressen vorzunehmen, wobei die Host Adressen erhalten bleiben.
Wenn du zum Beispiel möchtest das alle einkommenden Pakete von 1.2.3.0/24 nach 5.6.7.0/24 gemappt werden, kannst du das wie folgt erreichen:
# iptables -t nat -A PREROUTING -d 1.2.3.0/24 -j NETMAP --to 5.6.7.0/24
# iptables -t nat --list
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
NETMAP all -- anywhere 1.2.3.0/24 5.6.7.0/24
Unterstützte Optionen für das NETMAP Target sind:
-> Netwerk Address auf die gemappt werden soll.
Dieser Patch von Martin Josefsson <gandalf@wlug.westbo.se> fügt ein neues Target hinzu, welches ähnlich dem SNAT ist, jedoch dem Client für jede Verbindung die gleiche Adresse zuweist.
Wenn du zum Beispiel Quelladressen auf den Bereich 1.2.3.4-1.2.3.7 abbilden willst, kannst du folgende Regel verwenden:
# iptables -t nat -A POSTROUTING -j SAME --to 1.2.3.4-1.2.3.7
# iptables -t nat --list
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SAME all -- anywhere anywhere same:1.2.3.4-1.2.3.7
Optionen die vom SAME Target unterstützt werden sind:
-> Adressen auf die die Quelladressen gemappt werden. Kann auch mehrfach für mehrere Ranges spifiziert werden.
-> Die Ziel IP nicht für die Quellauswahl verwenden.
Dieser Patch von Marc Boucher <marc+nf@mbsi.ca> fügt ein neues Target hinzu, welches dir gestattet den MSS Wert von TCP SYN Paketen zu untersuchen und zu ändern um die maximale Paketgröße für die Verbindung festzulegen.
Wie Marc selbs sagt: DIES IST EIN HACK, der benutzt wird um shon kiminell gehirntote ISPs oder Server die ICMP Fragmentation blocken zu überwinden.
Die typische Anwendung ist wie folgt:
# iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
# iptables --list
Chain FORWARD (policy ACCEPT)
target prot opt source destination
TCPMSS tcp -- anywhere anywhere tcp flags:SYN,RST/SYN TCPMSS clamp to PMTU
Optionen die vom tcp-MSS Target unterstützt werden (schließen sich gegenseitig aus):
explizites setzen der MSS Option auf ``value''.
automatisches Anpassen des MSS Wertes (Pfad_MTU - 40).
Dieser Patch von Harald Welte <laforge@gnumonks.org> fügt ein Target hinzu, mit dem der Benutzer die TTL eines Paketes setzen oder erhöhen/vermindern kann.
Wenn du zum Beispiel möchtest das alle ausgehenden Verbindungen eine TTL von 126 erhalten, kannst du wie folgt vorgehen:
# iptables -t mangle -A OUTPUT -j TTL --ttl-set 126
# iptables -t mangle --list
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
TTL all -- anywhere anywhere TTL set to 126
Unterstützte Optionen für das TTL Target sind:
-> Setze TTL auf <value>.
-> Vermindert die TTL um <value>.
-> Erhöhe die TTL um <value>.
Dieser Patch von Harald Welte <laforge@gnumonks.org> fügt ein neues Target hinzu, welches einen erweiterten Loggingmechanismus als das standard LOG Target zur Verfügung stellt. Das `libipulog/' Verzeichnis enthält eine Library um ULOG Meldungen zu empfangen.
Harald betreibt eine Website auf der die Dokumentation von ULOG bereit stellt. Es besteht also keinen Grund hier weiter darauf einzugehen..
Dieser Patch von Cédric de Launois <delaunois@info.ucl.ac.be> für ein Target hinzu, das es dir gestattet Pakete direkt and ein bestimmtes Interface weiterzuleitet auch und gerade dann, wenn die IP Adresse des Paketes eine IP Adresse des Router selbst ist. Da der Kernel solche Pakete lokal ausliefern würde, können solche Pakete nicht mit dem stadard Routing zu anderen Computern weitergeleitet werden. Manchmal ist es sinnvoll genau dies zu tun ohne die Pakete zu verändern.
Optionen die vom ROUTE Target unterstützt werden sind:
Sende das Paket direkt zu dem über den Namen dem spezifizerten Interface.
Sende das Paket direkt zu dem über den Index spezifizierten Interface. Das ist sinnvoll, wenn du eine Regel entfernen möchtest die an ein Interface gebunden ist, welches nicht mehr existiert (z.B. ein Tunnel der abgebaut wurde).
Als Beispiel lass uns annehmen du möchtest einen Service auf einem Server in deinem internen Netz installieren; sagen wir ssh. Du möchtest aber auch, das der Service nach aussen so aussieht als wenn er auf denem Router laufen würde, was natürlich einschließt, dass keine Pakete verändert werden. Diese Situation verbietet das Verwenden des standard Mechnismus der Portweiterleitung.
Die Lösung besteht dank dieses ROUTE Targets und einem IPIP Tunnep einfach darin, die Pakete mit Zielport 22 neu an den Rechner zu routen, der die gleiche IP Adresse hat wie dein Router und den ssh Servive betreibt.
Zeit für ein ASCII Bild:
eth0 +------+ 192.168.0.1 192.168.0.2 +----+ ----------------|router|--------------------------------|host| IP: 150.150.0.1 +------+ +----+ | | tunl1 IP: 150.150.0.1 | | | +------------------------------------+ | +----------------------------------------+ IPIP tunnel
Es ist nicht möglich solche Pakete mit dem standard Routing umzuleiten, einfach weil der Kernel davon ausgeht, dass diese Pakete lokal ausgeliefert werden müssen (sie haben die gleiche IP Address wie der Router selbst).
Das ROUTE Target stellt einen Weg zur Verfügung um das zu machen. Für das obige Beispiel würden wir folgende Regeln verwenden:
# iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 22 -j ROUTE --iface tunl1
# iptables -A PREROUTING -t nat -i tunl1 --j ROUTE --iface eth0
# iptables -L PREROUTING -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
ROUTE tcp -- anywhere anywhere tcp dpt:ssh ROUTE iface tunl1(7)
ROUTE all -- anywhere anywhere ROUTE iface eth0(3)
Die erste Regel routet Pakete aus dem Internet um und die zweite routet alle Pakete vom Host um. Die Werte in den Klammern hinter den Interfacenamen sind die Interfaceindexe. Es wird die nat Tabelle benutzt, da diese den PREROUTING Hook zur Verfügung stellt. Das heißt aber nicht, dass hier Pakete verändert werden.