Get Rewarded! We will reward you with up to €50 credit on your account for every tutorial that you write and we publish!

Einrichtung eines Paketfilters auf Linux

profile picture
Author
Markus
Published
2020-06-17
Time to read
9 minutes reading time

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.

License: MIT
Want to contribute?

Get Rewarded: Get up to €50 in credit! Be a part of the community and contribute. Do it for the money. Do it for the bragging rights. And do it to teach others!

Report Issue
Try Hetzner Cloud

Get 20€ free credit!

Valid until: 31 December 2024 Valid for: 3 months and only for new customers
Get started
Want to contribute?

Get Rewarded: Get up to €50 credit on your account for every tutorial you write and we publish!

Find out more