Einführung
In diesem Beitrag geht es um die Einführung in iptables um die Funktionen zu verstehen und anwenden zu können.
Achtung: Vorsicht ist geboten, durch unüberlegte Änderungen an der Firewall kann man sich schnell aus dem System aussperren.
Voraussetzungen
root
Zugriff auf eine Linux Shell mit installiertem iptables
Abschnitt 1 - Was ist iptables?
iptables ist ein Userspace Programm das zur Konfiguration der Netfilter Firewall im Linux Kernel verwendet wird. Somit ist iptables nur ein Werkzeug um die im Linux Kernel integrierte Firewall zu konfigurieren.
iptables teilt sich in zwei bereiche auf jeweils für IPv4 und IPv6 gibt es eigene Tools.
Für IPv4 verwendet man iptables
und für IPv6 ip6tables
alle nachfolgenden Befehle können aber mit beiden Tools gleich verwendet werden.
Durch den Netfilter ist es Möglich:
- Eingehende Pakete zu Filtern bevor diese an die Zielanwendung geleitet werden.
- Ausgehende Pakete zu Filtern bevor diese den Rechner verlassen.
- Durch den Rechner geleitete (Router) Pakete zu prüften.
- Paketmanipulation durchzuführen.
Abschnitt 1.1 - Funktionsweise
Die Paketprüfung mit iptables ist dreistufig aufgebaut (von oben nach unten):
- Tabellen
- "Chains" (Ketten)
- Filterregeln
Trifft eine der definierten Filterregeln in den Tabellen / Chains zu wird diese ausgeführt, sollte keine Regel hinterlegt sein oder keine der definierten Regeln zutreffen wird auf die hinterlegte Policy angewendet (Später mehr dazu).
Tabellen
In den Tabellen sind verschiedene Chains zu Gruppen nach der grundsätzlichen Aufgabe zusammengefasst.
Tabelle | Beschreibung |
---|---|
filter | Die Standardtabelle hier werden alle Filterregeln hinterlegt |
nat | Diese Tabelle wird für NAT (Network Address Translation) und Port Forwarding verwendet. |
mangle | Diese Tabelle wird bei Paketmanipulationen verwendet. |
raw | Diese Tabelle wird eingesetzt um Ausnahmen vom Connection Tracking zu definieren. |
Chains
Die Chains legen fest, wann ein Paket geprüft wird z.B. bevor es versendet wird. Eine Chain kann dabei in mehreren Tabellen vorkommen.
Chain | Tabelle | Beschreibung |
---|---|---|
INPUT | filter, mangle | Wird auf alle Pakete angewendet, die an die lokalen Adresse gerichtet sind. |
OUTPUT | filter, nat, mangle, raw | Wird auf alle Pakete angewendet, die von der lokalen Adresse stammen. |
FORWARD | filter, mangle | Wird auf alle Pakete angewendet, die geroutet werden. |
PREROUTING | nat, mangle, raw | Wird auf alle Pakete angewendet, bevor diese geroutet werden. |
POSTROUTING | nat, mangle | Wird auf alle Pakete angewendet, nachdem diese geroutet wurden. |
Abschnitt 2 - Definition von Filterregel
Hier sind die gängigsten CLI Parameter für das erstellen der Filterregeln aufgelistet.
Option | Beschreibung |
---|---|
-t Tabelle | Diese Filterregel gilt für die genannte Tabelle. |
-I Chain (Position) | Regel wird an gewählte Position der Chain hinzugefügt. Standardmäßig wird die Regel am Anfang der Chain eingefügt. |
-A Chain | Regel wird an die Chain angehängt. |
-D Chain | Regel wird aus der Chain gelöscht. |
-F Chain | Alle Regeln der Chain löschen. |
-L Chain | Liste alle Regeln der Chain. |
-p Protokoll | Das Paket wird nur geprüft, wenn es dem Protokoll entspricht (z.B. TCP, UDP, ICMP). |
-s IP-Adresse | Das Paket wird nur geprüft, wenn es von der definierten IP-Adresse / IP-Netz stammt. |
-d IP-Adresse | Das Paket wird nur geprüft, wenn es an die definierte IP-Adresse gesendet wird. |
-i Netzwerkschnittstelle | Das Paket wird nur geprüft, wenn es über die entsprechende Netzwerkschnittstelle eingegangen ist. |
-o Netzwerkschnittstelle | Das Paket wird nur geprüft, wenn es über die entsprechende Netzwerkschnittstelle versendet wird. |
--sport (Port) oder --source-port (Port) | Das Paket wird nur geprüft, wenn es von dem definierten Port stammt. Muss zwingend in Verbindung mit -p benutzt werden! |
--dport (Port) oder --destination-port (Port) | Das Paket wird nur geprüft, wenn es an den definierte Port gesendet wird. Muss zwingend in Verbindung mit -p benutzt werden! |
-j Aktion | Legt fest, welche Aktion auf das Paket angewendet werden soll. |
Abschnitt 2.1 - Definition von Aktionen
Aktion | Beschreibung |
---|---|
ACCEPT | Das Paket wird akzeptiert und angenommen. |
DROP | Das Paket wird nicht angenommen, der Sender erhält keine Nachricht. |
REJECT | Das Paket wird nicht angenommen, der Sender wird benachrichtigt. |
LOG | Die Paketdaten werden im System-Log festgehalten, anschließend wird die nächste Regel der Chain geprüft und ggf. angewendet. |
Abschnitt 2.2 - Definition von Policies
Eine Policy ist wie eine Grundsatzregel zu sehen sie greift also immer, wenn keine andere Filterregel zutrifft.
Eine Policy setzt sich aus der Chain und einer Aktion zusammen:
iptables -P INPUT DROP
Achtung: Diese Policy Blockiert den eingehenden Traffic soweit keine Regeln definiert wurden.
Hier im Beispiel werden alle eingehenden Pakete in in der Filter Tabelle durch die Policy verworfen.
Abschnitt 3 - Loopback Interface (127.0.0.1)
Auf jedem Linux System befindet sich ein Lokaler Netzwerkadapter dieser trägt den Namen lo
Hierrüber laufen interne Host anwendungen, diese Kommunizieren mitunter per IPC (Inter Process Communication) über diesen Adapter.
Daher ist es ratsam auf diesen Adapter keinerlei Filterregeln anzuwenden, da dies zu Kommunikationsproblemen führen kann.
Diesem Adapter sollte die Kommunikation ohne Einschränkungen erlaubt werden:
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
Abschnitt 4 - Praktische Beispiele
Erstellen einer Paket Filterregel
Diese Regel erlaubt eingehenden HTTPS Traffic:
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Erstellen einer Host Filterregel
Diese Regel erlaubt eingehenden Traffic vom angegebenen Host:
iptables -A INPUT -s 10.0.0.1 -j ACCEPT
Diese Regel verbietet eingehenden Traffic vom angegebenen Host.:
iptables -A INPUT -s 10.0.0.1 -j DROP
Regeln können auch an einer bestimmten Stelle hinzugefügt werden:
iptables -I INPUT 2 -s 10.0.0.1 -j DROP
Diese Regel steht z.B. an zweiter Stelle.
Löschen aller Regeln
Löscht alle Regeln in allen Chains:
iptables -F
Löscht alle Regeln in der INPUT Chain:
iptables -F INPUT
Löschen einer Regel
Hiermit werden die Regeln mitsamt den entsprechenden Nummern angegeben:
iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- anywhere anywhere tcp dpt:https
2 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Mithilfe dieser Nummer kann nun die gewünschte Regel gelöscht werden:
iptables -D INPUT 1
Connection State
Damit bei bereits hergestellten Verbindungen nicht jedes Paket durch den Filter muss, können Connection State Filter eingesetzt werden.
Eingehende Pakete für existierende Verbindungen zulassen:
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
Ausgehende Pakete für existierende Verbindungen zulassen:
iptables -A OUTPUT -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
Hinweis: Die Connection State Regeln sollten weit oben in der Firewall Liste stehen da diese sonst ihren nutzen verlieren.
Verwerfen von invaliden Paketen
Mit diesem Befehl werden alle eingehende Pakete die nicht dem TCP / IP Format entsprechen verworfen:
iptables -A INPUT --ctstate INVALID -j DROP
Syn-Flood Protection
Mit diesen Einträgen wird der Überlastung des Servers durch zu viele Anfragen vorgebeugt:
iptables -N syn_floodiptables -A INPUT -p tcp --syn -j syn_floodiptables -A syn_flood -m limit --limit 1/s --limit-burst 3 -j RETURN
iptables -A syn_flood -j DROP
iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 1 -j ACCEPT
iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 1 -j LOG --log-prefix PING-DROP:
iptables -A INPUT -p icmp -j DROP
iptables -A OUTPUT -p icmp -j ACCEPT
Abschnitt 5 - Persistenz
Die konfigurierten Firewall Regeln sind nicht automatisch persisten gespeichert um dies zu ändern muss das Paket iptables-persistent
nachinstalliert werden.
Danach kann mit dem Befehl:
iptables-save > /etc/iptables/rules.v4 # Für IPv4
ip6tables-save > /etc/iptables/rules.v6 # Für IPv6
Die aktuelle Konfiguration gespeichert werden.
Abschnitt 6 - Länder Blockierung
Mit dem beigefügten Script lassen sich IP Drop Regeln für ganze Länder erstellen.
Hinweis: Die Blockierung beschränkt sich auf IPv4 Adressen.
#!/bin/bash
###PUT HERE SEPARATED LIST OF COUNTRY CODE###
COUNTRIES=(de at)
WORKDIR=$(mktemp -d)
#######################################
for i in "${COUNTRIES[@]}";
do
curl http://www.ipdeny.com/ipblocks/data/countries/$i.zone >> $WORKDIR/iptables-blocklist.txt;
done
if [ -f $WORKDIR/iptables-blocklist.txt ]; then
iptables -F
BLOCKDB="$WORKDIR/iptables-blocklist.txt"
IPS=$(grep -Ev "^#" $BLOCKDB)
for i in $IPS
do
echo iptables -A INPUT -s $i -j DROP >> input.sh
echo iptables -A OUTPUT -d $i -j DROP >> output.sh
done
fi
rm -r $WORKDIR
Im oben aufgeführten Script lassen sich die Variablen COUNTRIES
entsprechend der Länder kürzel abändern. Bei ausführung des Scripts erstellt dieses zwei Dateien input.sh
und output.sh
darin enthalten sind die benötigen iptables Befehle um die IP Adressen der Länder zu blockieren.
Zusammenfassung
In diesem Beitrag wurde die Funktionsweise von iptables erläutert. Auserdem wurde mit praktischen Beispielen auf die verschiedenen Möglichkeiten eingegangen um iptables optimal zu nutzen.