Menu Content/Inhalt
Home arrow Netzwerkadministration arrow Firewall - Iptables
Firewall - Iptables PDF Drucken E-Mail

iptables

Netfilter ist der "linux kernelspace program code", der die firewall in den linux kernel implementiert, entweder als dynamisch ladbare Module oder als fixer Bestandteil des Kernels.
Auf der anderen Seite gibt es die "iptables-software", das sogenannte "userland program", das Administrationstool für "netfilter firewalls.

Eine "packet filtering firewall" (Paketfilter Firewall) besteht aus einer Liste von "Verbotsregeln" und "Erlaubregeln". Diese Regeln sollen also festlegen, welche Pakete ins eigene Netz hinein dürfen, und welche nicht. Man kann diese Regeln selbstverständlich auch für den eigenen Rechner aufstellen, was zu Beginn auch ein sehr willkommenes Trainingsfeld darstellt.

root@linux:~# type -p iptables
/usr/sbin/iptables
root@linux:~# iptables --version
iptables v1.2.11
root@linux:~#
Hier sehen wir, wie wir schnell checken können, ob iptables installiert ist, und welche Version es ist. Natürlich kann sich die Versionsnummer auf Ihrem Rechner von der obigen unterscheiden!

Eine iptables-Regel kann das dynamische Laden von Netfilter-Modulen verursachen.

root@linux:~# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:00:92:A7:32:F0
inet addr:192.168.3.92 Bcast:192.168.3.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2070990 errors:1 dropped:0 overruns:0 frame:0
TX packets:1800 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:124356263 (118.5 MiB) TX bytes:208997 (204.0 KiB)
Interrupt:5 Base address:0x9800
user@host:~#
So sieht es bei mir aus.
Wir werden jetzt iptables dazu einsetzen, die ersten Regeln zu formulieren, und um unsdiese dann auflisten zu lassen.
die formulierten Regeln gehören einer "Rulechain" (Regelkette) an, die in Tabellen eingetragen werden. Es gibt drei Tabellen:
  • filter
    Diese Tabelle bezeichnet den normalen Paketfilter. In dieser Tabelle stehen uns eine INPUT-, OUTPUT- und FORWARD-Kette zur Verfügung. Jedes Paket muss die jeweils entsprechende Kette durchlaufen.
  • nat
    Diese Tabelle wird überprüft, sobald ein Paket eine neue Verbindung aufbaut. Folgende Ketten sind in dieser Tabelle vorzufinden:
    PREROUTING für das Verändern von Paketen vor dem Routing und direkt nach dem Eintreffen
    OUTPUT für das Verändern von lokal generierten Paketen vor dem Routing und
    POSTROUTING für das Verändern von Paketen nach dem Routing und kurz vor dem Weiterversenden.
  • mangle
    Diese Tabelle benötigt man für das Verändern von Paketen. Seit Kernel 2.4.18 kann man in dieser Tabelle Pakete in allen Ketten (der beiden anderen Tabellen) verändern. Allerdings sollte man beachten, dass Pakete entsprechend ihrer Semantik auch mehrere Ketten durchlaufen können.

Mittels iptables -t <Tabllenname> können Sie die Tabelle angeben. Die Tabelle "filter" ist voreingestellt (default), was bedeutet, dass Sie für Regeln, die für eine kette in der Filtertabelle bestimmt sind, nicht jedes mal "-t filter" tippen müssen.

Jede Tabelle hat ihre built-in-chains. Filter hat INPUT, OUTPUT und FORWARD. Die chains der anderen beiden Tabellen werden wir später angehen. Jede Regel ind er Filtertabelle gehört also zu einer Regelkette. Eine Regel ist vergleichbar wie eine Perle aufgefädelt auf eine Schnur.

Die erste Regel, die auf ein eintreffendes Paket oder ausgehendes Paket zutrifft, gewinnt! (The first matching rule wins!)

Da gibt es etwas, das man "Default Policy" nennt. Diese Default Policy tritt genau dann in Kraft, wenn keine der formulierten Regeln auf ein Paket zutrifft.
Die von uns formulierten Regeln werden für tcp,udp/ip- und icmp-Pakete sein. In eier Regel müssen wir zuerst beschreiben, für welche Regelkette in welcher Tabelle diese Regel gehört, und dann beschreiben wir, für welche Art von Paket die Regel zutreffen soll und am Ende, ob es durchgelassen werden darf oder nicht.

root@linux:~# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source

root@linux:~#
Wir hätten hier also genausogut als Kommando "iptables -t filter -L" schreiben können, da aber filter default ist, konnten wir uns das schenken.

Sie sehen hier also den Inhalt der filter-Tabelle aufgelistet, eingeteilt in die bereits erwähnten Ketten INPUT, FORWARD und OUTPUT. Wenn Sie sich bloss den Inhalt der INPUT-chain ausgeben lassen wollten, dann brächten Sie nur INPUT am obigen Kommando anhängen.

root@linux:~# ping -c 3 localhost
PING localhost.localdomain (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost.localdomain (127.0.0.1):icmp_seq=1 ttl=64 time=0.091 ms
...
root@linux:~#
localhst lässt sich also pingen. Jetzt wollen wir die Default Policy auf DROP setzen, wie nachstehend gezeigt wird
root@linux:~# iptables -P INPUT DROP
root@linux:~# iptables -P OUTPUT DROP
root@linux:~# iptables -P FORWARD DROP
root@linux:~# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination

Chain FORWARD (policy DROP)
target prot opt source destination

Chain OUTPUT (policy DROP)
target prot opt source destination

root@linux~# ping -c 3 localhost
PING localhost.localdomain (127.0.0.1) 56(84) bytes of data.
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
...
Vorsicht! jetzt ist alles zu! Wenn die Default-Policy auf DROP gesetzt wird, dann bedeutet das schlichtweg, dass nur die "Erlaubt-Regeln" Pakete durchlassen, alle anderen werden abgewiesen (e-dropped). Diese obige Default-Policy lässt sich mit folgendem Satz wohl am besen beschreiben:
Was nicht extra erlaubt ist, ist VERBOTEN!

Damit wir nun den localhost wieder pingen können, müssen wir Regel formulieren, die das zulassen - eine Regel für eingehende Pakete und eine Regel für ausgehende Pakete, oder anders gesagt, eine INPUT-Regel und eine OUTPUT-Regel.

root@linux:~# iptables -A INPUT -i lo -j ACCEPT
root@linux:~# iptables -A OUTPUT -o lo -j ACCEPT
root@linux:~# ping -c 3 localhost
PING localhost.localdomain (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1 ttl=64 ti
me=0.099 ms
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=2 ttl=64 ti
me=0.058 ms
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=3 ttl=64 ti
me=0.045 ms

--- localhost.localdomain ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.045/0.067/0.099/0.023 ms
root@linux:~#
"iptables -A INPUT -i lo -j ACCEPT" bedeutet, dass wir (-A) eine Regel am Ende aller bereits vorhandenen Regel der INPUT-Kette anhängen (ausgenommen der Default-Regel, die IMMER am Ende stehen bleibt!).
Das incoming-device (input-device - "-i") war das loopback-device (lo) und zuguterletzt sehen wir "-j ACCEPT", was bedeutet, dass das Paket, dass dieser Regel entspricht, auf ein Ziel hüpfen (jump "-j") soll - in diesem Fall hiess das Ziel ACCEPT.
Weitere Ziele könnten sein: "DROP" oder "REJECT" oder eine andere selbstkreierte Kette, aber dazu später.

Was hier für uns am meisten zählt ist, dass der "traffic" durch das loopback-device derzeit der enizig erlaubte ist auf der lokalen Maschine. Und da der "loopback-traffic" ein geschlossener Kreislauf ist, kann es auf der firewall gleich und voll erlaubt werden. Lassen Sie uns die momentanen Regeln auflisten ...

root@linux:~# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere

Chain FORWARD (policy DROP)
target prot opt source destination

Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere

root@linux:~#

Die FORWARD-chain brauchen wir derzeit noch nicht und wollen diese daher erst später besprechen. Wir brauchen FORWARD dann, wenn wir mehr als ein Ethernet-device in unserem Rechner eingebaut haben ...

Die obige Auflistung hat das loopback-device nicht angezeigt. Zum Glück gibt es da noch eine Option, nämlich "-v", die eine detailliertere Ausgabe liefert. Und damit wir die Ausgabe in Zahlen (IP-Adressen, portnummern, etc) aufgelöste Namen angezeigt bekommen, fügen wir noch die Option "-n" hinzu.

Aufgepasst! "-L" ist ein KOMMANDO, dem der Name einer Kette folgen kann, aber -v und -n sind Optionen.

root@linux:~# iptables -vn -L
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source dest
ination
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.
0.0/0

Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source dest
ination

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source dest
ination
0 0 ACCEPT all -- * lo 0.0.0.0/0

root@linux:~#
  • pkts
    gibt die Anzahl der Pakete an, auf die eine Regel einer Kette zutraf
  • bytes
    gibt die Menge in bytes an, die die Pakete in Summe gross waren
  • target
    beschreibt das Ziel (für das Paket) der formulierten Regel (ACCEPT, DROP, LOG oder REJECT)
  • prot
    ist die Abkürzung für Protokoll. Hier kann stehen:
    "all", "tcp", "udp" oder "icmp" oder ein anderer Wert aus /etc/protocols
  • opt
    steht für "fragmentation option", die entweder "-f" oder mit "! -f" sein kann.
    Ein "!" drückt eine Negation (Verneinung) aus - es meint also "! -f", was bedeutet, dass es entweder unfragmentierten Paketen oder dem ersten fragment einer Paketserie. Ein f an der zweiten Stelle zeigt die " -f option" an, was bedeutet, dass hier das zweite und alle folgenden Fragmente getroffen werden sollen.
  • in
    ist das "incoming interface", wie z.B. es eth0 oder lo, oder ethx sein kann
  • out
    ist das "outgoing network interface"
  • source
    meint die source-Adress im IP-paket-header.
  • destination
    ist die "destination-Adress" im IP-paket-header

Über FORWARD, fragmentation REJECT und DROP werden wir uns später noch die Köpfe zerbrechen.
Behalten Sie sich aber den Spruch im Gedächtnis:

Was nicht explizit erlaubt ist, ist verboten!

Eine weitere Regel könnte folgendermassen aussehen:

root@linux:~# iptables -A INPUT -i eth0 -p tcp -j ACCEPT
root@linux:~# iptables -A OUTPUT -o eth0 -p tcp -j ACCEPT
root@linux:~#

Spätestens jetzt sehen Sie, dass wir ständig in zwei Richtungen denken müssen! Hereinkommende Pakete, ausgehende Pakete. Ja - wir haben hereinkommenden und ausgehenden traffic zur selben Zeit! (full duplex). Die obigen zwei Regeln meinen, dass eingehender und ausgehender TCP/IP-traffic erlaubt ist.
Wenn kein "-i" bzw. "-o" angegeben wird, dann gelten diese Regeln für alle am Rechner vorhandenen Netzwerkkarten.

root@linux:~# grep TCP /etc/protocols
tcp 6 TCP # transmission control protocol
root@linux:~#

Hier sahen Sie eine Zeile von /etc/protocols. Schauen Sie ruhig einmal tiefer in dieses file hinein!

Natürlich werden Sie nicht als einzige Regel gleich allen ein- oder ausgehenden tcp-traffic erlauben wollen, und es ging mir hier wieder nur um ein erstes Beispiel. Also, lassen Sie uns jetzt eine bestimmte IP-Adresse sperren!:

root@host:~# host www.orf.at
www.orf.at has address 194.232.104.27
www.orf.at has address 194.232.104.28
www.orf.at has address 194.232.104.29
www.orf.at has address 194.232.104.30
www.orf.at has address 194.232.104.21
www.orf.at has address 194.232.104.22
www.orf.at has address 194.232.104.23
www.orf.at has address 194.232.104.24
www.orf.at has address 194.232.104.25
www.orf.at has address 194.232.104.26
root@linux:~# lynx 194.232.104.26
...
...
root@linux:~#

und die website vom orf wird angezeigt. (Natürlich können Sie einen Browser Ihrer Wahl einsetzen!)

root@linux:~# iptables -A INPUT -i eth0 -s 194.232.104.26 -p tcp -j D
ROP
root@linux:~# lynx 194.232.104.26
...
...
root@linux:~#
OUPS! Die Seite wird immer noch angezeigt, dabei hätte doch unsere Regel diese IP-Adresse sperren sollen, nicht wahr?
Das führt uns zur nächsten Regel:
"Die erste passende Regel einer Kette gewinnt!"

Schauen Sie sich die Reihenfolge der Regeln an, die auf der INPUT-Kette "aufgefädelt" sind - zuerst kommt die "jeder tcp-traffic" ist erlaubt, und danach erst kommt das Verbot für tcp-traffic von IP 194.232.104.26, doch zu dieser Regel kommt das tcp-Paket nicht mehr, da es schon vorher zugelassen (ACCEPT) wurde. Versuchen wir das folgende:

root@linux:~# iptables -I INPUT 1 -i eth0 -s 194.232.104.26 -p tcp -j
DROP
root@linux:~# lynx 194.232.104.26
...
...
root@linux:~#

Also JETZT ist es tatsächlich gesperrt!
Mit -I, was für INSERT steht, konnten wir die Regel an eine gewisse Position einbinden. Mit der Zahl nach "INPUT" können sie die gew&uum;nschte Position angeben. Hier schrieb ich zur besseren Veranschaulichung die Zahl 1 hin, was bedeutet, dass die gewüschte Position die erste sein soll. Wenn Sie das in Zukunft tun wollen, dann reichte die blosse Angabe von -I ohne zusätzliche Positionsangabe aus. Jede andere gewünschte Position muss aber klarerweise angegeben werden!

root@linux:~# iptables -L -n -vv
...
...
root@linux:~# iptables -L -n -v --line-numbers
...
...
root@linux:~#
Mit "--line-numbers" können Sie sich die Positionsnummer einer Regel zusätzlich ausgeben lassen.
root@linux~# iptables -I INPUT -i eth0 -s 194.232.104.26 \
-p tcp -j LOG --log-prefix "inp_orf_block"
root@linux:~#

Hier sehen wir auch den klugen Einsatz von Backslashes, da bei längeren Regeln die Backslashes f&uum;r mehr Übersicht sorgen können. Aber VORSICHT! Nach dem Backslash darf kein Leerzeichen sein!

Okay - was tut die zuletzt formulierte Regel? Mit -I ohne Positionsangabe bedeutet, wie wir ja schon wissen, dass die Regel an erster Stelle in der Kette zu stehen kommen wird. Also, das Paket, dass der DROP-Regel zum Opfer fällt, wird zuvor aufgrund dieser LOG-Regel vorher noch gelogged, bevor es gedropped wird.

"-s" leitete die Angabe der Source-IP-Adresse ein, und wenn Sie die Destination-IP-Adresse (Ziel-IP) angeben wollten, dann würde diese IP-Adresse mit "-d" eingeleitet werden.

Man kann auch einen TCP oder UDP destination-port und/oder source-port angeben. Hierfür schauen Sie wieder einmal in das file /etc/services hinein ...

root@linux:~# less /etc/services
...
...
echo 4/ddp #AppleTalk Echo Protocol
rje 5/tcp #Remote Job Entry
rje 5/udp #Remote Job Entry
zip 6/ddp #Zone Information Protocol
echo 7/tcp
echo 7/udp
...
...
ftp 21/tcp #File Transfer [Control]
ftp 21/udp #File Transfer [Control]
ssh 22/tcp #Secure Shell Login
ssh 22/udp #Secure Shell Login
..
...
root@linux:~#
Es kann der Name (ssh) oder die Zahl (22) angegeben werden.
root@linux:~# iptables -I INPUT 3 -i eth0 -s 192.168.3.88 -p tcp --sp
ort ssh \
--dport 1024:65535 -j ACCEPT
root@linux:~# iptables -I OUTPUT 1 -o eth0 -d 192.168.3.88 -p tcp --d
port ssh \
--sport 1024:65535 -j ACCEPT
root@linux:~# iptables -I INPUT 4 -i eth0 -p tcp --sport 443 -j ACCEP
T
root@linux:~# iptables -I OUTPUT 2 -o eth0 -p tcp --dport 443 -j ACCE
PT
root@linux:~#

Sie sehen schon - die Regeln werden immer genauer!

Flushing

Man kann mit einem Kommando alle Regeln auf den einzelnen Regelketten löschen. Man nennt es "flush", was man mit "Hinunterlassen" (wie beim Klo) übersetzen könnte.
root@linux:~# iptables -F
root@linux:~#
Alle Regeln wurden jetzt gelöscht. Alle, ausser die Default-Policy, was ja keine Regel ist, sondern ein Standardverhalten einer Regelkette.

Diese Kommando ist so unscheinbar, aber immens wichtig! Wenn wir später Firewall-Skripte schreiben, brauchen wir diesesn Befehl. Warum? Weil, wenn die Regeln, die durch den ersten Aufruf des Firewall-Skripts auf die einzelnen Ketten "aufgefädelt" wurden, nicht extra gelöscht würden, dann würden beim nächsten Aufruf desselben Skriptes diesselben Regeln einfach erneut unterhalb der bestehenden Regeln (oder auch nicht, wenn -I gesetzt) aufgefädelt werden.

root@linux:~# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination

Chain FORWARD (policy DROP)
target prot opt source destination

Chain OUTPUT (policy DROP)
target prot opt source destination

root@linux:~#

Tatsächlich! Alle Regeln sind verschwunden, nur die Default-Policy ist geblieben, und da diese auf DROP gesetzt sind, wollen wir wieder ein paar Regeln formulieren ...

root@linux:~# iptables -A INPUT -i lo -j ACCEPT
root@linux:~# iptables -A OUTPUT -o lo -j ACCEPT
root@linux:~# iptables -A INPUT -i eth0 -s 192.168.3.92 -j DROP
root@linux:~# iptables -A INPUT -i eth0 -s 127.0.0.1 -j DROP
root@linux:~# iptables -A OUTPUT -o eth0 -d 127.0.0.1 -j DROP
root@linux:~# iptables -A OUTPUT -o eth0 -p udp --dport domain -j ACC
EPT
root@linux:~# iptables -A INPUT -i eth0 -p udp --sport 53 -j ACCEPT
root@linux:~# iptables -A INPUT -i eth0 -p udp -j DROP
root@linux:~# iptables -A OUTPUT -o eth0 -p udp -j DROP
root@linux:~#
Letzte Aktualisierung ( Monday, 7. May 2007 )
 
< Zurück   Weiter >

Scroll-news

Mailingliste:
http://mlists.in-berlin.de/mailman/listinfo/lieo-mlists.in-berlin.de 

 

Das Forum ist online gegangen

 


Who's Online

Aktuell 67 Gäste online

Google AdSense