Anleitungen - Sonstiges | Linux IP-Tables Firewall

Die Linux IP-Tables Firewall ist eine der besten verfügbaren Firewalls. Am häufigsten wird sie heute als Personal Firewall zum Schutz von Linux-Rechnern eingesetzt. Sie eignet sich aber auch hervorragend als Abteilungs- oder Institutsfirewall, wenn Sie das Linux-System mit mehreren Ethernetkarten versehen.

Im folgenden beschreiben wir Schritt für Schritt die Grundfunktionen und die Konfiguration der Linux IP-Tables Firewall. Damit wird dem an sich komplizierten Thema die Schärfe genommen.

Bevor wir uns der Firewall widmen, empfehlen wir jedoch unbedingt die Lektüre der Comment-Artikel Hitchhiker's Guide to Security (Teil II) - Grundlegende Sicherheitsmaßnahmen für Linux-RechnerExterner Link und Firewalls: Schutz vor Gefahren aus dem InternetExterner Link. Grundsätzliche Fragen über Protokolle und Ports werden dort beantwortet.

Das Konzept

Betrachten wir zunächst das Grundkonzept der Behandlung von Internet-Paketen mit IP-Tables in Linux (siehe Grafik). Es gibt drei wichtige Filter-Ketten (Chains), über die Datenpakete des Internet weitergereicht oder verworfen werden - INPUT, OUTPUT sowie FORWARD. Die Namen legen die Eigenschaft der Ketten nahe: Die INPUT-Kette filtert eingehende Daten, OUTPUT filtert die vom System abgehenden Datenpakete, und die FORWARD-Kette dient als Filter, wenn Pakete einfach nur weitergeleitet werden. Diese brauchen wir nur, wenn das System als Internet-Router, Abteilungs- oder Institutsfirewall dient.

Grafik

Wie verlaufen nun die Datenwege? Pakete aus dem Internet werden von der Ethernetkarte über ein Prerouting-Modul (dies ist auch eine Kette) an die INPUT- sowie FORWARD-Kette weitergeleitet. Erlaubt die INPUT-Kette das Passieren des Pakets, dann wird es an den zuständigen Systemprozess, z.B. den Webserver, oder an den SSH-Dämon weitergeleitet. Dieser behandelt jetzt die einlangenden Daten und antwortet. Die daraus resultierenden Antworten gelangen zunächst in die OUTPUT-Kette. Diese prüft, ob die Pakete die Maschine in der gewünschten Richtung überhaupt verlassen dürfen. Ist das der Fall, werden sie dem Postrouting-Modul übergeben, das die Pakete nochmals einem Test unterziehen kann und sie anschließend an das gewünschte Netzwerkinterface weiterleitet.

Grundsätzlich haben die Daten in einer von außen initiierten Verbindung zwei mögliche Wege durch das Linux-System: Prerouting - INPUT-Kette - Systemprozess - OUTPUT-Kette - Postrouting oder Prerouting - FORWARD-Kette - Postrouting. In einer Personal Firewall-Konfiguration werden Sie das Weiterleiten über die FORWARD-Kette nicht benötigen; dann ist es am besten, diese Kette komplett zu sperren.

Ketten werden grundsätzlich von oben nach unten sequenziell abgearbeitet. Ist eine in einer Filterkette eingetragene Regel erfüllt (Regeltreffer), so erfolgt im Allgemeinen keine weitere Abarbeitung der nachfolgenden Regeln.

Die Tabellen

Die beschriebenen Ketten sind aber nur ein kleiner Teil der Möglichkeiten von IP-Tables. Alle Filterfunktionen werden in der sogenannten "filter"-Tabelle zusammengefasst, welche die Standardtabelle ist. Diese Tabelle besteht aus den Ketten INPUT, OUTPUT und FORWARD. Weitere wichtige Tabellen sind "mangle" und "nat".

Die "mangle"-Tabelle dient zum Umschreiben von Internet-Paketen. Sie wirkt auf die Ketten PREROUTING und OUTPUT. Die "nat"-Tabelle dient zur Native Address Translation, d.h. zur Übersetzung von Internetadressen in andere Internetadressen, und zwar so, dass der Anwender dies nicht merkt. Damit können private kleinere Netze hinter einem Linux-Rechner betrieben werden. Diese Tabelle wird benutzt, wenn ein Paket auftritt, das eine neue Verbindung initiiert. Die Tabelle "nat" besteht aus drei Ketten: PREROUTING, OUTPUT und POSTROUTING.

Regelwerke

Die aktuell in der IP-Tables Firewall geltenden Regeln und Regelketten können unter Linux mittels /sbin/iptables -L abgefragt werden. Dieses Kommando werden Sie häufig benötigen.

Wenn Sie für spezielle Aufgaben (zum Beispiel bei NFS) mehrere Filterregeln zusammenfassen wollen, dann empfiehlt sich das Anlegen einer eigenen Kette. Eine neue Kette können Sie mittels /sbin/iptables -N Kettenname erzeugen, wobei Kettenname der Name der Kette ist, den Sie vergeben.

Mittels des Befehls /sbin/iptables -A Kettenname NeueRegel hängen Sie eine weitere Regel (NeueRegel) unten an die Kette mit dem Namen Kettenname an. Entsprechend können Sie mittels /sbin/iptables -D Kettenname Regelnummer eine Regel gezielt aus einer Kette entfernen. Die Regelnummer wird von oben in der jeweiligen Kette gezählt.

Alle Regeln werden mittels /sbin/iptables -F  (F wie flush) entfernt. Alle Ketten bis auf die Standardketten werden mittels /sbin/iptables -X gelöscht.

Die Standardreaktion ist "Schweigen"

Jede Kette hat ein Standard-Verhalten, welches durch die Angabe einer Policy definiert ist. Die Regeln in der Kette definieren Ausnahmen zur gesetzten Standardpolitik. Eine Policy für eine Kette mit dem Namen Kettenname wird durch /sbin/iptables -P Kettenname Policy festgelegt. Policy kann die Werte ACCEPT, DROP oder REJECT annehmen. Einer Kette das Standardverhalten ACCEPT zu geben, ist im Allgemeinen nicht sehr weise. Es bedeutet uneingeschränkten Zugriff, von dem aus man erst die Einschränkungen (und zwar alle!) angeben muss. Die Policy ACCEPT auf der INPUT-Kette ist nur dann sinnvoll, wenn Sie auf Problemsuche sind und daher kurzfristig die Firewall deaktivieren.

Im Sinne des Prinzips der Minimalkonfiguration ist es sinnvoll, der INPUT- und der FORWARD-Kette die Standardpolitik DROP oder REJECT zuzuweisen. DROP bedeutet, dass das Internet-Paket einfach ignoriert wird, während REJECT es explizit mit einer Antwort vom System zurückweist.

Soll Ihr System durch Spione nicht leicht ausspioniert werden können, dann ist es empfehlenswert, auf eine ungültige Anfrage einfach nicht zu reagieren - also DROP.

Dienen die IP-Tables als Personal Firewall, so müssen Sie die FORWARD-Kette sperren. Wir empfehlen dazu den Befehl /sbin/iptables -P FORWARD DROP .

Im Übrigen können Sie, falls Sie sich einmal verkonfiguriert haben, mittels /sbin/iptables -Z die Standardpolitiken der drei Hauptketten wieder zurücksetzen.

Die "Spielregeln"

Beim Definieren von Regeln gibt es weitere wichtige Parameter. Der wichtigste ist -j für jump. Es handelt sich um eine Sprunganweisung, die im Fall eines Regeltreffers befolgt wird. Mögliche wichtige Sprungziele sind: ACCEPT zum Annehmen des Pakets, REJECT zum Zurückweisen des Pakets mit Reaktion, DROP zum stillen Verwerfen des Pakets, RETURN zum Zurückkehren zur vorherigen Kette oder LOG zum Protokollieren des Ereignisses. ACCEPT, REJECT und DROP sind endgültig. Das Paket wird durch die Firewall nachher nicht weiterbehandelt (kein Rücksprung). LOG bedeutet: Einen Protokolleintrag erzeugen und mit der nächsten Regel weitermachen.

Ein weiterer wichtiger Parameter ist -m  für match. Damit ist es möglich, unterschiedliche Bedingungen in Regeln zu fassen und mit logisch zusammenhängendem Datenverkehr umzugehen. Die Option -m state erlaubt Eingriffe in die Statefull Inspection der Firewall. Die Option -m limit gefolgt von --limit Trefferanzahl ermöglicht den Umgang mit Verkehrsmengen. Wird der vorgegebene Grenzwert überschritten, so wird die Regel außer Kraft gesetzt. Dies ist beispielsweise für den Umgang mit Protokolleinträgen sinnvoll, damit z.B. Ihre Festplatte von einem Hacker nicht ohne weiteres vollgeschrieben werden kann.

Sieben Schritte  zur Firewall

Eine einfache, aber sehr effektive Personal Firewall ist durch die nun folgenden Schritte realisierbar. Sie genügen nicht, falls Ihr Linux-Rechner als Firewall vor einer Abteilung eingesetzt werden soll, können aber als Grundkonzept und Startbeispiel angesehen werden. Voraussetzung für die nun folgenden Schritte ist die IP-Tables Firewall im offenen Grundzustand (keine Regeln, drei Ketten INPUT, FORWARD und OUTPUT mit der Standardpolitik ACCEPT).

  1. Sie erlauben zunächst das Einlangen von Paketen zu schon bestehenden Verbindungen:

    /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

  2. Sie erlauben das Öffnen neuer Verbindungen, die von Ihrem PC aus begonnen werden und auf Ihrem PC lokal enden:

    /sbin/iptables -A INPUT -i lo -j ACCEPT

    Der Parameter -i lo meint, dass die Pakete sich auf das Interface "lo" beziehen. Dieses Interface ist verantwortlich für Verbindungen auf Ihrem Rechner zu "localhost". Es ist für viele Prozesse zu empfehlen, den Linux-Rechner auf sich selbst zugreifen zu lassen.

    Nach diesen beiden Schritten ist Ihre Personal Firewall fast fertig. Wenn Sie vom Internet aus keine weiteren Verbindungen beginnen lassen wollen, dann benötigen Sie nur noch die Standardpolitik der Ketten unter Punkt 7.

  3. Wenn Sie Ihr System mittels Secure Shell (SSH) aus dem Netz erreichen können wollen, dann benötigen Sie den Befehl 

    /sbin/iptables -A INPUT -p tcp --dport 22 --sport 1024:65535 -j ACCEPT

    Dabei bedeutet -p tcp, dass die Regel auf das TCP-Protokoll ansprechen soll (es gibt dann auch noch UDP, das zum Beispiel für das Domain Name Service verwendet wird, oder das ICMP-Protokoll, wozu ping gehört). Die Option --dport bedeutet das Zielport (destination port) auf Ihrem Linux-Rechner. Bei ssh ist dies normalerweise 22 (eine Liste wichtiger Portnummern finden Sie im Kasten Übersicht über die wichtigsten Protokolle und Ports im Comment 02/2). Analog bedeutet --sport 1024:65535 das Quellport oder source port. Hier wird ein Bereich definiert, der sich von den Nummern 1024 bis 65535 inklusive erstreckt. Dieser Bereich ist auch der "unprivilegierte" Port-Bereich eines Systems am Internet.

  4. Wenn Sie ein Ping und alle anderen ICMP-Protokollverbindungen, die vom Netz der Universität Wien ausgehen, auf Ihr System zulassen wollen, dann können Sie das mit folgender Regel erreichen:

    /sbin/iptables -A INPUT -p icmp -s 131.130.0.0/16 -j ACCEPT

    Der Parameter -s IPAdresse oder -s IPAdresse/Netzwerkbitmaske erlaubt die Einschränkung auf bestimmte Quell(source)-Adressen für die Pakete. Übliche Netzwerkbitmasken sind /16 für die ganze Universität, /24 für ein Netzwerk mit Subnetzmaske 255.255.255.0 und /25 für 255.255.255.128.

  5. Wenn Ihr Rechner nicht nur lokal E-Mail verarbeitet, sondern an die Uni Wien oder die ganze Welt E-Mail schickt, dann sind folgende Regeln empfehlenswert:

    /sbin/iptables -A INPUT -p udp -s 131.130.0.0/16 --dport 113 -j REJECT --reject-with icmp-port-unreachable

    /sbin/iptables -A INPUT -p tcp -s 131.130.0.0/16 --dport 113 -j REJECT --reject-with tcp-reset

    Der Sinn dieser Befehle ist, Rückfragen des beim Versand einer E-Mail angesprochenen Servers sofort abzuweisen, da die Standardpolitik der INPUT-Kette aus Schritt 7 zu unnötigen Verzögerungen führen würde.

    Sofern Ihr Rechner auch E-Mail von außen empfängt, werden weitere Ports benötigt. Eine weitere Regel wäre beispielsweise für die Universität Wien:

    /sbin/iptables -A INPUT -p tcp -s 131.130.0.0/16 --dport 25 -j ACCEPT

  6. Nachdem Sie nun das Regelwerk der INPUT-Kette für Ihre Pakete definiert haben, empfehlen wir, alle nun noch erfolgenden Zugriffe zu verwerfen. Davor ist es jedoch sinnvoll, sich Informationen über diese "verbotenen" Zugriffe in einer Log-Datei zu sichern. Dies geschieht durch

    /sbin/iptables -A INPUT -m limit --limit 100/second -j LOG --log-prefix "iptables log: "

    Die Menge der Log-Einträge ist damit für den Fall einer Netzwerkattacke auf 100 Stück pro Sekunde limitiert, und jeder Log-Eintrag wird mit dem Text iptables log: begonnen.

  7. Zum Schluss definieren wir noch die Standardpolitik für die Ketten:

    /sbin/iptables -P INPUT DROP
    /sbin/iptables -P FORWARD DROP
    /sbin/iptables -P OUTPUT ACCEPT

Diese Anweisungen genügen für Ihren Linuxrechner zu Hause. Das dabei benötigte weitere Netzwerkinterface "ppp0" wird über diese Regeln richtig mitverwaltet. Wenn Sie in Ihrem System mehrere Ethernet-Netzwerkkarten betreiben, dann müssen Sie Regeln, die nur für ein bestimmtes Interface gelten sollen, mit -i interfacename einschränken. Diese Kommandos müssen nach jedem Neustart des Linux-Rechners ausgeführt werden. Es ist daher empfehlenswert, sie in einem Skript zum Starten der Firewallfunktion zusammenzufassen.

KontaktFeedback