Netfilter
Inhaltsverzeichnis
Netfilter ist eine KernelKomponente ähnlich wie der LinuxPacketScheduler. Beide dienen der Steuerung und Regelung des Netzwerkverkehrs indem einzelne Pakete aufgrund ihrer Merkmale und den eingestellten Regeln zufolge manipuliert werden. Mit Netfilter lässt sich z.B. Network Address Translation durchführen und auch die Filterung von Paketen zur Errichtung einer Firewall.
iptables Grundlagen
Das iptables-Regelwerk ist in Form von Ketten aufgebaut. Die enthaltenen Regeln werden der Reihe nach abgearbeitet, bis eine Regel sagt, dass Schluss sei, oder wenn die Kette zu Ende ist.
Im Kernel gibt es immer (mindestens) drei Ketten: INPUT, OUTPUT und FORWARD. Je nachdem wo ein Paket herkommt (lokal oder extern) und wo es hingeht (lokal oder extern) gelangt es in eine dieser drei Ketten.
Pakete von lokalen Prozessen -> OUTPUT -> Netzwerkschnittstelle
Pakete von Netzwerkschnittstelle ->
für diesen Rechner: INPUT -> zu lokalem Prozess
für anderen Rechner: FORWARD -> Netzwerkschnittstelle
Wenn im Kernel das Forwarding nicht aktiviert ist, oder wenn der Kernel nicht weiß, wie er ein Paket weiterleiten soll, dann wird das Paket ohne Abarbeitung der FORWARD-Kette weggeworfen.
_____ Eingehend / \ Ausgehend -->[Routing- ] ---> |FORWARD|-------> [entscheidung] \_____/ ^ | | v ____ ___ / \ / \ |OUTPUT| |INPUT| \____/ \___/ ^ | | ----> Lokaler Prozess ---
Eine Regel in einer Kette sagt Wenn ein Paket bestimmten Kriterien entspricht, mache dies oder jenes damit. Wenn die Kriterien einer Regel nicht auf das Paket zutreffen, wird die nächste Regel befragt. Wenn die Kette zu Ende ist, ohne dass eine Regel gepasst hat, dann entscheidet die Policy der Kette, was mit dem Paket geschehen soll. Wenn man keine Regeln definiert hat, ist die Policy ACCEPT, d.h. das Paket wird akzeptiert und wandert in obigem Diagramm weiter.
Um einen wirksamen Paketfilter aufzubauen, sollte man zuerst die Policy der Ketten auf DROP setzen. Dadurch können erstmal gar keine Pakete den Kernel passieren.
iptables -P <Kette> DROP
Danach schaltet man nach und nach die benötigten Dienste wieder frei.
iptables -A <Kette> <kriterien> -j ACCEPT
Kriterien können z.B. sein:
Ziel-/Quelladresse eine Pakets (-d <adresse>, -s <adresse>)
Ziel-/Quellport eines Pakets (--destination-port <port>, --source-port <port>)
MAC-Adresse der Netzwerkkarte (--mac-source <adresse>)
Status der Verbindung (--state <STATUS>)
Beispiel:
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
Pakete einer bereits bestehenden Verbindung hereinlassen
Regelwerk anzeigen lassen:
iptables -L -v [Kette]
Für weitere Filterkriterien und Möglichkeiten der Kettenbearbeitung sollte man die ManPage zu iptables konsultieren.
Beispiel einer einfachen Paketfilter-FireWall
(alle Verbindungsversuche von aussen abblocken) für einen einzelnen per Modem oder DSL an's Internet angeschlossenen Linuxrechner (wer ISDN benutzt, muss ppp+ durch ippp+ ersetzen):
# Alles, worauf keine Regel passt, verwerfen iptables -P input DROP # Pakete, die zu bereits bestehenden Verbindungen gehören (oder damit zusammenhängen) erlauben iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # neue Verbindungen nur dann erlauben, wenn sie NICHT über das externe Interface pppX reinkommen iptables -A INPUT -m state --state NEW -i ! ppp+ -j ACCEPT # unerwünschte (=alle noch nicht akzeptierten) Pakete in's Log schreiben iptables -A INPUT -m limit -j LOG --log-prefix "Bad packet:"
Achtung: Das LOG Ziel führt nicht dazu, dass die Abarbeitung der Kette beendet wird.
Bemerkungen
- es sind keine IP-Adressen im Spiel, sondern nur Interface-Namen
- daher reicht es, wenn diese Regeln beim Booten einmalig geladen werden, z.B. in einem Initscript
- die Regeln müssen nicht neu geladen werden, wenn die IP-Adresse sich ändert
- ppp+ bedeutet ppp0, ppp1, ppp2, ...
- wenn eine neue (new) Verbindung einmal für "gut" befunden und akzeptiert wurde (-j ACCEPT), werden alle weiteren zugehörigen Pakete (established,related) über eine einzige Regel abgehandelt und auch akzeptiert
neue Verbindungen, die von "innen" aufgebaut werden, sind akzeptabel (sonst könnte man nicht surfen ), allerdings dürfen keine Verbindungen von aussen aufgebaut werden (Cracker unerwünscht)
- dies ist ein sehr einfaches Beispiel, trotzdem bietet es einen guten Schutz
- wer allerdings für mehr als einen Rechner Internetzugriff realisieren will oder manche Dienste für Zugriff von aussen freischalten will, muss weitere Regeln definieren
die oben definierten Regeln setzen eine leere input-Regelkette voraus, das Skript kann also nicht mehrfach aufgerufen werden (sondern nur einmalig beim Booten). Wie man das besser lösen kann, sieht man in dem etwas ausführlicheren Beispiel unten.
Debian: Paketfilter automatisch laden
Zunächst einmal von Hand eingeben (oder Script schreiben und ausführen):
iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -m state --state NEW -i ! ppp+ -j ACCEPT iptables -A INPUT -m limit -j LOG --log-prefix "Bad packet:"
dann:
# /etc/init.d/iptables save active
Ausgabe:
Saving iptables ruleset: save "active" with counters.
Damit werden die Regeln nach /var/lib/iptables/active geschrieben.
und dann:
# dpkg-reconfigure iptables
Auf die Frage Enable the iptables init.d script? mit Yes antworten.
Daraufhin wird der Link /etc/rcS.d/S40iptables -> ../init.d/iptables angelegt.
Fertig. Nach dem nächsten Reboot sollte der Paketfilter automatisch geladen werden.
Löschen von Regeln
Möchte man eine Regel löschen, muss man zuerst feststellen, welche Nummer sie hat:
iptables -t nat --list --line-numbers
Nach -t wird die Tabelle erwartet, was nebst nat auch filter, mangle oder raw sein kann. Das ergibt eine ähnliche Ausgabe wie diese hier:
Chain PREROUTING (policy ACCEPT) num target prot opt source destination 1 DNAT tcp -- anywhere anywhere tcp dpt:smtp to:192.168.1.2 2 DNAT tcp -- anywhere anywhere tcp dpt:pop3 to:192.168.1.2 3 DNAT tcp -- anywhere anywhere tcp dpt:nntp to:192.168.1.2 4 DNAT tcp -- anywhere anywhere tcp dpt:www to:192.168.1.64 Chain POSTROUTING (policy ACCEPT) num target prot opt source destination 1 MASQUERADE all -- 192.168.1.0/24 anywhere 2 MASQUERADE all -- anywhere anywhere Chain OUTPUT (policy ACCEPT) num target prot opt source destination
Möchte man nun beispielsweise das Weiterleiten von Paketen zu 192.168.1.64:80 löschen, gibt man
iptables -t nat -D PREROUTING 4
ein.
Weitere Beispiele
/MasqueradeSshProxy - ein kommentiertes Paketfilter-Skript, das für Internet-Gateways von LANs geeignet ist.
- optional SSH-Zugriff von außen
- optional transparenter Squid-http-Proxy
- optional PC-Anywhere und VNC-Zugriff auf interne PCs
/MaskeFirewall ist ein SuSE-Skript, dass sich automatisch mit insserv als Initskript in das System integriert. Im Skript ist erklärt wie der Gateway und die PC-Klienten konfiguriert werden. Für Debian und RedHat ist die Konfiguration ebenfalls im Skript beschrieben. Es stellt schon vorkonfigurierte Ketten bereit, um Ports aus dem Internet erreichbar zu machen (z.B. für ftp, ssh, eDonkey, IRC, ...). Es müssen nur die entsprechenden Kommentarzeichen (#) entfernt werden.
Wer unter KDE ein graphisches Frontend sucht, sollte sich GuardDog ansehen.
Transparenter Proxy
Dies ist ein beliebter Trick, um HTTP-Verbindungen grundsätzlich über einen Proxy zu lenken. Am Einfachsten ist das mit squid, dazu braucht man folgende Einträge in der squid.conf:
httpd_accel_host [<ip des eigentlichen Servers>|virtual] httpd_accel_port [<port des eigentlichen Servers>|0] # wir wollen auch noch cachen httpd_accel_with_proxy on # wir wollen auf den Host: haeder schauen httpd_accel_uses_host_header on
Des weiteren muss man alle http-Verbindungen zum Proxy umlenken:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination <ip>:<proxy port>
- Transparenter Proxy ist schön, hat aber auch bedenkliche Seiten: Jedes unerwünschte Programm, das versucht, nach außen Verbindung aufzunehmen, kann dies über Port 80 einfach tun. Gewisse Betriebssysteme tun dies ja eifrig.
- Die Alternative ist automatische Proxykonfiguration. Das muß man zwar auf den einzelnen Stationen eintragen, aber dann haben es die Schüffelprogramme etwas schwerer. Das ganze ist Javaskript; man kann übrigens auch 'noproy for' und Ersatzproxy eintragen. Wer gehässig ist, baut auf Port 80 einen Dummy-Server ein. Das Skript selbst wird natürlich zentral verwaltet.
FTP/IRC & Connection Tracking
Damit Protokolle mit getrennter Daten- und Kontrollverbindung (ftp (aktiv und passiv), irc dcc) auch hinter einer Firewall richtig funktionieren, muss man das Connection Tracking aktivieren. Dies passiert, indem man die entsprechenden Kernel Module lädt: ip_conntrack, ip_conntrack_ftp für ftp und ip_conntrack_irc für irc (dcc).
Zusätzlich sollte man, wenn man NAT benutzt, noch die Module ip_nat_ftp für ftp und ip_nat_irc für irc laden.
Debian: Console sauber halten
Die Defaulteinstellungen von Debian führen zu oft unerwünschten Ausgaben auf der aktuellen Konsole - Lösung siehe Seite klogd.
weitere Infos
O'Reilly Firewall Buch - Ein 600(!) Seiten Buch das sich mit Firewalls unter Linux befasst, unter GDFL Lizenziert als LaTeX Code erhältlich.
Tools und Distributionen
sind auf der FireWall Seite.
Fragen & Antworten
Zugang zu BTX / T-Online Classic via Linux-Router mit PaketFilter (z.B. für Banking-Prg SFIRM32)
- Einwahl muss über T-Online und Hauptbenutzer ...#0001 stattfinden
- Der Classicgate-Dienste muss bei T-Online freigeschaltet werden, Standard ist deaktiviert!
- Zugriff auf classicgate.t-online.de:866 muss möglich sein.
- Wie geht Source NAT mit ip6tables?
- Welchen Sinn hat NAT mit IPv6?
- Zumindest Destination NAT macht wohl auf jeden Fall weiterhin Sinn. Source NAT dürfte an Bedeutung verlieren, aber wer weiss, ob die ISPs an jeden User beliebig viele IPs vergeben werden?
- Welchen Sinn hat NAT mit IPv6?