Next Previous Contents

3. Neue Netfilter Matches

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''.

3.1 ah-esp Patch

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:

--ahspi [!] spi[:spi]

-> 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:

--espspi [!] spi[:spi]

-> 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.

3.2 conntrack Patch

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:

[!] --ctstate [INVALID|ESTABLISHED|NEW|RELATED|SNAT|DNAT][,...]

-> 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.

[!] --ctproto proto

-> Protokoll; als Nummber oder Name, z.B. `tcp'.

--ctorigsrc [!] address[/mask]

-> Spezifikation der ursprünglichen Quelladresse.

--ctorigdst [!] address[/mask]

-> Spezifikation der ursprünglichen Zieladresse.

--ctreplsrc [!] address[/mask]

-> Spezifikation der Antwortquelle.

--ctrepldst [!] address[/mask]

-> Spezifikation des Antwortzieles.

[!] --ctstatus [NONE|EXPECTED|SEEN_REPLY|ASSURED][,...]

-> match auf Status/Staten.

[!] --ctexpire time[:time]

-> Match der restlichen ``Lebenszeit'' (lifetime) in Sekunden gegen eine Wert oder einen Bereich (die Randwerte sind einbezogen).

3.3 iplimit Patch

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:

[!] --iplimit-above n

-> matcht, wenn die Anzahl der existierenden TCP Verbindungen (nicht) größer als n ist.

--iplimit-mask n

-> Guppierung von Hosts per Maske.

3.4 ipv4options Patch

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:

--ssrr

-> Strict Source Routing Flag gesetzt.

--lsrr

-> Loose Source Routing Flag gesetzt.

--no-srr

-> Pakete ohne Source Routing.

[!] --rr

-> Record Route Flag gesetzt.

[!] --ts

-> Timestamp Flag gesetzt.

[!] --ra

-> Router-Alert Option aktiv.

[!] --any-opt

-> prüft ob mindestens eine IP Option aktiv ist (oder keine wenn ! vorangestellt wurde).

3.5 length Patch

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:

[!] --length length[:length]

-> 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.

3.6 mport Patch

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:

--source-ports port[,port:port,port...]

-> Quellports.

--sports port[,port:port,port...]

-> Synonym für --source-ports.

--destination-ports port[,port:port,port...]

-> Zielports.

--dports port[,port:port,port...]

-> Synonym für --destination-ports.

--ports port[,port:port,port]

-> Match für Quell- und Zielports.

3.7 nth Patch

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:

--every n

-> Regel trifft auf jedes n-te Packet zu.

[--counter] num

-> Benuze Zähler 0-15 (default:0).

[--start] num

-> Initialisiere den Zähler mit Wert `num' anstelle von 0. Der Wert muß zwischen 0 und (n-1) liegen.

[--packet] num

-> 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.

3.8 pkttype Patch

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:

--pkt-type [!] packettype

-> trifft auf den entsprechenden Pakettyp zu. Der Pakettyp kann einder der folgenden sein:

host

-> an uns

broadcast

-> an alle

multicast

-> an eine Gruppe

3.9 pool Patch

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.

3.10 psd Patch

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:

[--psd-weight-threshold threshold]

-> Grenze ab der von einem Portscan ausgegangen wird und diese Regel zutrifft.

[--psd-delay-threshold delay]

-> Zeit innerhalb der die Portzugriffe erfolgen müssen.

[--psd-lo-ports-weight lo]

-> Gewichtung für priviligierte Ports.

[--psd-hi-ports-weight hi]

-> Gewichtung für unpreviligierte Ports.

3.11 quota Patch

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:

--quota quota

-> Das Limit, das du setzen möchtest.

3.12 random Patch

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:

[--average percent]

-> 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.

3.13 realm Patch

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:

--realm [!] value[/mask]

-> matcht den entsprechendeb realm Wert zu.

3.14 recent Patch

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:

--name name

-> Spezifiziert den Namen der Liste, die für das Kommando verwendet werden soll. Wird kein Name angegeben, so wird 'DEFAULT' verwendet.

[!] --set

-> 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.

[!] --rcheck

-> 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.

[!] --update

-> 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.

[!] --remove

-> 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.

[!] --seconds seconds

-> 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.

[!] --hitcount hits

-> 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.

--rttl

-> 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.

3.15 record-rpc Patch

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)
{
}

3.16 string Patch

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 [!] string

-> String im Paket.

3.17 time Patch

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:

--timestart value

-> Minimum HH:MM

--timestop value

-> Maximum HH:MM

--days listofdays

-> Eine Liste von Tagen (Groß-/Kleinschreibung beachten) aus:

3.18 ttl Patch

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:

--ttl-eq value

-> trifft zu bei gegebener Time-to-Live.

--ttl-lt value

-> trifft zu bei TTL < value

--ttl-gt value

-> trifft zu bei TTL > value


Next Previous Contents