iptables
Damit ein Linuxsystem eine Paketfilterfirewall benutzen kann wird die Schnittstelle „netfilter“ und das Userfontend „iptables“ benötigt.
Mit „iptables“ definiert man die Firewall-Regeln, die dann über „netfilter“ im Kernel aktiviert werden. Iptables ist in vielen Linux Distributionen Standardmässig enthalten. Sind mit Iptables erstellte Filterregeln konfiguriert, werden alle IP Datenpakete geprüft (ankommende, bevor sie an die Zielanwendung weitergeleitet werden und ausgehende bevor sie den Rechner verlassen).
Wird das System als Router eingesetzt werden die Pakete wärend der weiterleitung geprüft. Pakete können auch manipuliert werden.
Die Paketprüfung und die Filterregeln sind dreistufig aufgebaut (hierarchisch von oben nach unten):
- Tabellen.
- Ketten (Chains).
- Filterregeln.
Trifft eine definierte Regel in einer Tabelle oder Kette zu, wird eine in der Regel definierte Aktion ausgeführt. Trifft keine Regel zu, wird die in der Tabelle gültige Policy angewandt.
Tabellen
In den Tabellen werden Regeln zu Gruppen nach grungsätzlichen Aufgaben unterteilt. Es gibt vier wichtige Tabellen in der Filterregeln hinterlegt werden können.
filter | Standardtabelle, hier werden alle Filterregeln hinterlegt. |
nat | Wird für Adressumsetzung und Port Forwarding verwendet. |
mangle | wird zur Paketmanipulation eingesetzt. |
raw | definiert Ausnahmen von Connection Tracking. |
Ketten (Chains)
Jede Tabelle enthält verschiedene Ketten (Chains), die festlegen wann ein Paket geprüft wird (z.B vor der versendung des Pakets), ob die Regel einzufügen oder zu löschen ist. Es gibt fünf Ketten und nicht jede Kette muss in jeder Tabelle vorkommen.
Kette | für Tabelle | Beschreibung |
---|---|---|
INPUT | filter, mangle | Hier sind alle Paketregeln enthalten die für den eigenen lokalen Rechner bestimmt sind. |
OUTPUT | filter, mangle, nat, raw | Hier sind alle Regeln enthalten die auf ausgehende Pakete von einem lokalen Prozess angewandt werden. |
FORWARD | filter, mangle | Hier werden weiterzuleitende Pakete verarbeitet, die greoutet werden. |
PREROUTING | nat, mangle, raw | Wird auf Pakete angewandt, bevor sie geroutet werden. |
POSTROUTING | nat, mangle | Wird auf Pakete angewandt, nachdem sie geroutet wurden. |
Filterregeln
In den Tabellen und Ketten werden die Filterregeln festgelegt. Der Aufruf erfolgt mit „root“ Rechten.
iptables <Option>
iptables -L
Optionen für Filterregeln
Die Regeln werden Zeilenweise durchlaufen. Trifft eine Regel für ein Paket zu wird die Verarbeitung abgebrochen. Ist es eine Benutzerdefinierte Kette, wird der durchlauf in der aufgerufenen Kette weitergeleitet, ist die Kette eine eingebaute Standardkette, so gilt als Ziel die Policy.
Optionen | Beschreibung |
---|---|
-t <Tabelle> | Filterregel gilt für diese Tabelle. Ist als Standard eingestellt wenn man Option -t weglässt. Hier stehen die Ketten INPUT, OUTPUT, FORWARD zur verfügung. Jedes Paket muss die Ketten dieser Tabelle durchlaufen. |
-I [Position] [Kette] [Regel] | neue Regel in Kette einfügen. Ohne Positionsangabe wird die Regel an der ersten Position der Kette eingefügt. |
-A [Kette] [Regel] | neue Regel an Kette anhängen. (Diese Option benötigt man z.B für ein Script). |
-F [Kette] | Löscht Regeln einer Kette oder ohne Kettennamen aller Ketten. |
-L [Kette] | listet die Regeln einer Kette oder ohne Kettennamen die Regeln aller Ketten auf. |
-L [Tabelle] | listet die Regeln der Tabelle oder ohne Tabelle die Regeln aller Tabellen auf. |
-N [Kette] | Legt eine neue Kette an. |
-X [Kette] | Löscht eine Kette oder ohne Kettennamen alle vom Benutzer angelegten Ketten. |
-E [alterKettenname] [neuerKettenname] | Kette umbenennen. |
-Z [Kette] | Resetet den Paket und Bytezähler der Regeln einer Kette auf null. |
-D [Kette] [(Regelnummer)(Regel)] | löscht eine Regel unter Angabe der Regelnummer oder der Regel. |
-p Protokoll | Das Paket wird nur geprüft, wenn es gemäß IP Protokoll (z.B. TCP, UDP, ICMP, all) ist. |
-s [IP Adresse] | Das Paket wird nur geprüft, wenn es von der IP Adresse kommt. |
-d [IP Adresse] | Das Paket wird nur geprüft, wenn es an diese IP Adresse versendet wird. |
-i [Netzwerkschnittstelle] | Das Paket wird nur geprüft, wenn es über die Schnittstelle kommt. |
-o [Netzwerkschnittstelle] | Das Paket wird nur geprüft, wenn es über die Schnittstelle versendet wird. |
--sport [Port-Nr] oder --source-port [Port-Nr] | Paket wird nur geprüft, wenn es vom definierten Port kommt. !! Muss in verbindung mit -p eingesetzt werden !! |
--dport [Port-Nr] oder --destination-port [Port-Nr] | Paket wird nur geprüft, wenn es an definierten Port versendet wird. !! Muss in verbindung mit -p eingesetzt werden !! |
--tcp-flags [Maske] [gesetzt] | Überprüft tcp-flags. Im Argument [Maske] übergibt man eine durch Kommas getrennte Liste aller zu überprüfender flags (SYN, ACK, FIN, RST, URG, PSH, ALL, NONE), im Argument gesetzt gibt man an, welche flags gesetzt sein sollen um das Paket durchzulassen. !! Muss in verbindung mit -p eingesetzt werden !! (Beispiel unter dieser Tabelle(1)). |
-P [Kette] [Aktion] | Ändert die Policy für eine Kette (INPUT, OUTPUT, FORWARD). Mögliche Werte sind ACCEPT oder DROP. Wurde noch keine Firewall konfiguriert sind die Werte im Standard ACCEPT. |
-j [Aktion] | legt Fest welche Aktion auf das Paket angewendet werden soll, wenn kriterien zutreffen. |
Beispiel tcp flags(1):
iptables -A FORWARD -p --tcp-flags SYN,ACK,RST SYN -j DENY
Hier dürfen alle Pakete die das „SYN flag“ gesetzt, „ACK“ und „RST“ nicht gesetzt haben den „Filter passieren.
state
Das „state“ Modul wird über den Parameter [-m] geladen, man kann damit den Status der Pakete spezifizieren.
Beispiel:
iptables -A INPUT -p tcp --dport 21 --sport 1024: -m state --state NEW,ESTABLISHED -j ACCEPT
- INVALID ⇒ Paket gehört zu keiner bekannten Verbindung.
- ETABLISHED ⇒ Paket gehört zu bestehender Verbindung.
- NEW ⇒ Keine Verbindung, Paket baut neue Verbindung auf.
- RELATED ⇒ Paket gehört zu einer Verbindung und baut neue Verbindung auf.
owner
Das „owner“ Modul wird ebenfalls mit [-m] geladen. Das Modul arbeitet in der OUTPUT Kette und durchsucht den Ersteller des Pakets, hat das Paket keinen Besitzer, kann es nicht erfaßt werden.
- --uid-owner [userid] ⇒ Paket wurde von Benutzer mit [userid] des Prozesses erstellt wurde(2).
- --gid-owner [groupid] ⇒ bezieht sich auf [groupid] des Prozesses.
- --cmd-owner [name] ⇒ überprüft den [name] des Prozesses.
Aktionen
Trifft eine Filterregel auf ein Paket zu, kann über das Schicksal des Pakets entschieden werden.
Aktion | Beschreibung |
---|---|
ACCEPT | Der Paketdurchgang wird aktzeptiert. |
DROP | Paket wird verworfen. Der Sender erhält keine Nachricht. |
REJECT | gleicher Effect wie Drop. Es wird eine Meldung ausgegeben, dass der Dienst nicht verfügbar ist. |
QUEUE | Paket wird in den Userspace weitergeleitet (falls der Kernel dies unterstüzt). |
RETURN | Falls man sich in einer selbstdefinierten Kette befindet, springt man in die aufrufende Kette zurück. Die Kette wird ab der Stelle weiterdurchlaufen wo in die selbstdefinierte Kette gesprungen wurde. |
Kette | springt in eine Benutzerdefinierte Kette „Kette“. |
LOG | Erzeugt einen Eintrag im Kernel Log. |
Optionen von LOG:
--log-level [Levelnummer/Name] | Logeinstellungen. Mehr infos in der Manpage von syslogd. |
Namen | debug, info, warning, alert, notice, err, crit, emerg. |
Levelnummern | 7 - 0. |
--log-prefix [String 30 Zeichen] | String am Beginn der Logmeldung. |
Policys - Grundsatzregeln
Um nicht für jedes mögliche Paket eine Filterregel (Protokoll, Schnittstelle, Port etc.) definieren zu müssen, kann für jede Kette (Chain) eine Policy (Grundsatzregel) definiert werden. Die Policy wird immer dann angewandt, wenn keine andere Filterregel zutrifft.
Sie setzt sich aus Tabellen (Optional), der Kette und der Aktion zusammen.
Beispiel:
iptables -P INPUT DROP
Hier wird definiert, dass für die Tabelle „filter“ (Standard) alle eingehenden Pakete verworfen werden.
IPtables mit NAT
Für NAT muß die Tabelle, die Ketten mit der Option [-t nat] definiert werden, dazu kommen weitere Match Extensions.
- -j DNAT ⇒ Lädt Erweiterungen für Destination-NAT, diese funktioniert nur in der PREROUTING und OUTPUT Kette.
- --to-destination IP(-IP) (:Port-port) ⇒ Range von neuen Adressen.
- -j SNAT ⇒ Diese Aktion läuft nur in der POSTROUTING Kette.
- --to-source IP(-IP) (:PORT-port) ⇒ hier kann man neue Quelladressen und Quellports definieren.
- -j MASQUERADE ⇒ fast wie SNAT (läuft nur in der POSTROUTING Kette).Die Quelladresse wird auf IP der Schnittstelle geändert wo das Paket den Rechner verläßt.
Eigene Filterregeln erstellen
Ein Beispiel Firewall Skript befindet sich im Tipps & Tutorials bereich IPTables Beispiele.
Grundzustand herstellen
Beim erstellen eigener Regeln sollten zuerst Standardfilterregeln erstellt und alle alten Regelketten gelöscht werden, um sicher zu gehen dass keine älteren Regeln mehr aktiv sind.
... # --------------- Standard Richtlinien ------------- # # Alles Standardmäßig Verbieten. $IPT -P INPUT DROP $IPT -P FORWARD DROP $IPT -P OUTPUT DROP $IPT -t nat -P PREROUTING ACCEPT $IPT -t nat -P OUTPUT ACCEPT $IPT -t nat -P POSTROUTING ACCEPT $IPT -t mangle -P PREROUTING ACCEPT $IPT -t mangle -P INPUT ACCEPT $IPT -t mangle -P FORWARD ACCEPT $IPT -t mangle -P OUTPUT ACCEPT $IPT -t mangle -P POSTROUTING ACCEPT # ----------- Alle Regelketten löschen -------- # $IPT -F $IPT -t nat -F $IPT -t mangle -F $IPT -X $IPT -t nat -X $IPT -t mangle -X $IPT -Z $IPT -t nat -Z $IPT -t mangle -Z ...
Benutzerdefinierte Ketten erstellen
#----------------- Benutzerdefinierte Ketten ------------------ # # Pakete Loggen, dann erlauben. $IPT -N ACCEPTLOG $IPT -A ACCEPTLOG -j $LOG $RLIMIT --log-prefix "ACCEPT " $IPT -A ACCEPTLOG -j ACCEPT # Pakete Loggen, dann verwerfen. $IPT -N DROPLOG $IPT -A DROPLOG -j $LOG $RLIMIT --log-prefix "DROP " $IPT -A DROPLOG -j DROP # Pakete Loggen, dann verbieten. $IPT -N REJECTLOG $IPT -A REJECTLOG -j $LOG $RLIMIT --log-prefix "REJECT " $IPT -A REJECTLOG -p tcp -j REJECT --reject-with tcp-reset $IPT -A REJECTLOG -j REJECT
Logging
Die Aktion LOG bietet an, einzelne Regeln zu protokollieren. Dazu muß die Regel einmal mit (z.B. -j ACCEPT, DROP) und einmal mit (-j LOG) definiert werden. Das Logging erledigt der „syslogd“ nach z.B. “/var/log/messages„ und “/var/log/warn„.
... for PORT in 23 69 135 139 445 631 1433 2049 3306 4444 5999 6000 6001 6002 6003 7100 7741; do $IPT -A INPUT -i $INET -p tcp --dport $PORT -j LOG --log-prefix "fw_Meldung: " --log-level warning $IPT -A OUTPUT -o $INET -p tcp --dport $PORT -j LOG --log-prefix "fw_Meldung: " --log-level warning $IPT -A INPUT -i $INET -p tcp --dport $PORT -j DROP $IPT -A OUTPUT -o $INET -p tcp --dport $PORT -j DROP done ...
In dieser Schleife werden die genannten Ports blockiert und Protokolliert.
IPtable Skripte starten
Das Kommando für „iptables“ befindet sich je nach Linux System in verschiedenen Verzeichnissen, können jedoch auch an anderen Stellen im System gespeichert werden z.B. im Verzeichnis “/etc/my-local-fw-dir/„.
Der Dateiname wird in der Variablen IPT gespeichert.
/etc/rc.local
In der Datei “/etc/rc.local„ kann der Pfad zum Iptable - Skript eingetragen werden, dieses wird dann beim Systemstart geladen.
#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. /pfad zum/<firewall script> exit 0
IPtables Start via PPP
Die Dateien “/etc/ppp/ip-up.d„ , “/ip-down.d/„ werden beim Herstellen und beenden jeder PPP Verbindung ausgeführt. Der Name der Internetschnittstelle wird dem Skript übergeben, dadurch kann z.B. eine Firewall dynamisch an die Schnittstelle angepasst werden. An die beiden Skripte werden folgende Parameter übergeben, der erste bezeichnet den Schnittstellennamen (z.B. ppp0). „$6“ bezeichnet die Identifikationszeichenkette der PPP Verbindung (Option „ipparam“).
Um die Zusammenarbeit mit den Skripten zu gewährleisten, müssen ein paar Dateien geändert werden:
- /etc/ppp/*/<script>
- ipparam "dsl"
/etc/ppp/ip-up.local ⇒ muß erzeugt oder um folgendes erweitert werden:
#!/bin/sh #start fw #$1 definiert verwendete ppp Schnittstelle (z.B. ppp0) #$6 enthält die ipparam Zeichenkette if [ "$6" = "dsl" ]; then /etc/pfad zur Datei/<script> $1 fi
/etc/ppp/ip-down.local muß erzeugt oder um folgendes erweitert werden:
#!/bin/sh #start fw if [ "$6" = "dsl" ]; then /etc/pfad zur Datei/<script> fi
Die Skripte werden jedesmal gestartet wenn eine PPP Verbindung erstellt wird. Im Skript muß die Variable INET dynamisch eingestellt werden.
#!/bin/sh # script ... ... LAN=eth0 # dynamische einstellung INET=$1 ... ...
Filterregeln überprüfen
Mit folgenden Kommandos kann überprüft werden, ob Filterregeln definiert sind.
root@home:~# iptables -L
root@home:~# iptables -t nat -L
root@home:~# iptables -t mangle -L
root@home:~# iptables -t raw -L
Weitere Infos / Links
iptables und Stealth Scans von Klaus Gerhardt
Cloud