4. iptables-Befehle
Anm.: weitere Details zu den nun folgenden
Beschreibungen findet man in der Manual-Page
von iptables (man
iptables).
Mit iptables
ist es nun möglich die Regeln
in einer Kette zu
beeinflussen. Jede Kette besitzt eine Standardregel
die benutzt wird wenn keine der sonstigen Regeln zutrifft. Sie
können
Regeln neu hinzufügen, vorhandene löschen oder
verändern. Dies sind die Befehle
von iptables.
4.1 Beispiel
Bevor ich die einzelnen Befehle und Optionen erkläre hier mal ein
Beispiel:
#!/bin/sh
# 1 Iptables
FW="/sbin/iptables"
# 2 vorhandene Regeln & Ketten löschen
$FW -F
$FW -X
$FW -t nat -F
# 3 Standardregeln
$FW -P INPUT ACCEPT
$FW -P FORWARD ACCEPT
$FW -P OUTPUT ACCEPT
# 4 Ping blockieren
$FW -A INPUT -p icmp -j DROP
zu 1: Zunächst benutze
ich in Scripten nicht immer den Befehl iptables, sondern zur besseren
Lesbarkeit die Variable FW. Diese ist nichts weiter als ein
Verweis auf: /sbin/iptables.
Denn wenn man nur iptables als
Befehl einsetzt, also ohne absolute Pfadangabe läuft man Gefahr,
dass nicht der wirkliche, unter /sbin
liegende Befehl benutzt wird (Stichwort: PATH-Variable). Und immer den
absoluten Pfad anzugeben macht das Ganze unleserlich. Anm.: der Ablageort von iptables kann je nach Distribution
auch unter /usr/sbin sein!
zu 2: bevor man komplett neue
Regeln erstellt bzw. anfügt sollte man sicherstellen, dass man
zunächst einmal alles 'zurücksetzt'.
zu 3: hier werden die Standardregeln erstellt. Sie werden
mit dem Parameter -P gesetzt.
Die in unserem Beispiel lassen alles
passieren.
zu 4: die Standardregeln lassen alles
passieren. Wenn jedoch jemand einen Ping
an unseren Rechner sendet wird dieser geblockt.
Dieses Beispiel macht unseren Rechner also offen für alles,
außer für Ping.
Dies ist eine (leider) häufig benutzte Firewall-Methode: der Rechner lässt alles passieren,
außer das was verboten ist. Und wenn man ein Verbot
(Regel) vergisst, ...
Die zweite, bessere Methode ist: der
Rechner blockiert alles, außer das was erlaubt ist. D.h.
die Standardregeln blocken
und Sie werden Regeln
erstellen die bestimmte Pakete akzeptieren. Wenn Sie nun eine Regel
vergessen, wird dies schnell bemerkt, da z.B. der SSH-Zugang
nicht funktioniert. Wenn man jedoch bei der ersten Methode eine Regel
vergisst, fällt dies meist erst auf wenn alles zu spät ist.
Die erste Methode wird oft nur deshalb benutzt weil jemand bestimmte
Regeln, um etwas zuzulassen, nicht setzen kann (und daher eDonkey nicht läuft ;).
4.2 Befehlsliste
In dem vorherigen Beispiel wurde iptables
mit verschiedenen Befehlen
aufgerufen um die filter zurückzusetzen und neue Regeln zu
definieren. Hier werde ich nun die wichtigsten Befehle
erklären. Vorher sollten Sie das Beispiel in ein Script
verfrachten,
ausführbar machen und einmal starten. Ich würde empfehlen es einzutippen
und nicht die Zwischenablage zu benutzen. Denn nur dadurch lernt man
was man tut!
Befehl
|
Kürzel
|
Beschreibung
|
--flush
|
-F
|
Löscht
alle Regeln
|
--list
|
-L
|
Listet die
Regeln auf
|
--zero
|
-Z
|
Für
jede Regel wird mitgezählt wie oft
sie zutreffend war und wieviel Bytes übermittelt wurden. Mit
diesem
Parameter werden diese Zähler zurückgesetzt.
|
--policy |
-P
|
Setzt die Methode (auch Standardmethode) einer Kette
|
--append
|
-A
|
Hängt
eine neue Regel an die Kette an
|
--insert
|
-I
|
Fügt
eine Regel anhand einer Nummer ein
|
--replace
|
-R
|
Ersetzt
eine Regel anhand ihrer Nummer
|
--delete
|
-D
|
Löscht
eine identische Regel oder anhand ihrer Nummer aus der Kette
|
--new-chain
|
-N
|
Erstellt eine benutzerdefinierte
Kette; Beschreibung folgt in 6.3
|
--delete-chain
|
-X
|
Löscht eine
benutzerdefinierte Kette; Beschreibung folgt in 6.3 |
Wenn sie die Kürzel benutzen ist Groß-/Kleinschreibung
wichtig. Es gibt nämlich Parameter die den gleichen Buchstaben
verwenden, sich aber eben dadurch unterscheiden ob sie Groß oder
Klein geschrieben wurden. Ich werde beim Erklären der Befehle noch weitere Optionen miteinbringen und diese
ebenfalls erläutern.
4.3 Befehle anwenden
Anm.: zu vielen Befehlen werden Parameter benötigt. Diese
werde ich in diesem Kapitel stillschweigend benutzen. Erklärt
werden sie später, im Kapitel 5.
4.3.1 Regeln löschen: --flush / -F
Man kann mit dem Befehl --flush
alle vorhandenen Regeln oder
nur die einer bestimmten Kette
löschen. Bevor man eine komplett neue Regelliste erstellt,
muß man logischerweise zuerst eventuell vorhandene entfernen.
# Löscht alle Regeln
iptables -F (oder iptables --flush)
# Löscht nur die Regeln der Kette INPUT
iptables -F INPUT
Anm.:
Ich benutze nur die Befehle in ihrerer abgekürzten Form.
Ansonsten wird eine Befehlszeile schnell sehr lang.
4.3.2 Regeln auflisten: --list / -L
Zunächst führen wir unser Script aus und testen ob es
funktioniert indem wir einen Ping an den Rechner senden (z.B. ping localhost). Dieser Ping
müsste abgelehnt werden. Dann sehen uns die mal die Liste der
Regeln an:
Es werden uns nun die Standardregeln
der drei wichtigsten Ketten und unsere 'Ping'-Regel angezeigt.
Hier ein Auszug:
Chain INPUT (policy ACCEPT) <- Standardregel der Kette INPUT
target prot opt source destination <- Überschriften
DROP icmp -- anywhere anywhere <- Ping-Regel
In der ersten Zeile steht die Standardregel
der Kette (Chain) INPUT. Die Methode (policy) dieser Regel
lautet ACCEPT.
Sie akzeptiert also, wenn keine Regel zutrifft, alles. Die nächste
Zeile enthält die Überschriften der einzelnen Regeln. Unter target steht das Ziel bzw. die Methode die angewandt wird, wenn
die Regel zutrifft (also nicht etwa das Ziel des Netzpaketes!). prot ist die Abkürzung
für das Protokoll - hier
ICMP (wird von Ping benutzt).
Unter Source und Destination
stehen die Quell- oder Zieladressen. Bei unserer Regel sind diese egal.
D.h. egal wer einen Ping sendet - er wird abgelehnt. Das ganze was sie
sehen ist die filter-Tabelle.
Unter 4.2 gab es einige Befehle die Nummern verlangen. Um diese Nummern
anzuzeigen benutzt man zusätzlich die Option --line-numbers:
iptables -L --line-numbers
Hierdurch habe wir in der Auflistung eine weitere Spalte mit dem Namen Num. In dieser steht einfach die
Nummer der Regel:
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP icmp -- anywhere anywhere
Standardmäßig wurden
bisher nur die Daten der Tabelle filter
aufgelistet. Um auch die Informationen von nat und mangle aufzurufen muss man diese
mit übergeben:
# für nat
iptables -t nat -L
# oder mangle
iptables -t mangle -L
Weitere zusätzliche Parameter sind:
--verbose,
-v: Zeigt eine ausführlichere Liste (u.a. mit der Anzahl
der Pakete und Bytes die gesendet/empfangen wurden
)
--numeric, -n: IP- und
Port-Nummern werden nicht in Namen aufgelöst (wie bei
route -n)
4.3.3 Zähler zurücksetzen: --zero / -Z
iptables
benutzt Zähler um
festzustellen wieviel Pakete und welche Datenmengen über bestimmte
Regeln gingen. Wenn man den Zähler der übertragenen Pakete
zurücksetzen
will benutzt man den Befehl --zero.
Dies betrifft jedoch nur die Zähler der Regeln und nicht die der Ketten.
# Zähler anzeigen
iptables -L -v
iptables -Z
# oder nur für eine Kette
iptables -Z OUTPUT
# Zähler wieder anzeigen
iptables -L -v
4.3.4 Standardverhalten festlegen: --policy / -P
Wie bereits im
Beispiel angesprochen besitzt jede
Kette eine
Standardmethode. Diese werden mit
dem Befehl
--policy
festgelegt. Sie werden angewandt wenn keine der
Regeln zutreffend war.
# die Kette FORWARD lässt alles durch
iptables -P FORWARD ACCEPT
4.3.5 Regeln anhängen: --append / -A
Dies ist der wohl am meisten benutzte iptables-Befehl.
Mit ihm werden Regeln an die vorhandenen angehängt. In dem obigen
Beispiel haben wir die Ping-Regel
angehängt:
iptables -A INPUT -p icmp -j DROP
Nach dem
Befehl (-A)
muss die
Kette (INPUT) zu der die Regel
gehört angegeben werden. Ab nun folgen zunächst ein oder
mehrere
Parameter mit denen
man die Regel bis ins kleinste Detail spezifizieren kann. Ich habe hier
nur den Parameter
protocol (-p)
benutzt und diesem als Argument das Protokoll
icmp übergeben. Am Ende wird
das Ziel übergeben, das angewandt wird wenn die Regel zutrifft:
DROP - das Paket wird verworfen.
4.3.6 Regeln einfügen: --insert / -I
Wie bereits erwähnt werden die Regeln ja
nacheinander abgerufen (siehe auch
3.6) und wenn eine Zutrifft
wird die Verarbeitung in der
Tabelle
abgebrochen. Unsere
Ping-Regel
lässt ja nun überhaupt keinen Ping mehr zu. Nun möchten
wir aber dass ein Ping vom
lokalen
Netzwerk ankommt und beantwortet wird. Eine Regel mit
--append anzuhängen würde
nichts bringen. Daher müssen wir mit
--insert diese Regel
vor der Vorhandenen plazieren.
Hierzu benötigen wir zuerst deren Nummer:
iptables -L --line-numbers
Nun können wir die Regel an deren Nummer plazieren. Hierdurch
rücken alle folgenden Regeln um einen Platz weiter:
iptables -I INPUT 1 -p icmp -s 192.168.0.0/24 -j ACCEPT
Ab jetzt werden Pings aus
dem lokalen Netzwerk (-s
192.168.0.0/24) zugelassen, da die ACCEPT-Regel vor der DROP-Regel
steht. Dieser Befehl wird allerdings seltener benötigt. Beim
Erstellen eines Scripts für alle Regeln eines Rechners
kümmert man sich ja schon um die Reihenfolge und benutzt daher nur
--append. Die Übergabe
der Nummer ist optional. Wenn man keine angibt
wird die Nummer 1 benutzt.
4.3.7 Regeln ersetzen: --replace/ -R
Dieser Befehl wird wie
--insert
angewendet, nur mit dem Unterschied, dass die vorhandene
überschrieben wird.
4.3.8 Regeln löschen: --delete / -D
Mit --delete können
Regeln aus einer Kette entfernt werden. Als Argumente wird entweder die
Nummer oder die Regel benutzt.
# Löscht die Regel Nr. 2
iptables -D INPUT 2
# Löscht die Regel auf die die Syntax zutrifft
iptables -D INPUT -p icmp -s 192.168.0.0/24 -j ACCEPT