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.




Benutzer, die ID des Prozesses und „SUID“ mit den Optionen (2), können Probleme mit den Rechten bekommen.





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.




Iptables kann mit „stateful inspection“ auch Pakete in Abhängigkeit mit dem Zustand der Verbindung Prüfen (z.B. ob es ein Folgepaket einer bestehenden Verbindung ist oder eine neue Verbindung).





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.




Sobald das Interface deaktiviert wird, werden alle Verbindungen vergessen.




Das Linuxnetzwerk läuft über die Schnittstelle „lo“. Definiert man mit „iptables“ Filterregeln und richtet keine Regel oder Policy für „lo“ ein, kann dass zu schweren Fehlfunktionen führen.




Mit „iptables“ erstellte Regeln gehen nach einem Neustart des PCs verloren! Sollen die Regeln dauerhaft gespeichert bleiben sollten sie in einem Script hinterlegt werden, dass beim Neustart automatisch geladen wird. (siehe auch:rc.local“ oder weiter unten „Firewallscripte automatisch starten“.)






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.




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


  • /sbin/iptables ⇒ bei Fedora , Red Hat , Debian , Ubuntu .
  • /usr/sbin/iptables ⇒ bei SuSE .




Der Dateiname wird in der Variablen IPT gespeichert.


Damit die „iptable“ Skripte gestartet werden können, müssen die Dateien ausführbar sein (x-Bit gesetzt).





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






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      






iptables und Stealth Scans von Klaus Gerhardt



Cloud