iptables ist das klassische Firewall-Tool unter Linux. Es filtert Netzwerkpakete basierend auf Regeln, die Sie definieren.

Grundkonzept

iptables arbeitet mit:

  • Tabellen: Verschiedene Funktionsbereiche (filter, nat, mangle)
  • Chains: Regelketten (INPUT, OUTPUT, FORWARD)
  • Regeln: Bedingungen und Aktionen

Die wichtigsten Chains

ChainBeschreibung
INPUTEingehende Pakete zum Server
OUTPUTAusgehende Pakete vom Server
FORWARDPakete, die durch den Server geroutet werden

Aktuelle Regeln anzeigen

# Alle Regeln
iptables -L

# Mit Zeilennummern
iptables -L --line-numbers

# Detailliert
iptables -L -v

# Als Befehle (zum Kopieren)
iptables -S

# Für NAT-Tabelle
iptables -t nat -L

Regeln erstellen

Syntax

iptables -A CHAIN -p PROTOKOLL --dport PORT -j AKTION
OptionBedeutung
-AAppend (Regel anhängen)
-IInsert (am Anfang einfügen)
-DDelete (Regel löschen)
-pProtokoll (tcp, udp, icmp)
--dportZielport
--sportQuellport
-sQuell-IP
-dZiel-IP
-jJump (Aktion)
-iInput-Interface
-oOutput-Interface

Aktionen

AktionBeschreibung
ACCEPTPaket erlauben
DROPPaket verwerfen (still)
REJECTPaket ablehnen (mit Antwort)
LOGPaket protokollieren

Grundlegende Firewall einrichten

Schritt 1: Loopback erlauben

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

Schritt 2: Bestehende Verbindungen erlauben

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Schritt 3: SSH erlauben

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Schritt 4: Weitere Dienste

# HTTP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# HTTPS
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# DNS
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j ACCEPT

Schritt 5: Ping erlauben (optional)

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

Schritt 6: Alles andere blockieren

iptables -A INPUT -j DROP

Komplettes Beispiel

#!/bin/bash
# Firewall-Skript

# Alle Regeln löschen
iptables -F
iptables -X

# Standardrichtlinien
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Loopback
iptables -A INPUT -i lo -j ACCEPT

# Bestehende Verbindungen
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# SSH (nur von bestimmter IP)
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT

# HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Ping begrenzt
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

# Logging für abgelehnte Pakete
iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: "

Regeln verwalten

Regel löschen

# Nach Nummer
iptables -D INPUT 3

# Nach Spezifikation
iptables -D INPUT -p tcp --dport 80 -j ACCEPT

Regel einfügen

# An Position 2
iptables -I INPUT 2 -p tcp --dport 443 -j ACCEPT

Alle Regeln löschen

iptables -F

Chain leeren und Standardrichtlinie

iptables -F INPUT
iptables -P INPUT ACCEPT

IP-Adressen

Einzelne IP erlauben

iptables -A INPUT -s 192.168.1.100 -j ACCEPT

IP-Bereich erlauben

iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT

IP blockieren

iptables -A INPUT -s 10.20.30.40 -j DROP

Port-Bereiche

# Port-Bereich
iptables -A INPUT -p tcp --dport 6000:6100 -j ACCEPT

# Mehrere Ports
iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT

Rate Limiting

SSH-Brute-Force-Schutz

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 4 -j DROP

Ping-Limit

iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4 -j ACCEPT

Logging

# Alle gedroppten Pakete loggen
iptables -A INPUT -j LOG --log-prefix "IPT-DROP: " --log-level 4

# Log in /var/log/kern.log oder /var/log/messages

Logs anzeigen:

grep "IPT-DROP" /var/log/kern.log

NAT (Network Address Translation)

SNAT/Masquerading

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Port-Weiterleitung

# Eingehend Port 8080 auf internen Server 192.168.1.10:80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80
iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 80 -j ACCEPT

Regeln speichern

Ubuntu/Debian mit iptables-persistent

apt install iptables-persistent
netfilter-persistent save

Manuell speichern/laden

# Speichern
iptables-save > /etc/iptables.rules

# Laden
iptables-restore < /etc/iptables.rules

Beim Boot laden

In /etc/rc.local oder als systemd-Service:

#!/bin/bash
iptables-restore < /etc/iptables.rules

IPv6 (ip6tables)

Gleiche Syntax wie iptables:

ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
ip6tables -A INPUT -p icmpv6 -j ACCEPT
ip6tables -A INPUT -j DROP

Debugging

Pakete zählen

iptables -L -v

Zeigt Pakete und Bytes pro Regel.

Testen ohne Aussperren

# Temporäre Regel mit Timeout
at now + 5 minutes <<< "iptables -F"

Falls Sie sich aussperren, werden Regeln nach 5 Minuten gelöscht.

iptables vs. nftables vs. ufw

ToolBeschreibung
iptablesKlassisch, weit verbreitet
nftablesNachfolger von iptables
ufwEinfaches Frontend für iptables
firewalldFrontend mit Zonen (CentOS/RHEL)

Für Einsteiger ist ufw einfacher:

ufw enable
ufw allow ssh
ufw allow http

Fazit

iptables ist mächtig, aber komplex. Für einfache Server-Firewalls ist ufw komfortabler. Bei komplexen Setups (NAT, Port-Forwarding) ist iptables-Wissen unverzichtbar. Speichern Sie Regeln immer, damit sie einen Neustart überleben.