In diesem Abschnitt werden wir versuchen die Benutzung der neuen Netfilter Matches zu erklären. Die Patche werden in alphabetischer Reihenfolge besprochen. Wir gehen hier nicht auf Patche ein, die andere Patche negativ beeinflussen; das kommt später mal.
Generell gilt für Matches, dass du die Hilfe für ein bestimmtes Modul wie folgt abfragen kannst:
# iptables -m match_den_du_willst --help
Das zeigt dir die normale Hilf von iptables an und zuzüglich am Ende die spezielle Hilfe zu ``match_den_du_willst''.
Dieser Patch von Yon Uriarte <yon@astaro.de> fügt zwei neue Matches hinzu:
Dieser Patch kann recht brauchbar sein für Leute die IPSEC benutzen und die Verbindungen an Hand des SPI unterscheiden möchten.
Als Beispiel wollen wir alle AH Pakete verwerfen, die einen SPI von 500 haben:
# iptables -A INPUT -p 51 -m ah --ahspi 500 -j DROP
# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP ipv6-auth-- anywhere anywhere ah spi:500
Unterstützte Optionen für den ah Match sind:
-> matcht SPI (Bereich)
Der esp Matche arbeitet ebenso:
# iptables -A INPUT -p 50 -m esp --espspi 500 -j DROP
# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP ipv6-crypt-- anywhere anywhere esp spi:500
Unterstützte Optionen für den esp Match sind:
-> matcht SPI (Bereich)
Es ist wichtig, dass du nicht vergisst das passende Protokoll mit ``-p 50'' or ``-p 51'' anzugeben (für jeweils ESP & AH), wenn du einen dieser Matche verwendest. Ansonsten bricht das Einfügen der Regel aus offensichtlichen Gründen ab.
Dieser Patch von Marc Boucher <marc+nf@mbsi.ca> fügt ein conntrack Match Modul hinzu (eine Obermenge des state Match), welches dir erlaubt weitere Conntrack Informationen zu matchen.
Wenn du Beispielsweise alle RELATED Verbindungen für das TCP Protokoll erlauben möchtest, kannst du wie folgt vorgehen:
# iptables -A FORWARD -m conntrack --ctstate RELATED --ctproto tcp -j ACCEPT
# iptables --list
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere ctstate RELATED
Unterstützte Optionen für den conntrack Match sind:
-> Match auf Zustand/Zustände. Die neuen `SNAT' and `DNAT' Zustände sind virtuell die dann zutreffen, wenn die ursprüngliche Quelladresse sich vom Antwortziel oder die ursprüngliche Zieladresse sich von der Antwortquelle unterscheiden.
-> Protokoll; als Nummber oder Name, z.B. `tcp'.
-> Spezifikation der ursprünglichen Quelladresse.
-> Spezifikation der ursprünglichen Zieladresse.
-> Spezifikation der Antwortquelle.
-> Spezifikation des Antwortzieles.
-> match auf Status/Staten.
-> Match der restlichen ``Lebenszeit'' (lifetime) in Sekunden gegen eine Wert oder einen Bereich (die Randwerte sind einbezogen).
Dieser Patch von Gerd Knorr <kraxel@bytesex.org> erlaubt es dir die Anzahl der parallelen TCP Verbindungen von einem bestimmten Host oder Netzwerk zu bergenzen.
Als Beispiel wollen wir die Anzahl der parallelen HTTP Verbindungen von einer einzelnen IP Adresse auf 4 begrenzen:
# iptables -A INPUT -p tcp --syn --dport http -m iplimit --iplimit-above 4 -j REJECT
# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT tcp -- anywhere anywhere tcp dpt:http flags:SYN,RST,ACK/SYN #conn/32 > 4 reject-with icmp-port-unreachable
Oder du möchtest eventuell die Anzahl paralleler Verbindungen einer ganzen Gruppe von Host (Netzmaske 255.255.255.0, ehm. Class C Netz) begrenzen:
# iptables -A INPUT -p tcp --syn --dport http -m iplimit --iplimit-mask 24 --iplimit-above 4 -j REJECT
# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT tcp -- anywhere anywhere tcp dpt:http flags:SYN,RST,ACK/SYN #conn/8 > 4 reject-with icmp-port-unreachable
Unterstützte Optionen für den iplimit Match sind:
-> matcht, wenn die Anzahl der existierenden TCP Verbindungen (nicht) größer als n ist.
-> Guppierung von Hosts per Maske.
Dieser Patch von Fabrice MARIE <fabrice@netfilter.org> erlaubt es dir Pakete an Hand der gesetzten IP Protokoll Optionen zu matchen.
Als Beispiel verwerfen wir alle Pakete, bei denen die IP Option Record-Route oder Timestamp gesetzt ist:
# iptables -A INPUT -m ipv4options --rr -j DROP
# iptables -A INPUT -m ipv4options --ts -j DROP
# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- anywhere anywhere IPV4OPTS RR
DROP all -- anywhere anywhere IPV4OPTS TS
Unterstützte Optionen für den ipv4options Match sind:
-> Strict Source Routing Flag gesetzt.
-> Loose Source Routing Flag gesetzt.
-> Pakete ohne Source Routing.
-> Record Route Flag gesetzt.
-> Timestamp Flag gesetzt.
-> Router-Alert Option aktiv.
-> prüft ob mindestens eine IP Option aktiv ist (oder keine wenn ! vorangestellt wurde).
Dieser Patch von James Morris <jmorris@intercode.com.au> erlaubt es Pakete auf ihre Länge zu prüfen.
Als Beispiel wollen wir alle Ping's verbieten, die eine Paketlänge von mehr als 85 Bytes aufweisen:
# iptables -A INPUT -p icmp --icmp-type echo-request -m length --length 86:65535 -j DROP
# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP icmp -- anywhere anywhere icmp echo-request length 86:65535
Unterstützte Optionen für den length Match sind:
-> prüft auf entsprechende Länge. Die Werte bei einem Bereich sind enthalten.
Wird bei einem Bereich ein Wert nicht angegeben, werden die implizierten Werte 0 (Minimum) und 65535 (Maximum) verwendet.
Dieser Patch von Andreas Ferber <af@devcon.net> ermöglicht es in einer Regel für das UDP oder TCP Protokoll beliebige Kombination aus einzelnen Ports und Portbereichen zu verwenden.
Möchtest du zum Beispiel ftp, ssh, telnet und http mit einer einzigen Regel verwerfen, kannst du die folgende verwenden:
# iptables -A INPUT -p tcp -m mport --ports 20:23,80 -j DROP
# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- anywhere anywhere mport ports ftp-data:telnet,http
Unterstützte Optionen für den mport Match sind:
-> Quellports.
-> Synonym für --source-ports.
-> Zielports.
-> Synonym für --destination-ports.
-> Match für Quell- und Zielports.
Dieser Patch von Fabrice MARIE <fabrice@netfilter.org> erlaubt es das n-te Paket, welches eine Regel erreicht zu erkennen.
Wenn du zum Beispiel jedes zweite Ping Paket verwerfen willst, kannst du folgende Regel verwenden:
# iptables -A INPUT -p icmp --icmp-type echo-request -m nth --every 2 -j DROP
# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP icmp -- anywhere anywhere icmp echo-request every 2th
Erweiterungen von Richard Wagner <rwagner@cloudnet.com> ermöglichen es schnell und einfach eine Last-Verteilung zu implementieren.
Möchtest du zum Beispiel die Last auf die 3 Adressen 10.0.0.5, 10.0.0.6 and 10.0.0.7 verteilen, kanst du wie folgt vorgehen:
# iptables -t nat -A POSTROUTING -o eth0 -m nth --counter 7 --every 3 --packet 0 -j SNAT --to-source 10.0.0.5
# iptables -t nat -A POSTROUTING -o eth0 -m nth --counter 7 --every 3 --packet 1 -j SNAT --to-source 10.0.0.6
# iptables -t nat -A POSTROUTING -o eth0 -m nth --counter 7 --every 3 --packet 2 -j SNAT --to-source 10.0.0.7
# iptables -t nat --list
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- anywhere anywhere every 3th packet #0 to:10.0.0.5
SNAT all -- anywhere anywhere every 3th packet #1 to:10.0.0.6
SNAT all -- anywhere anywhere every 3th packet #2 to:10.0.0.7
Unterstützte Optionen für den nth Match sind:
-> Regel trifft auf jedes n-te Packet zu.
-> Benuze Zähler 0-15 (default:0).
-> Initialisiere den Zähler mit Wert `num' anstelle von 0. Der Wert muß zwischen 0 und (n-1) liegen.
-> Trifft auf das `num'-te Packet zu. Der Wert muß zwischen 0 und (n-1) liegen. Wenn `--packet' für einen Zähler benutzt wird, so müssen n `--packet' Regeln existieren um alle Werte zwischen 0 und (n-1) abzudecken.
Dieser Patch von Michal Ludvig <michal@logix.cz> ermöglicht es Pakete anhand ihres Types host/broadcast/multicast zu erkennen.
Wenn du zum Beispiel alle broadcast Pakete stillschweigend verwerfen willst:
# iptables -A INPUT -m pkttype --pkt-type broadcast -j DROP
# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- anywhere anywhere PKTTYPE = broadcast
Unterstützte Optionen für diesen Match sind:
-> trifft auf den entsprechenden Pakettyp zu. Der Pakettyp kann einder der folgenden sein:
-> an uns
-> an alle
-> an eine Gruppe
Patch von Patrick Schaaf <bof@bof.de>. Joakim Axelsson und Patrick sind gerade dabei diesen Match neu zu implementieren. Deswegen wird dieser Abschnitt mit einer aktuellen Erklärung dann aktualisiert, wenn die Neuimplementierung erfolgt ist.
Dieser Patch von Dennis Koslowski <dkoslowski@astaro.de> versucht Portscans zu erkennen.
In der einfachsten Version wird der psd Patch wie folgt verwendet:
# iptables -A INPUT -m psd -j DROP
# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- anywhere anywhere psd weight-threshold: 21 delay-threshold: 300 lo-ports-weight: 3 hi-ports-weight: 1
Unterstützte Optionen für psd Match sind:
-> Grenze ab der von einem Portscan ausgegangen wird und diese Regel zutrifft.
-> Zeit innerhalb der die Portzugriffe erfolgen müssen.
-> Gewichtung für priviligierte Ports.
-> Gewichtung für unpreviligierte Ports.
Dieser Patch von Sam Johnston <samj@samj.net> gestattet es Quotas zu setzen. Wenn eine Quote erreicht wird, trifft die entsprechende Regel nicht mehr zu.
Wenn du zum Beispiel dein Limit von 50 Megabyte für den eingehenden http Traffic setzen möchtes, kannst du folgende Regeln verwenden:
# iptables -A INPUT -p tcp --dport 80 -m quota --quota 52428800 -j ACCEPT
# iptables -A INPUT -p tcp --dport 80 -j DROP
# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:http quota: 52428800 bytes
DROP tcp -- anywhere anywhere tcp dpt:http
Unterstützte Optionen für den quota Match sind:
-> Das Limit, das du setzen möchtest.
Dieser Patch von Fabrice MARIE <fabrice@netfilter.org> ermöglicht es Pakete zufällig mit eine bestimmten Wahrscheinlichkeit auszuwählen.
Wenn du zum Beispiel zufällig 50% aller Ping Anfragen verwerfen möchtest, kannst du das wie folgt tun:
# iptables -A INPUT -p icmp --icmp-type echo-request -m random --average 50 -j DROP
# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP icmp -- anywhere anywhere icmp echo-request random 50%
Unterstützte Optionen für den random Match sind:
-> Die Wahrscheinlichkeit in Prozent, mit der die Regel zutreffen soll. Wenn diese Option nicht angegeben wird, wird eine Wahrscheinlichkeit von 50% gesetzt. Der Wert muss inerhalb von 1 <= percent <= 99 liegen.
Dieser Patch von Sampsa Ranta <sampsa@netsonic.fi> erlaubt es Pakete an Hand des ``realm key'' vom Routing auszuwählen; dies entspricht einer Klassifizierung von bestimmten Paketen.
Wenn du zum Beispiel alle ausgehenden Pakete loggen möchtest, die einen realm Wert von 10 haben, gehst du wie folgt vor:
# iptables -A OUTPUT -m realm --realm 10 -j LOG
# iptables --list
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
LOG all -- anywhere anywhere REALM match 0xa LOG level warning
Unterstützte Optionen für den realm Match sind:
-> matcht den entsprechendeb realm Wert zu.
Dieser Patch von Stephen Frost <sfrost@snowman.net> erlaubt es dynamisch Listen mit IP Adressen zu erstellen und dann an Hand der Listen Pakete auf unterschiedliche Weise zu filtern.
Zum Beispiel kannst du eine Liste `badgay' von Leuten erstellen, die versuchen einen Verbindung zum Port 139 (NETBIOS Session Service) deiner Firewall herzustellen und dann alle weiteren Pakete (also auch die normalerweise erlaubten) von diesen Leuten verwerfen ohne sie weiter zu betrachten.
# iptables -A FORWARD -m recent --name badguy --rcheck --seconds 60 -j DROP
# iptables -A FORWARD -p tcp -i eth0 --dport 139 -m recent --name badguy --set -j DROP
# iptables --list
Chain FORWARD (policy ACCEPT)
target prot opt source destination
DROP all -- anywhere anywhere recent: CHECK seconds: 60
DROP tcp -- anywhere anywhere tcp dpt:netbios-ssn recent: SET
Unterstützte Optionen für den recent Match sind:
-> Spezifiziert den Namen der Liste, die für das Kommando verwendet werden soll. Wird kein Name angegeben, so wird 'DEFAULT' verwendet.
-> Fügt die Quelladresse des Paketes zu der Liste hinzu. Ist die Adresse bereits in der Liste, wird ein Update durchgeführt. Das Ergebnis dieser Regel ist immer true oder bei vorangestelltem ! false.
-> Prüft ob die Quelladresse in der Liste ist und gibt in diesem Fall true, sonst false zurück. Das Ergebnis wir bei vorangestlltem ! umgekehrt.
-> Prüft ob die Quelladresse in der Liste ist. Ist die Adresse vorhanden, wird ein Update durchgeführt und true zurückgegeben. Ist die Adresse nicht in der Liste wird false zurückgegeben. Das Ergebnis wir bei vorangestlltem ! umgekehrt.
-> Prüft ob die Quelladresse in der Liste ist. Ist die Adresse vorhanden, wird sie aus der Liste entfernt und true zurückgegeben. Ist die Adresse nicht in der Liste wird false zurückgegeben. Das Ergebnis wir bei vorangestlltem ! umgekehrt.
-> Diese Option muss etweder mit der 'rcheck' oder 'update' Option zusammen angegeben werden. Sie bewirkt, dass diese Regel nur dann greift, wenn die Quelladresse innerhalb der letzten angegebenen Sekunden 'seconds' in der Liste gesehen worden ist. Das Ergebnis wir bei vorangestlltem ! umgekehrt.
-> Diese Option muss etweder mit der 'rcheck' oder 'update' Option zusammen angegeben werden. Sie bewirkt, dass diese Regel nur dann greift, wenn die Quelladresse wenigstens 'hits' mal in der Liste gesehen worden ist. Die Option kann zusammen mit der '--seconds' Option verwendet werden, um eine Regel zu erstellen, die nur dann greift wenn eine Adresse mit einer bestimmten Häufigkeit innerhalb eines Zeitintervalles gesehen wird. Das Ergebnis wir bei vorangestelltem ! umgekehrt.
-> Diese Option muss etweder mit der 'rcheck' oder 'update' Option zusammen angegeben werden. Sie bewirkt, dass diese Regel nur dann greift, wenn die Adresse in der Liste ist und die TTL des aktuellen Paketes mit der TTL des Paketes übereinstimmt, welches die --set Regel ausgelöst hat. Das kann sinvoll sein, wenn du Probleme mit Leuten hast die ihre Quelladresse fälschen und so einen DoS Angriff über diesen Modul auslösen in dem andere Adressen dadurch gesperrt werden, dass sie die gefälschte Pakete senden.
Dieser Patch von Marcelo Barbosa Lima <marcelo.lima@dcc.unicamp.br> erlaubt es Pakete zu erkennen, wenn die Quelladdresse bereits vorher einen Port über den Portmapper angefordert hat oder diese eine neue GET Anfrage an den Portmapper ist. Das ermöglicht effektives RPC-Filtern.
Um RPC Verbindungen zu verfolgen benutze einfach folgende Regel:
# iptables -A INPUT -m record_rpc -j ACCEPT
# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere
Der record_rpc Match hat keine Optionen.
Wundere dich nicht, wenn keine Informationen zum Match ausgegeben werden. Das liegt daran, dass die print() Funktion dieses Matches nicht implementiert ist:
/* Prints out the union ipt_matchinfo. */
static void
print(const struct ipt_ip *ip,
const struct ipt_entry_match *match,
int numeric)
{
}
Dieser Patch von Emmanuel Roger <winfield@freegates.be> erlaubt es dir nach einem String an einer belibigen Stelle im Paket zu filtern.
Um zum Beispiel Pakete zu erkennen, die den String ``cmd.exe'' enthalten und diese an den Userspace weiterzuleiten kannst du folgende Regel benutzen:
# iptables -A INPUT -m string --string 'cmd.exe' -j QUEUE
# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
QUEUE all -- anywhere anywhere STRING match cmd.exe
Bitte benutze diesen Match mit Vorsicht. Viele Leute wollen diesen Match benutzen um zusammen mit dem DROP Target Würmer abzuweheren. Dies ist ein grundlegender Fehler. Hierfür gibt es IDS Methoden, die wesentlich besser geeignet sind.
Auf ähnliche Weise versuchen viele Leute diesen Match dazu zu benutzen um bestimmte HTTP Funktionalitäten wie POST zu verbieten, indem sie alle Pakete verwerfen die diese String enthalten. Bitte verstehe, dass dieser Job wesentlich besser von einem filterndem Proxy übernommen werden kann. Darüber hinaus wird mit dieser Methode auch jeder HTML Inhalt verworfen der den String POST enthält. Dieser Match wurde nur entworfen um interessante Pakete an den Userspace weiterzureichen um sie dort besser zu analysieren. Pakete mit diesem Patch zu verwerfen hebelt jede andere IDS Methode aus.
Unterstützte Optionen für den string Match sind:
-> String im Paket.
Dieser Patch von Fabrice MARIE <fabrice@netfilter.org> ermölicht es Pakete anhand der Zeitmarke (timestamp) zu filtern.
Um zum Beispiel ankommende Pakete nur von 8:00 Uhr bis 18:00 Uhr von Montags bis Freitags zuzulassen kannst du folgende Regel verwenden:
# iptables -A INPUT -m time --timestart 8:00 --timestop 18:00 --days Mon,Tue,Wed,Thu,Fri -j ACCEPT
# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere TIME from 8:0 to 18:0 on Mon,Tue,Wed,Thu,Fri
Unterstützte Optionen für den time Match sind:
-> Minimum HH:MM
-> Maximum HH:MM
-> Eine Liste von Tagen (Groß-/Kleinschreibung beachten) aus:
Dieser Patch von Harald Welte <laforge@gnumonks.org> erlaubt es Pakete auf der Basis ihrer TTL zu filtern:
Um zum Beispiel alle Pakete zu loggen, die eine TTT kleiner als 5 aufweisen, kannst du folgende Regel verwenden:
# iptables -A INPUT -m ttl --ttl-lt 5 -j LOG
# iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
LOG all -- anywhere anywhere TTL match TTL < 5 LOG level warning
Optionen des ttl Match sind:
-> trifft zu bei gegebener Time-to-Live.
-> trifft zu bei TTL < value
-> trifft zu bei TTL > value