Navigation
Firewall Grundlagen
Firewall Regeln
einfaches Firewallscript
Firewallscript mit FTP, HTTP, SSH, DNS
Neue Kette (Chain) erstellen
Logging
Firewall Kernelmodule für 2.4.x / 2.6.x
sonstiges
Links
IPTABLES HOWTO
WikiBooks IPTABLES
Iptables
LinuxUser Feines Sieb
Bannen mit iptables
IP-Adresse nach Herkunft filtern mit iptables
- In Tabellen werden Filterregeln zu Gruppen zusammengefasst.
Tabellen von iptables | |
---|---|
Tabelle | Beschreibung |
filter | Standardtabelle, alle "reinen" Filterregeln |
nat | Regel für Adressumsetzung (Network Address Translation) spezielle Weiterleitungen (Port Forwarding) |
mangle | Regel bei gewünschter Paketmanipulationen |
raw | Regel eingesetzt um Ausnahmen vom Connection Tracking zu definieren |
security | Regeln für Mandatory Access Control (MAC), wird unter anderem von SELinux implementiert |
- Jede Tabelle enthält verschiedene Chains. Chains enthalten die eigentlichen Firewall Regeln, sie legen fest, wann ein Paket geprüft wird.
Chains (Ketten) von iptables | ||
---|---|---|
Chain | für Tabelle | Beschreibung |
INPUT | filter, mangle, security | Pakete, für einen lokalen Prozess |
OUTPUT | filter, nat, mangle, raw, security | Pakete, von einem lokalen Prozess |
FORWARD | filter, mangle, security | Pakete, die nur weitergeleitet (geroutet) werden |
PREROUTING | nat, mangle, raw | Pakete, bevor diese geroutet werden |
POSTROUTING | nat, mangle | Pakete, nachdem diese geroutet würden |
Aktionen, die auf ein Paket angewendet werden | |
---|---|
Aktion | Beschreibung |
ACCEPT | Paket wird akzeptiert und angenommen |
DROP | Paket wird verworfen, der Sender erhält keine Nachricht |
REJECT | Paket wird verworfen, der Sender wird benachrichtigt, bei IPv6 mit einer ICMPv6 Nachricht |
QUEUE, NFQUEUE | Paket passiert den Userspace (falls vom Kernel unterstützt) |
RETURN | Durchlaufen dieser Kette wird beendet und mit der nächsten Regel der vorherigen (aufrufenden) Kette fortgefahren wird |
LOG | Paketdaten werden im System-Log festgehalten |
SNAT | (Source-NAT) ändert die Quelladresse des Paketes und wird nur in der POSTROUTING Kette verwendet. (nur nat Tabelle) |
MASQUERADE | Ersetzt die Quelladresse des Pakets, durch die IP-Adresse der Schnittstelle, auf dem es den aktuellen Host Rechner verlässt |
DNAT | (Destination-NAT) ändert die Zieladresse des Paketes und wird nur in der PREROUTING Kette verwendet. |
REDIRECT | ändert die Zieladresse oder ZielPort des Paketes |
TOS | Feld Traffic Class im IPv6 Header wird mit einem zu definierenden Wert überschrieben. Darf nur in der Tabelle mangle verwendet werden, da das Paket verändert wird. |
MASQUERADE ist das selbe wie SNAT aber für dynamisch vergebene IP (dialup) Verbindungen. (nur nat Tabelle)
--to-ports Port[-Port]
DNAT ändert die Zieladresse des Pakets und wird in den PREROUTING und OUTPUT, sowie benutzerdefinierten Ketten die nur von solchen aufgerufen wurden, verwendet. (nur nat Tabelle)
--to-destination ipaddr[-ipaddr][:Port-Port]
REDIRECT ändert den Ziel Port, um z.B. ein Paket über einen Proxy zu senden.
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-ports 3128
iptables - IPv4 Filterregeln erstellen/ändern/löschen.
ip6tables - IPv6 Filterregeln erstellen/ändern/löschen.
arptables - Filter von ARP Paketen
ebtables - Filter für Ethernet-Bridging Pakete
Die allgemeine Syntax der iptables oder ip6tables Befehle ist:
iptables Befehl Regelspezifikation Erweiterungen oder ip6tables Befehl Regelspezifikation Erweiterungen
Befehl | Beschreibung |
---|---|
Anzeigen | |
iptables -L -vn | Regeln der Standard Kette (Chain) filter anzeigen, -n Nummerische Ausgabe der IP-Adressen und Ports, -v ausführliche Ausgabe |
iptables -L -t nat | Regeln der Kette nat anzeigen |
iptables -L -t mangle | Regeln der Kette mangle anzeigen |
iptables -L -t raw | Regeln der Kette raw anzeigen |
iptables -L -t security | Regeln der Kette security anzeigen |
iptables -L -n --line-numbers | Nummern der Regel anzeigen |
Löschen | |
iptables -F | alle Regeln löschen (flush) |
iptables -D INPUT -s <IP-ADRESSE> -j DROP | Regel löschen, Angabe der definierten Regel |
iptables -D INPUT <LINE-NUMBER> | Regel löschen, Angabe der Zeilennummer der zu löschenden Regel |
Erstellen | |
iptables -A INPUT -s <IP-ADRESSE> -j DROP | Regel erstellen, an Kette anfügen |
iptables -I INPUT 1 -s <IP-ADRESSE> -j DROP | Regel einfügen/bearbeiten, Regel mit der Nummmer 1 ändern |
Bearbeiten | |
iptables -R INPUT -s <IP-ADRESSE> -j DROP | Regel ersetzen, überschreiben |
iptables -[Kommando] [KETTE] [-t Tabelle] [Parameter] [-Optionen] -j [Aktion]
Parameter | Beschreibung |
---|---|
-t Tabelle | verwendete Tabelle (FILTER, NAT, MANGLE, SECURITY) |
-p Protokoll | TCP, UDP, ICMP oder All |
-s Quelladresse[Maske] | |
--sport Port[:Port] | Quellport, falls -p TCP oder UDP ist |
-d Zieladresse[Maske] | |
--dport Port[:Port] | Zielport, falls -p TCP oder UDP ist |
-j Aktion | ACCEPT, DROP, REJECT, LOG, u.a. |
-i in-interface-name | für INPUT, FORWARD, PREROUTING |
-o out-interface-name | für FORWARD, OUTPUT, POSTROUTING |
-m state --state ESTABLISHED | auf bestehende Verbindungen aufsetzen |
Kommandos von iptables:
-A: fügt eine Regel am Ende einer Kette an.
-C: Check
-D: löscht eine Regel in einer Kette, entweder über deren Nummer oder Regel angeben
-I: fügt eine neue Regel in einer bestimmten Position in einer Kette ein
-R: ersetzt eine bestimmte Regel in einer Kette
-L: listet die Regeln einer Kette auf.
-S: Ausgabe der Regeln der ausgewählten Kette
-F: entfernt alle Regeln in einer Kette
-Z: löscht die Byte- und Paketzähler, die die Kette durchlaufen haben
-N: erstellt eine neue Kette
-X: entfernt einer selbst erstellten Kette
-P: ändert die Standardregel einer Kette (Policy)
-E: umbenennen einer selbst erstellten Kette
Zum Ändern einer Kette:
Schalter | |
---|---|
--sport | Source Port |
--dport | Destination Port |
--sport 1024: | ab Port 1024 und alle höheren |
--dport 1024:2800 | alle Ports von 1024 bis 2800 |
-s 192.168.1.0/24 | Netzwerk Range von 192.168.1.0 - 192.168.1.255 |
Schalter ICPM | |
---|---|
--icmp-type echo-request | Echo Anforderung |
--icmp-type echo-reply | Echo Antwort |
--icmp-type time-exceeded | Zeitübertschreitung |
--icmp-type parameter-problem | Parameterfehler im Datagramm |
--icmp-type network-unreachable | Netzwerk nicht erreichbar |
--icmp-type host-unreachable | Host nicht erreichbar |
--icmp-type protocol-unreachable | Protokoll nicht erreichbar |
--icmp-type port-unreachable | Port nicht erreichbar |
Portbezeichnungen kann man in /etc/services nachsehen
Protokollbezeichnungen stehen in der /etc/protocols
IP-Masquerading
- im LAN einen Rechner mittels NAT zum Router einrichten.
apt-get install ipmasq
# Forwarding aktivieren echo 1 >> /proc/sys/net/ipv4/ip_forward
# Masquerading aktivieren modprobe ipt_MASQUERADE iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/16 -j MASQUERADE
Die Regel besagt, daß alle Pakete, die zum Interface ppp0 gehen (-o ppp0) und aus dem lokalen Netzwerk kommen (-s 192.168.0.0/16) maskiert werden (-j MASQUERADE).
- Tabelle erstellen
iptables -N Chain1
- selbst erstellte Tabelle umbenennen
iptables -E Chain1 Chain2
- selbst erstellte Tabelle löschen
iptables -X Chain2
- ankommende Pakete auf dem Zielport 22, 80, 443 zulassen
iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT
definierte Firewall Regeln anzeigen
iptables -nL oder ip6tables -nL
iptables -L INPUT -v
iptables -D INPUT 1
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -p tcp -m state --state NEW -s 192.168.2.0/24 --dport 25 -j DROP iptables -I FORWARD -p tcp -m state --state NEW -s 192.168.2.0/24 -d smtp.t-online.de -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW --dport 22 -j DROP iptables -I INPUT -p tcp -m state --state NEW -s 1.2.3.4 --dport 22 -j ACCEPT
iptables -I INPUT -m state --state NEW -m recent --set iptables -I INPUT -m state --state NEW -m recent --update --seconds 60 --hitcount 11 -j DROP
#!/bin/sh # # es können neue Verbindungen (NEW), nach Aussen aufgebaut werden # bereits aufgebaute Verbindungen (ESTABLISHED) werden akzeptiert # IPTABLES=/sbin/iptables $IPTABLES -F $IPTABLES -P INPUT DROP $IPTABLES -P FORWARD DROP $IPTABLES -P OUTPUT DROP $IPTABLES -A OUTPUT -j ACCEPT -m state --state NEW,ESTABLISHED,RELATED $IPTABLES -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED $IPTABLES -A INPUT -j LOG --log-prefix "Firewall: "
#!/bin/sh # # lokale Paketfilter # FTP, SSH, DNS, HTTP # # # Variabeln setzen # IPTABLES=/sbin/iptables test -x $IPTABLES || exit 5 case "$1" in start) echo echo " Loading - Paketfilter Regeln" echo # notwendigen Module laden # module="iptable_filter iptable_mangle iptable_nat ip_tables ipt_LOG ip_conntrack ip_conntrack_ftp ipt_state" for i in $module; do modprobe $i done # Loesche alte Regeln und alte Tabellen # $IPTABLES -F $IPTABLES --delete-chain # Default Policy festlegen # $IPTABLES -t filter -P INPUT DROP $IPTABLES -t filter -P FORWARD DROP $IPTABLES -t filter -P OUTPUT DROP # Loopback Interface Zugriff # $IPTABLES -A INPUT -i lo -j ACCEPT $IPTABLES -A OUTPUT -o lo -j ACCEPT # ungewöhnliche Pakete verwerfen (nicht für Kernel 2.6) # # $IPTABLES -A FORWARD -m unclean -j DROP # $IPTABLES -A INPUT -m unclean -j DROP # Lokales Netzwerk # iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT iptables -A INPUT -s 192.168.2.0/24 -j ACCEPT iptables -A OUTPUT -s 192.168.0.0/24 -j ACCEPT iptables -A OUTPUT -s 192.168.1.0/24 -j ACCEPT iptables -A OUTPUT -s 192.168.2.0/24 -j ACCEPT # IP-Spoofing Pakete verwerfen # $IPTABLES -A INPUT -s 255.0.0.0/8 -j LOG --log-prefix "Gefaelschte Quell-IP!" $IPTABLES -A INPUT -s 255.0.0.0/8 -j DROP $IPTABLES -A INPUT -s 0.0.0.0/8 -j LOG --log-prefix "Gefaelschte Quell-IP!" $IPTABLES -A INPUT -s 0.0.0.0/8 -j DROP $IPTABLES -A INPUT -s 127.0.0.0/8 -j LOG --log-prefix "Gefaelschte Quell-IP!" $IPTABLES -A INPUT -s 127.0.0.0/8 -j DROP $IPTABLES -A INPUT -s 10.0.0.0/8 -j LOG --log-prefix "Gefaelschte Quell-IP!" $IPTABLES -A INPUT -s 10.0.0.0/8 -j DROP $IPTABLES -A INPUT -s 172.16.0.0/12 -j LOG --log-prefix "Gefaelschte Quell-IP!" $IPTABLES -A INPUT -s 172.16.0.0/12 -j DROP $IPTABLES -A INPUT -s 192.168.0.0/16 -j LOG --log-prefix "Gefaelschte Quell-IP!" $IPTABLES -A INPUT -s 192.168.0.0/16 -j DROP # wenn der Server mit der IP 192.168.2.100 ein Paket mit seiner IP als Quell-IP empfängt # ist das Paket meist gefälscht. $IPTABLES -A INPUT -s 192.168.2.100 -j LOG --log-prefix "Falscher Server!" $IPTABLES -A INPUT -s 192.168.2.100 -j DROP # alle TCP-Session müssen mit SYN beginnen # $IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "Stealth Scan versuch?" $IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP # # Hauptregeln für den Paketfilter: # # INBOUND Regeln # eingehende Pakete, die Teil von zuvor zugelassenen Sessions sind akzeptieren # $IPTABLES -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED # FTP Pakete $IPTABLES -A INPUT -p tcp -j ACCEPT --dport 21 -m state --state NEW # SSH Pakete $IPTABLES -A INPUT -p tcp -j ACCEPT --dport 22 -m state --state NEW # HTTP Pakete $IPTABLES -A INPUT -p tcp -j ACCEPT --dport 80 -m state --state NEW # Log was nicht akzeptiert wird $IPTABLES -A INPUT -j LOG --log-prefix "INPUT abgelehnt: " # OUTBOUND Regeln # ausgehende Pakete, die Teil von zuvor zugelassenen Sessions sind akzeptieren # $IPTABLES -I OUTPUT 1 -j ACCEPT -m state --state RELATED,ESTABLISHED # ausgehende PING Anfragen erlauben $IPTABLES -A OUTPUT -p icmp -j ACCEPT --icmp-type echo-request # $IPTABLES -A OUTPUT -p udp -j ACCEPT --dport 53 -m state --state NEW # Log was nicht akzeptiert wird $IPTABLES -A OUTPUT -j LOG --log-prefix "OUTPUT abgelehnt: " ;; open) echo echo "Achtung! alle Paketfilterregeln werden gelöscht und auf Durchgang gesetzt" echo $IPTABLES -F $IPTABLES -t filter -P INPUT ACCEPT $IPTABLES -t filter -P FORWARD ACCEPT $IPTABLES -t filter -P OUTPUT ACCEPT $IPTABLES -t nat -P PREROUTING ACCEPT $IPTABLES -t nat -P POSTROUTING ACCEPT $IPTABLES -t nat -P OUTPUT ACCEPT $IPTABLES -t mangle -P PREROUTING ACCEPT $IPTABLES -t mangle -P INPUT ACCEPT $IPTABLES -t mangle -P FORWARD ACCEPT $IPTABLES -t mangle -P OUTPUT ACCEPT $IPTABLES -t mangle -P POSTROUTING ACCEPT;; stop) echo echo "Achtung! alle Paketfilterregeln werden gelöscht" echo $IPTABLES -F ;; status) echo echo " IPTABLES Status anzeigen ..." echo $IPTABLES -L -v --line-numbers ;; *) echo echo " Benutze: $0 {start|stop|open|status}" echo exit 1 ;; esac
- SSH Zugriff beschränken, 5 Verbindungen in 5 Min
iptables -A INPUT -i $wan -p tcp --dport ssh \ -m state --state NEW -m recent --set --name SSH iptables -A INPUT -i $wan -p tcp --dport ssh \ -m state --state NEW -m recent \ --update --seconds 300 --hitcount 4 --rttl --name SSH -j DROP
- neue Filter-Kette erstellen
iptables -N new-filter
- neu erstellte Kette anzeigen
iptables -L -nv
- damit die neue Kette genutzt werden kann, muss man durch einen Sprug zu ihr wechseln. Hier wird ein Sprung n die "INPUT" Kette eingefügt zu neuen Kette "new-filter"
iptables -t filter -A INPUT -j new-filter
- Regeln in die neue Kette einfügen, mit dem "RETURN" Aufruf springt man wieder in die vorige Kette zurück (INPUT-Kette)
iptables -A new-filter -m mac --mac-source 11:22:33:aa:bb:cc -j ACCEPT iptables -A new-filter -j RETURN
- Sprung zur Kette "new-filter" aus INPUT entfernen
iptables -t filter -D INPUT -j new-filter
- die gesammte eigene Kette löschen (die Kette darf keine Regel mehr enthalten "iptables -F new-filter")
iptables -X new-filter
Es können beliebig viele selbst definierte Ketten erstellt werden und mann kann zwischen denn Ketten beliebig hin und her springen.
# /etc/rsyslog.conf ... # # Firewall Logs # kern.warn -/var/log/iptables.log ...
service rsyslog restart
- Logging aktivieren, der Zeile im Log wird Firewall:
vorangestellt und als Level 4 (Warn Meldung) gespeichert
iptables -A INPUT -j LOG --log-prefix "Firewall: " --log-level 4 ip6tables -A INPUT -j LOG --log-prefix "Firewall: " --log-level 4
- nur SMTP (Port 25) in Datei ausgeben
iptables -A INPUT -p tcp --dport 25 -j LOG --log-prefix "Firewall: " --log-level 4 ip6tables -A INPUT -p tcp --dport 25 -j LOG --log-prefix "Firewall: " --log-level 4
- LOG Regel einer IP sperre
iptables -A INPUT -s <IP-ADRESSE> -m limit --limit 5/min -j LOG --log-prefix "banned: " \ --log-level 7
Parameter | Beschreibung |
---|---|
-m limit --limit 5/min | max. 5 Einträge je Minute ins LOG File |
--log-level 7 | Loglevel 7 (DebugMode) Ausgabe in /var/log/debug |
Networking options --->
[*] Network packet filtering (replaces ipchains)
IP: Netfilter Configuration --->
Modul | Funktion | Kernelquelle |
ip_conntrack | Verbindungsverfolgung (connection tracking) | Connection tracking (required for masq/NAT) |
ip_contrack_ftp | dito für FTP | FTP protocol support |
ip_nat_ftp | NAT-Support für FTP | FTP protocol support |
ip_queue | packet queueing (Weiterreichen an Userspace) | Userspace queueing via NETLINK (EXPERIMENTAL) |
ipchains | ipchains Kompatibilität (Kernel 2.2) | ipchains (2.2-style) support |
ipfwadm | ipfwadm Kompatibilität (Kernel 2.2) | ipfwadm (2.0-style) support |
ipt_LOG | packet logging (Target LOG) | LOG target support |
ipt_MARK | packet marking, Filter auf MARK-Symbole von Paketen | netfilter MARK match support |
ipt_MASQUERADE | Masquerading | MASQUERADE target support |
ipt_MIRROR | packet mirroring (source ? destination) | MIRROR target support (EXPERIMENTAL) |
ipt_REDIRECT | transparentes Umleiten von Paketen | REDIRECT target support |
ipt_REJECT | Zurückweisen von Paketen | REJECT target support |
ipt_TOS | type of service setzen | TOS target support |
ipt_limit | Begrenzerfilter | limit match support |
ipt_mac | MAC-Filter | MAC address match support |
ipt_multiport | Filter für mehrere Ports auf einmal | Multiple port match support |
ipt_owner | Filter auf erzeugenden Nutzer (lokal) | Owner match support (EXPERIMENTAL) |
ipt_state | Filter für Verbindungsstatus | Connection state match support |
ipt_tos | Filter für type of service | TOS match support |
ipt_unclean | Filter für ,,komische`` Pakete | Unclean match support (EXPERIMENTAL) |
ipt_conntrack | Connection tracking match support | |
iptable_filter | implementiert Tabelle filter | Packet filtering |
iptable_mangle | implementiert Tabelle mangle | Packet mangling |
iptable_nat | implementiert Tabelle nat | Full NAT |