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

| Chain | Beschreibung | |-------|--------------| | INPUT | Eingehende Pakete zum Server | | OUTPUT | Ausgehende Pakete vom Server | | FORWARD | Pakete, 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

| Option | Bedeutung | |--------|-----------| | -A | Append (Regel anhängen) | | -I | Insert (am Anfang einfügen) | | -D | Delete (Regel löschen) | | -p | Protokoll (tcp, udp, icmp) | | --dport | Zielport | | --sport | Quellport | | -s | Quell-IP | | -d | Ziel-IP | | -j | Jump (Aktion) | | -i | Input-Interface | | -o | Output-Interface |

Aktionen

| Aktion | Beschreibung | |--------|--------------| | ACCEPT | Paket erlauben | | DROP | Paket verwerfen (still) | | REJECT | Paket ablehnen (mit Antwort) | | LOG | Paket 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

| Tool | Beschreibung | |------|--------------| | iptables | Klassisch, weit verbreitet | | nftables | Nachfolger von iptables | | ufw | Einfaches Frontend für iptables | | firewalld | Frontend 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.