Firewall mit iptables
Allgemeines
Seit Kernel-Version 2.4 beinhaltet jeder Linux-Kernel ein Firewall-Konzept
namens
IPTables/Netfilter. Auch ältere
Linux-Kernel hatten schon eingebaute Firewalls (ipfwadm in v2.0, ipchains in v2.2),
IPTables ist jedoch die erste Version, die das sogenannte "Stateful inspection"
beherrscht.
Stateful inspection
Die Firewalls in alten Kernelversionen (<=2.2) arbeiteten als sogenannte Paketfilter: Einzelne Netzwerk-Pakete konnten nach bestimmten Kriterien aussortiert werden.
Mit Stateful inspection ist es ab Kernel-Version 2.4.x nicht mehr nur möglich einzelne Pakete zu filtern, sondern man kann jetzt ganze Ströme relativ einfach analysieren und/oder blocken.
Optionen von iptables
Nur die wichtigsten:
-i Interface (Paketeingang) -o Interface (Paketausgang) -p Protokoll [tcp,udp,icmp] -s Quell-Rechner/Netz -d Ziel-Rechner/Netz -j Reaktion, falls Paket den Filterregeln entspricht TCP/UDP: --sport Quell-Port --dport Ziel-Port
Mögliche Targets (-j):
DROP Paket wird kommentarlos verworfen REJECT Paket wird verworfen, Absender wird aber informiert LOG Paket wird protokolliert (aber nicht gelöscht) ACCEPT Paket darf passieren
Ausführlichere Dokumentation findet man auf der
netfilter Homepage.
Probleme
Probleme beim Aufbau einer Firewall bereiten vor allem ältere Protokolle, wie
- FTP
- Portmap/NFS/YP
- IRC
Während sich die Problematik mit FTP seit der Einführung von iptables gelegt hat, machen die Portmap-basierten Dienste wie NFS oder YP nach wie vor die Konfiguration einer sicheren Firewall problematisch.
FTP
Für die Probleme, die aus dem 2-Port Protokoll von FTP resultieren, schafft ein Kernel-Modul Abhilfe. Dieses observiert den Verbindungsaufbau einer FTP-Verbindung auf Protokoll-Ebene, und erkennt den Rückkanal automatisch.
/sbin/modprobe ip_conntrack_ftp
Konfigurationen für diverse Dienste
HTTP/HTTPS
/usr/sbin/iptables -A myfilter -m state --state NEW -i $DEV -p tcp --dport 80 -j ACCEPT /usr/sbin/iptables -A myfilter -m state --state NEW -i $DEV -p tcp --dport 443 -j ACCEPT
SSH
/usr/sbin/iptables -A myfilter -m state --state NEW -i $DEV -p tcp --dport 22 -j ACCEPT
Nur Sachen die wir kennen ...
Die folgenden Zeilen findet man oft in iptables-Skripten. Sie sorgen schlichtweg dafür, daß nach einem gelungenen Verbindungsaufbau auch alle folgenden, zu dieser Verbindung gehörigen Pakete die Fireall passieren dürfen.
/usr/sbin/iptables -A myfilter -m state --state NEW,INVALID -i $DEV -j DROP /usr/sbin/iptables -A myfilter -m state --state NEW -i ! $DEV -j ACCEPT /usr/sbin/iptables -A myfilter -m state --state ESTABLISHED,RELATED -j ACCEPT /usr/sbin/iptables -A myfilter -j DROP
Energie!
Bisher haben wir nur einen eigenen Filter definiert, der jedoch bislang nicht verwendet wird. Dafür sorgen erst diese Zeilen:
/usr/sbin/iptables -A FORWARD -j myfilter /usr/sbin/iptables -A INPUT -j myfilter
Darin wird festgelegt, daß alle Pakete, die INPUT oder FORWARD passieren, an unseren Filter weitergereicht werden.
Einfaches Beispiel für Dialin-Rechner
Die Einstellungen sind so gewählt, daß der Benutzer möglichst wenig von der Firewall bemerkt, und doch gleichzeitig einen möglichst großen Schutz genießt. Der Rechner ist mit dieser Konfiguration nur per SSH (Port 22) von außen zu erreichen.
/etc/ppp/ip-up.local:
#!/bin/sh # # evaluate command line options # DEV=$1 DEVDUMMY=$2 SPEED=$3 LOCALIP=$4 REMOTEIP=$5 IPPARAM=$6 # # default deny action: DROP # (alternative: REJECT) # DROP=DROP # # some nice modules # /sbin/modprobe ipt_tcpmss /sbin/modprobe ip_conntrack_ftp /sbin/modprobe ip_nat_ftp # # masquerading # /usr/sbin/iptables -t nat -A POSTROUTING -o $DEV -j MASQUERADE # # create new table that logs and drops # /usr/sbin/iptables -N droplog /usr/sbin/iptables -A droplog -j LOG /usr/sbin/iptables -A droplog -j $DROP # # create my own filter queue # /usr/sbin/iptables -N myfilter # # allow SSH from everywhere # /usr/sbin/iptables -A myfilter -m state --state NEW -i $DEV -p tcp --dport 22 -j ACCEPT # # REJECT ident requests - DROP causes long delays # /usr/sbin/iptables -A myfilter -m state --state NEW -i $DEV -p tcp --dport 113 -j REJECT # # by default: drop+log everything we don't want or know # /usr/sbin/iptables -A myfilter -m state --state NEW,INVALID -i $DEV -j droplog /usr/sbin/iptables -A myfilter -m state --state NEW -i ! $DEV -j ACCEPT /usr/sbin/iptables -A myfilter -m state --state ESTABLISHED,RELATED -j ACCEPT /usr/sbin/iptables -A myfilter -j droplog # # send all packages from INPUT and FORWARD # queue through my filter # /usr/sbin/iptables -A FORWARD -j myfilter /usr/sbin/iptables -A INPUT -j myfilter # # set name on dialin dyndns.org # #/sbin/ddup --host linuxadmin.dyndns.org &
/etc/ppp/ip-down.local:
#!/bin/sh /usr/sbin/iptables -F /usr/sbin/iptables -F PREROUTING -t nat /usr/sbin/iptables -X myfilter /usr/sbin/iptables -X droplog



