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 |