Iptables im Überblick

Aus LinuxUser 01/2007

Iptables im Überblick

Feuerfest

Steht dem PC das Tor zum Internet offen, sollte man einen Wächter engagieren, der unerwünschte Gäste draußen hält. Iptables ist solch ein qualifizierter Türsteher.

Den Begriff “Firewall” hat jeder schon einmal gehört. Meist assoziiert man damit ein kompliziertes Gerät für die Sicherheit von Netzwerken. Spätestens seit viele Initiativen [1] und einige Medien immer wieder von einer “Personal Firewall” für den heimischen PC sprechen, sucht man auch für den eigenen PC ein solches Firewall-Dings. Es soll das vielzitierte Böse im Internet vom PC fernhalten und sich zumindest von Voodoo deutlich unterscheiden.

Unter Linux fällt sofort das Augenmerk auf iptables. Das Programm liegt den meisten Distributionen bei und ist bei dem einen oder anderen sogar aktiv. Ein genauer Blick auf die Konfiguration der Iptables erzeugt bei den meisten Anwendern jedoch ein verzagtes Schulterzucken. Das muss nicht sein: Die Grundlagen der Paketfilterei sind nicht allzu schwer zu verstehen, und wer sie beherrscht, richtet im Handumdrehen eine Firewall nach eigenen Bedürfnissen ein.

Pakete und Protokolle

Daten werden im Internet in Form kleiner Pakete übertragen. Um die Pakete zustellen zu können, muss man den Empfänger identifizieren, die Daten der entsprechenden Anwendung zuordnen, und diese muss sie schließlich richtig interpretieren. Für jeden einzelnen dieser Schritte gibt es genau definierte Protokolle. Einen ausführlichen Einstieg in die Welt dieser Protokolle bietet ein älterer LinuxUser-Artikel [2]. Hier sei das Wesentliche zum besseren Verständnis noch einmal kurz zusammengefasst.

Zur Vermittlung der Datenpakete vom Computer des Absenders zu dem des Empfängers dient das Internet-Protokoll oder kurz IP. Die IP-Pakete enthalten die IP-Adressen des Absenders und des Empfängers sowie einen Eintrag auf das Protokoll, welches die Daten den jeweiligen Anwendungen zuordnet und als Transportprotokoll bezeichnet wird.

Zwei wichtige Protokolltypen stellen das Transmission Control Protocol (TCP) und das User Datagram Protocol (UDP) dar. Die einzelnen Anwendungen auf einem System werden über Ports adressiert. Jede Anwendung erhält einen Port, auf dem sie Daten versenden kann, und einen, auf dem sie nach Daten lauscht. Abbildung 1 zeigt einige solcher offener Ports auf einem PC. Die zugestellten Daten werden dann mit Hilfe eines weiteren Protokolls, wie etwa HTTP, von der Anwendung interpretiert.

Abbildung 1: Netstat zeigt die momentan offenen TCP- und UDP-Ports an.

Abbildung 1: Netstat zeigt die momentan offenen TCP- und UDP-Ports an.

Das Transportprotokolle UDP bezeichnet man als verbindungsloses Protokoll, da es die Pakete lediglich mit einer Zieladresse und einem Zielport, sie dann auf die Reise schickt und vergisst. Zwar kann man optional neben dem Quellport auch eine Checksumme angeben, zuverlässiger wird die Zustellung dadurch aber nicht. Da auf dem langen Weg um den Globus auch ab und an ein Paket verloren gehen kann, sorgen sich verbindungsorientierte Protokolle wie TCP um eine verlässlichere Zustellung.

TCP stellt eine direkte Verbindung zum Empfänger her und enthält wesentlich mehr Steuerinformationen, sodass es einzelne abhanden gekommene Pakete bemerkt und erneut versendet. Werden größere Dateien vor dem Versenden in eine ganze Reihe von Paketen verpackt, kann TCP sie in der richtigen Reihenfolge wieder zusammensetzen, auch wenn sie auf Grund unterschiedlicher Laufzeiten in der falschen Reihenfolge ankommen.

Das leistet UDP zwar nicht, ist dafür aber deutlich kompakter und erzeugt weniger “Verpackung” beim Paketversand. Ein komplettes IP-Paket mit UDP-Daten sehen Sie in Abbildung 2 schematisch dargestellt.

Abbildung 2: Schematische Darstellung eines UDP-Datenpakets.

Abbildung 2: Schematische Darstellung eines UDP-Datenpakets.

Nachdem das Paket über den Zielport die entsprechenden Anwendung erreicht hat, muss diese die Daten richtig interpretieren. Für jede Anwendung gibt es daher ein Protokoll, das die Daten korrekt darstellt. Beim bereits erwähnten HTTP handelt es sich um ein Anwendungsprotokoll für das Darstellen von Webseiten. Ein nicht weniger bekanntes Protokoll ist das File Transfer Protocol (FTP).

Sowohl HTTP als auch FTP setzen bei der Übertragung auf TCP auf. Das gewährleistet zum einen die für größere Datenmengen unverzichtbare Transportsicherheit. Zum anderen lässt sich auch gleichzeitig kontrollieren, wer die Verbindung initiieren darf. Zwar soll der Client die Verbindung zum Server im Internet aufnehmen dürfen, jedoch nicht umgekehrt jeder aus dem Internet ungefragt mit dem Client reden. Der Begriff, hinter dem sich die Zuordnung zu bereits etablierten Verbindungen verbirgt, lautet Stateful Inspection.

Iptables

Ein Paketfilter ist eine Software, die alle Netzwerkschnittstellen überwacht und die IP-Pakete nach vorher definierten Regeln überprüft. Anhand der IP-Adressen stellt der Filter fest, ob Absender und Empfänger überhaupt kommunizieren dürfen. Eine Schicht tiefer im IP-Paket wird anhand des Transportprotokolls und des Anwendungsprotokolls entschieden, ob die Kommunikation derfolgen darf.

Die meisten DSL-Router bringen einen solchen einfachen Paketfilter mit und bieten auf diese Weise eine rudimentäre Schutzfunktion. Das Paket Iptables ist etwas mehr als ein reiner Paketfilter. Es kann zusätzlich erkennen, ob Pakete zu einer schon etablierten TCP-Verbindung gehören (Stateful Inspection), Adressumsetzungen (NAT) zwischen Internet und privatem Netz vornehmen und vieles mehr.

Iptables ordnet je nach Richtung den Netzverkehr standardmäßig einer von drei Regelketten zu, den so genannten Chains. Ist ein Paket direkt an den Computer adressiert, arbeitet es die INPUT-Chain ab. Bevor der Rechner es versendet, muss es die OUTPUT-Chain durchlaufen. Und wenn es vom Computer nur weitergeleitet wird – ob vom inneren Netz zum äußeren oder umgekehrt – passiert es die FORWARD-Chain.

Abbildung 3 stellt die Standardketten von Iptables schematisch dar. Ein Paket wird in der jeweiligen Regelkette der Reihe nach mit den Filterregeln geprüft. Bei einer Übereinstimmung kommt die Regel zur Anwendung, die Bearbeitung endet damit. Falls keine Regel zutrifft, wird eine Standardregel angewandt, die so genannte Policy.

Abbildung 3: Die Standard-Chains von Iptables.

Abbildung 3: Die Standard-Chains von Iptables.

Zu jeder Standard-Chain gehört eine solche Policy. Da man nicht jeden möglichen Fall genau regeln kann, muss es eine Standardantwort für den Rest geben. Dabei kann man zwei Strategien verfolgen: Die eine erlaubt alles, was nicht explizit geregelt ist. Damit stellt man sicher, dass erst einmal alles funktioniert, Unerwünschtes muss man ausdrücklich verbieten. Die zweite Strategie gestattet nur den explizit erwünschten Datenverkehr und verbietet den Rest. Die zweite Variante bietet deutlich mehr Sicherheit, erfordert jedoch in der Regel mehr Konfigurationsaufwand.

Regeln erstellen

Um eine Firewallregel zu erstellen, ruft man Iptables mit den gewünschten Parametern auf. Die Regel bleibt dann so lange aktiv, bis man sie entweder explizit löscht oder den Computer herunterfährt. Da man nicht jedes Mal die Regeln erneut eingeben will, startet man beim Hochfahren des Computers das Regelwerk per Skript. Frontends für Iptables, wie etwa Firestarter oder KMyFirewall, erledigen das in der Regel automatisch.

Ein kleines Beispiel für den E-Mail-Dienst POP3 soll eine Regel erstellen, um vom meinem Computer aus E-Mails von pop.gmx.net abfragen zu können. Der entsprechende Aufruf von Iptables sieht so aus:

iptables -A OUTPUT -s 192.168.50.22 -d 213.165.64.22 -p tcp --sport 1024:65535 --dport 110 -j ACCEPT

Ubuntu-Nutzer müssen dem Aufruf noch ein sudo voranstellen, da Iptables Root-Rechte verlangt. Diese kleine Zeile bedeutet: Iptables fügt der Chain OUTPUT eine Regel an, die von der Quelladresse (-s 192.168.50.22) zur Zieladresse (-d 213.165.64.22) mit Hilfe des TCP-Protokolls (-p tcp) von einem beliebigen Quellport zwischen 1024 und 65535 (--sport 1024:65535) zum Zielport 110 (--dport 110) die Kommunikation erlaubt (-j ACCEPT).

Der Quellport lässt sich in der Regel nicht genauer angeben: Im Gegensatz zum festgelegten Zielport des Serverdiensts erhält der Client zum Zeitpunkt der Verbindungsanfrage einen beliebigen freien Port oberhalb 1023.

Statt der IP-Adressen kann man auch die Hostnamen von Quelle und Ziel angeben. Das setzt allerdings voraus, dass die Namensauflösung funktioniert und man den Antworten des DNS-Servers traut. Besser sollte man bei der Erstellung des Regelwerks die IP-Adresse einmal nachschlagen und eintragen. Falls man nur den Internetnamen des Zielservers kennt, findet man mittels nslookup die zugehörige IP-Adresse heraus:

user@pc:~$ nslookup pop.gmx.net
Server:         192.168.50.1
Address:        192.168.50.1#53
Non-authoritative answer:
Name:   pop.gmx.net
Address: 213.165.64.22

Da man die Ports der Anwendungen beim Erstellen von Firewallregeln kennen muss, gibt die Tabelle “Wichtige TCP- und UDP-Ports” die wichtigsten Server-Ports wieder. Im Zweifelsfall kann man auch bei Wikipedia [4] nachschlagen, eine detaillierte Liste der allgemein definierten Ports findet sich auch in der Datei /etc/services.

Eine Besonderheit stellt das File Transfer Protocol dar. Hier unterscheidet man aktives und passives FTP. Beim aktiven FTP teilt der Client über den Control-Kanal (Port 21) dem Server den eigenen Port mit. Der Server leitet dann die Daten von seinem Port 20 an diesen Clientport über den Data-Kanal. Die Firewall muss dabei berücksichtigen, dass hier der Server eine Verbindung zum Client aufbaut.

Einfacher gestaltet sich die Verwendung des verbreiteten passiven FTP, bei dem der Client selbst die Verbindung zu beiden Kanälen öffnet. Hier muss die Firewall lediglich beachten, dass Ports für den Data-Kanal zu beiden Seiten jenseits der 1023 liegen.

Wichtige TCP- und UDP-Ports

Port Erläuterung Protokoll
80 Browsen mit HTTP TCP
443 Browsen verschlüsselt mit HTTPS TCP
25 Mails versenden mit SMTP TCP
110 Mails abrufen mit POP3 TCP
995 Mails verschlüsselt mit POP3S abrufen TCP
53 Namensauflösung (DNS) TCP,UDP
20,21 Dateitransfer mit FTP und FTP-DATA TCP
123 Zeitdienst NTP TCP,UDP
22 Secure Shell SSH TCP
68 Dynamische IP-Adresszuordnung (DHCP) TCP,UDP

Eine kleine Regelübung

Listing 1 demonstriert ein Startskript für eine Iptables-Firewall auf einem typischen PC. Als Schnittstelle zum Internet kommt das Gerät eth0 zum Einsatz, da hier ein DSL-Router die Einwahl selbstständig vornimmt. Erfolgt die Verbindungsaufnahme ins Internet via Modem direkt durch den PC, heißt die entsprechende Schnittstelle meist ppp0.

Listing 1
#!/bin/bash
FW=/sbin/iptables
EXTIF="eth0"
# Alles Löschen
$FW -F
$FW -X
# Policy
$FW -P INPUT DROP
$FW -P OUTPUT DROP
$FW -P FORWARD DROP
# Chain INPUT
# Localhost darf alles - wichtig für X-Server, Drucker, etc.
$FW -A INPUT -i lo -j ACCEPT
# Alles was zu ausgehenden Verbindungen gehört, darf rein
$FW -A INPUT -i $EXTIF --match state --state RELATED,ESTABLISHED -j ACCEPT
# Alles andere loggen
$FW -A INPUT -i $EXTIF --match state --state NEW,INVALID -j LOG
# Chain OUTPUT
# Localhost darf alles - wichtig für X-Server, Drucker, etc.
$FW -A OUTPUT -o lo -j ACCEPT
# DNS-Auflösung
$FW -A OUTPUT -o $EXTIF -p tcp --sport 1024:65535 --dport 53 -j ACCEPT
$FW -A OUTPUT -o $EXTIF -p udp --sport 1024:65535 --dport 53 -j ACCEPT
# Browsen per HTTP
$FW -A OUTPUT -o $EXTIF -p tcp --sport 1024:65535 --dport 80 -j ACCEPT
# Sicher browsen mit HTTPS
$FW -A OUTPUT -o $EXTIF -p tcp --sport 1024:65535 --dport 443 -j ACCEPT
# Mails empfangen
$FW -A OUTPUT -o $EXTIF -p tcp --sport 1024:65535 --dport 110 -j ACCEPT
# Mails sicher empfangen
$FW -A OUTPUT -o $EXTIF -p tcp --sport 1024:65535 --dport 995 -j ACCEPT
# Mails versenden
$FW -A OUTPUT -o $EXTIF -p tcp --sport 1024:65535 --dport 25 -j ACCEPT
# Uhr mit Zeitserver stellen
$FW -A OUTPUT -o $EXTIF -p udp --sport 1024:65535 --dport 123 -j ACCEPT
# Alles andere loggen
$FW -A OUTPUT -o $EXTIF --match state --state NEW,INVALID -j LOG

Das Skript in Listing 1 löscht zunächst eventuell bestehende Firewallregeln (Zeilen 5 bis 7). Danach definiert es das Standardverhalten, falls keine definierte Regel angewendet werden kann. Für alle drei Chains gilt: Nach erfolglosen Durchlauf der Regelketten wird das Paket verworfen (Zeilen 8 bis 11).

Viele lokale Prozesse nutzen die Netzwerkschnittstelle für die Interprozesskommunikation. Daher erlauben sowohl die INPUT-Chain als auch die OUTPUT-Chain für die Schnittstelle lo die beliebige Kommunikation (Zeilen 15 und 23).

Im Beispiel handelt es sich um einen einfachen Client, der in der Regel Verbindungen zu Servern aufbaut und selbst keine Dienste zur Verfügung stellt. Als einzige Regel für eingehende Verbindungen gestattet die INPUT-Chain das Antworten auf Anfragen (Zeile 17). Versuche von Verbindungsaufnahmen von außen werden protokolliert (Zeile 18).

In der OUTPUT-Chain finden sich alle erlaubten Verbindungen nach außen: Namensauflösung (Zeilen 25 und 26), Browsen (Zeile 28 und 30), Versand und Empfang von E-Mails (Zeilen 31 bis 36) und der Zeitabgleich mit einem NTP-Server (Zeile 38). Sonstige Verbindungen werden protokolliert (Zeile 40).

Das Firewallskript fällt sehr einfach aus, wird mit steigenden Anforderungen aber schnell sehr umfangreich. Mehr Komfort und Übersicht bietet die Bedienung von Iptables über ein grafisches Frontend, das den speziellen Bedürfnissen des Anwenders entgegenkommt. Zwei Beispiele solcher Frontends stellen Ihnen die beiden folgenden Artikel vor.

Der Autor

Marcus Nasarek schätzt den Unterhaltungswert einer Linuxkonsole und beschäftigt sich schwerpunktmäßig mit Sicherheit in großen Organisationen.

Glossar

TCP

Transmission Control Protocol, IP-Protokoll für den verbindungsorientierten, zuverlässigen Transport von Daten.

UDP

User Datagram Protocol, einfaches und kompaktes IP-Protokoll für den verbindungslosen Datentransport.

HTTP

Hyper Text Transfer Protocol, Formatprotokoll zum Darstellen von Webseiten.

Stateful Inspection

Firewall-Technik, die eine etablierte Verbindung registriert und zugehörige Antworten zuordnen kann. So kann die Öffnung einer TCP-Verbindung in eine Richtung erlaubt werden, ohne dass die Gegenrichtung dauerhaft offen gehalten werden muss.

NAT

Network Address Translation. Eine Technik, die mehreren internen privaten IP-Adressen eine Internetadresse zuordnet. Das ist zum Beispiel der Fall, wenn nur eine Internetadresse zur Verfügung steht und sich mehrere Computer eines privaten Netzes einen Internetzugang teilen. Eine andere Bezeichnung für NAT ist oft auch Masquerading.

DNS

Domain Name System. Dienst zur Namensauflösung in TCP/IP-Netzen. Setzt Hostnamen in IP-Adressen um (Forward Lookup) und umgekehrt (Reverse Lookup).

Infos

[1] BSI-Informationen: http://www.bsi-fuer-buerger.de

[2] Linux im TCP/IP-Netzwerk: Achim Leitner, “Home sweet home”, LinuxUser 11/2005, S. 40, http://www.linux-user.de/ausgabe/2005/11/040-protokolle/

[3] Übersicht wichtiger Netzwerkports: http://de.wikipedia.org/wiki/Port_(Protokoll)

[4] Manpage zu Iptables: man 8 iptables

LinuxUser 01/2007 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben