Jeder der einen eigenen Server betreibt, muss sich auch mit dem Thema Firewall auseinander setzen.
Die Besonderheit an iptables ist, dass diese nur für IPv4 wirksame Regeln verwaltet und für IPv6 zusätzlich ip6tables konfiguriert werden muss.
Zudem muss man bei den Firewallregeln sehr bedacht vorgehen, da man sich sehr schnell mit nur einem Befehl aus dem eigenen Server aussperren kann.
Iptables kann Verbindungen blockieren, umleiten oder auch in der Anzahl und Geschwindigkeit begrenzen. Aber am häufigsten werden Ports gesperrt oder umgeleitet.
Ich gehe in diesem Blog erst einmal nur auf Befehle ein, die ich selbst bereits häufiger nutze.
Man wird aber schnell feststellen, dass viele Befehle zwischen iptables und ip6tables identisch sind.
Anzeigen aller Regeln
iptables -L
ip6tables -L
Listet alle aktuellen iptables-Regeln auf.
Blockieren des eingehenden Verkehrs auf einem bestimmten Port
iptables -A INPUT -p tcp --dport 80 -j DROP
ip6tables -A INPUT -p tcp --dport 80 -j DROP
Blockiert eingehenden TCP-Verkehr auf Port 80.
Blockieren des gesamten Verkehrs von einer spezifischen IP-Adresse
iptables -A INPUT -s 192.168.1.10 -j DROP
ip6tables -A INPUT -s 2001:db8::1 -j DROP
Blockiert eingehenden Verkehr von der angegebenen IP-Adresse.
Zulassen des eingehenden Verkehrs auf einem bestimmten Port
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
Erlaubt den eingehenden TCP-Verkehr auf Port 22.
Löschen aller Regeln (Zurücksetzen)
iptables -F
Löscht alle iptables--Regeln.
ip6tables -F
Löscht alle ip6tables-Regeln.
Speichern der iptables-Konfiguration
iptables-save > /etc/iptables/rules.v4
Speichert die aktuelle Konfiguration in einer Datei.
ip6tables-save > /etc/iptables/rules.v6
Speichert die aktuelle ip6tables-Konfiguration in einer Datei.
Wiederherstellen der iptables-Konfiguration
iptables-restore < /etc/iptables/rules.v4
Stellt die iptables-Konfiguration aus einer Datei wieder her.
ip6tables-restore < /etc/iptables/rules.v6
Stellt die ip6tables-Konfiguration aus einer Datei wieder her.
Protokollieren des abgelehnten Verkehrs
iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: " --log-level 4 ip6tables -A INPUT -j LOG --log-prefix "ip6tables-Dropped: " --log-level 4
Protokolliert alle abgelehnten Pakete mit einem spezifischen Präfix im Syslog.
Umleiten des Verkehrs von einem Port auf einen anderen
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
ip6tables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
Leitet jeglichen auf Port 80 eingehenden Verkehr auf Port 8080 um.
Erstellen einer benutzerdefinierten Kette
iptables -N mychain iptables -A INPUT -p tcp --dport 22 -j mychain iptables -A mychain -s 192.168.1.1 -j ACCEPT iptables -A mychain -j DROP ip6tables -N mychain ip6tables -A INPUT -p tcp --dport 22 -j mychain ip6tables -A mychain -s 2001:db8::1 -j ACCEPT ip6tables -A mychain -j DROP
Erstellt eine neue Kette für spezifische Aufgaben.
Zulassen von Ping-Anfragen
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT
Erlaubt Ping-Anfragen an den Host.
Konfiguration des NAT für ein privates Netzwerk
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Ermöglicht Geräten in einem privaten Netzwerk, über eine gemeinsame öffentliche IP-Adresse auf das Internet zuzugreifen.
Ein direktes NAT ist in ip6tables für IPv6 nicht vorgesehen, es gibt aber Möglichkeiten dies zu realisieren.
Festlegen einer Standardpolitik
iptables -P INPUT DROP
ip6tables -P INPUT DROP
Setzt die Standardpolitik für die INPUT-Kette auf DROP.
Zustandsabhängige Regeln
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Akzeptiert eingehenden Verkehr, wenn die Verbindung bereits etabliert oder verwandt ist.
Zeitbasierte Regeln
iptables -A INPUT -p tcp --dport 80 -m time --timestart 09:00 --timestop 17:00 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 80 -m time --timestart 09:00 --timestop 17:00 -j ACCEPT
Erlaubt eingehenden Verkehr auf Port 80 nur zwischen 09:00 und 17:00 Uhr.
Verwendung von IP-Bereichen
iptables -A INPUT -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT
ip6tables -A INPUT -m iprange --src-range 2001:db8::1-2001:db8::10 -j ACCEPT
Akzeptiert eingehenden Verkehr von einer Reihe von IPv6-Adressen.
Verkehrsratenbegrenzung
iptables -A INPUT -p tcp --dport 80 -m limit --limit 1/second --limit-burst -j ACCEPT
ip6tables -A INPUT -p tcp --dport 80 -m limit --limit 1/minute --limit-burst 100 -j ACCEPT
Begrenzt die Anzahl der Verbindungen zu Port 80 auf 1 pro Minute nach einer Anfangsflut von 100 Verbindungen für IPv6-Verkehr.
SNAT und DNAT
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source [Neue-IP] iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination [Server-IP] ip6tables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination [Server-IPv6]:[Server-Port] ip6tables -A FORWARD -p tcp -d [Server-IPv6] --dport [Server-Port] -j ACCEPT
Konfiguriert Source NAT und Destination NAT für das Routing und die Adressübersetzung.
TOS-Feld/Markierungen setzen
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TOS --set-tos Minimize-Delay
ip6tables -t mangle -A PREROUTING -p tcp --dport 80 -j TOS --set-tos Minimize-Delay
Setzt das Type of Service (TOS)-Feld in IP-Paketen für den Port 80, um die Verzögerung zu minimieren.
Kommentare zu Regeln hinzufügen
iptables -A INPUT -p tcp --dport 22 -j ACCEPT -m comment --comment "SSH access"
ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT -m comment --comment "SSH access (IPv6)"
Fügt eine Regel hinzu, um SSH-Zugang zu erlauben, mit einem Kommentar zur Dokumentation.
Verwenden von Modulen für erweiterte Paketprüfung
iptables -A INPUT -p tcp --dport 80 -m string --string "badcontent" --algo bm -j DROP
ip6tables -A INPUT -p tcp --dport 80 -m string --string "badcontent" --algo bm -j DROP
Filtert Pakete, die spezifischen Text enthalten. (Beisiel: badcontent)
Ablehnen von Verkehr mit spezifischem Antwortcode
iptables -A INPUT -p tcp --dport 22 -j REJECT --reject-with icmp-host-prohibited
ip6tables -A INPUT -p tcp --dport 22 -j REJECT --reject-with icmp-host-prohibited
Ablehnung von Verkehr mit einem spezifischen ICMP-Antwortcode.
Erstellen komplexer Bedingungen mit mehreren Kriterien
iptables -A INPUT -p tcp --dport 80 -s 192.168.1.0/24 -m state --state NEW -j ACCEPT
ip6tables -A INPUT -p tcp --dport 80 -s 2001:db8::/64 -m state --state NEW -j ACCEPT
Kombiniert mehrere Bedingungen in einer Regel.
Verkehrsumleitung (Port Forwarding)
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.2:80
ip6tables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 2001:db8::2:80
Leitet eingehenden Verkehr auf Port 8080 einer anderen IP-Adresse und Port um.
Kombinieren von IPTables mit IPSet für effizientes Filtern
IPv4:
ipset create testset hash:ip ipset add testset 192.168.1.100 iptables -A INPUT -m set --match-set testset src -j DROP
IPv6:
ipset create testset6 hash:ip
ipset add testset6 2001:db8::1
ip6tables -A INPUT -m set --match-set testset6 src -j DROP
Verwendet IPSet für effizientes Filtern von IP-Adressgruppen.
Loggen von Paketen mit spezifischen Kriterien
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH attempt: "
ip6tables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH attempt: "
Loggt Pakete, die spezifische Kriterien erfüllen.
Verwenden der `owner`-Option
iptables -A OUTPUT -m owner --uid-owner 1000 -j REJECT
ip6tables -A OUTPUT -m owner --uid-owner 1000 -j REJECT
Regeln basierend auf dem Eigentümer des Prozesses, der die Verbindung initiiert.