Packet Filters - iptables Bernhard Lamel Universität Wien, Fakultät für Mathematik 25. Mai 2007
Outline 1 2
Was kann ein Paketfilter (nicht)? Jedes Paket hat Header, die spezifisch für das jeweilige Protokoll sind (ip, tcp, udp, etc.) Ein Paketfilter liest Informationen aus diesen Headern aus und führt entsprechend konfigurierbaren Regeln Aktionen mit den Paketen aus. Also zum Beispiel: Mit Hilfe von einem Paketfilter kann ich alle Pakete, die von der ip-adresse 10.211.55.0 stammen und an Port 80 meines Rechners gerichtet sind, ablehnen. Aber ich kann nicht jedes an meinem Webserver gerichtetes Paket, dessen Inhalt spezifische Worte enthält (zb mp3, wmv, etc) ablehnen - diese Information steht nicht im Header.
Wozu brauche ich das eigentlich? Äussere Sicherheit (Paranoia) Nicht jedes an meinen Rechner gerichtetes Paket soll diesen erreichen. Es gibt eine Menge unnötiger/bösartiger Pakete da draussen! Innere Sicherheit (Kontrollsucht) Nicht jedes Paket, das von einem Rechner in meinem Netzwerk kommt, darf legitim nach draussen. Zum Beispiel: Ich verwende einen Linux-Rechner als Gateway zwischen dem Internet und meinem internen Netzwerk. Ich will nicht, daß Verbindungen vom Internet in mein Netzwerk zugelassen werden, aber Verbindungen von meinem Netzwerk ins Internet sollen erlaubt sein. Oder - ich will sichergehen, daß meine Kinder nicht an die problematischeren Bereiche im Internet herankommen.
Ich brauche einen Filter! Wo kriege ich ihn? Linux-Kernel Filtering-Framework: netfilter, siehe www.netfilter.org. Paketfilter realisiert durch iptables Gehört seit der 2.4er Kernelserie zum normalen Umfang des Linux-Kernels. iptables ist modular und erweiterbar. Andere Betriebssysteme bringen andere Paketfiltersysteme mit; und zum erstellen eines Paketfilters gibt es natürlich auch eine Menge (zum Teil graphischer) Tools. Wie üblich bleiben wir auf der Kommandozeile.
Was ist eine Regel? Eine Regel besteht aus einer Auswahl, auf welche Pakete sie zutrifft, und aus einem Ziel (target), dem die Pakete zugeführt werden. Regeln werden in Ketten (Chains) zusammengefasst, die nacheinander angewandt werden Vordefinierte Chains: INPUT, OUTPUT, FORWARD Targets: ACCEPT, DROP, LOG, uva Am besten: Regeln als Script schreiben, dann kann man sie wiederverwenden.
Regeln hinzufügen, löschen, etc iptables -A chain fügt Regel zu chain hinzu (am Schluss) iptables -D chain num löscht Regel Nummer num in chain iptables -I chain num fügt Regel an Stelle num ein iptables -F chain löscht alle Regeln in chain iptables -Z chain setzt Zähler zurück iptables -L chain listet die Regeln in chain iptables -P chain setzt die Policy für die chain
Example (Rusty s really quick guide to Packet Filtering) i p t a b l e s A INPUT m s t a t e s t a t e \ ESTABLISHED, RELATED j ACCEPT i p t a b l e s A INPUT m s t a t e s t a t e NEW j DROP i p t a b l e s A INPUT j DROP Dieser Code lässt keine Verbindungen von aussen nach innen zu; von innen nach aussen begonnene Verbindungen werden erlaubt.
IP-Adressen -s, -source Die Herkunfts-IP Adresse, in Form Adresse/Netzmaske -d, -destination Die Bestimmungsadresse (w.o.) Man kann auch Hostnamen angeben (die sollten aber nicht extern aufzulösen sein!) Example i p t a b l e s P INPUT DROP i p t a b l e s A INPUT s 10.211.55.0/24 j ACCEPT Verbietet alle Verbindungen, ausser aus dem lokalen Netz.
MAC-Adressen Natürlich nur für eingehende Pakete von Ethernet-Schnittstellen! Example i p t a b l e s A INPUT m mac mac source 00:51:F1 :DE:76 Example i p t a b l e s A INPUT s 10.211.55.7 m mac mac source
Connection Tracking -m state (es gibt auch eine Erweiterung, ctstate) erlaubt es, den Status zu überprüfen: ESTABLISHED: Paket gehört zu einer bestehenden Verbindung RELATED: Paket ist einer bestehenden Verbindung zugeordnet (zb ftp-daten) NEW: Ratet mal... INVALID: keines der obigen! Um ftp-verbindungen durchzulassen: insmod ip_conntrack_ftp!
TCP/UDP Wichtigstes Konzept: bestimmte Ports durchlassen. Example (Eingehende ssh-verbindungen erlauben) i p t a b l e s I INPUT p tcp dport 22 j ALLOW