weidner/archives/2012/02/

Ein Modell für Iptables bei OpenWrt

Graphische Oberflächen haben manchmal Vorteile, vor allem, wenn man den Umgang mit einem Programm erst erlernen muss, und sich noch nicht so gut damit auskennt. Je nach Ausführung können sie auch fast so effizient wie die Kommandozeile oder Konfiguration via Textdateien sein. Allerdings verhindern sie oft ein tieferes Verstehen des Programms, wenn sie das zugrunde liegende Modell nicht adäquat abbilden.

Wenn man keine geeigneten Informationen über das Programm findet, muss man sich eben selbst auf den Weg machen und sich ein Modell des Programms erarbeiten und den Zusammenhang zwischen graphischer Oberfläche des Programms und Modell herstellen.

Genau das habe ich für die Konfiguration der Paketfilter-Firewall von OpenWrt mit der Weboberfläche LuCI getan und hier berichte ich, was ich dabei herausgefunden habe. Objekt der Untersuchung war OpenWrt Backfire 10.3.1 mit LuCI 0.10. Bei anderen Versionen werden die Ergebnisse vielleicht nicht mehr ganz stimmen, aber die Vorgehensweise kann vermutlich beibehalten werden.

Herangehen

Als erstes habe ich versucht, mir die Struktur der Paketfilterregeln vertraut zu machen. Dazu habe ich mir mit einem Script, welches ich in einem älteren Artikel bereits vorgestellt hatte, sowie dem Programm dot aus dem GraphViz Paket eine Visualisierung der Regelketten erstellt.

Zur Erinnerung noch einmal die Visualisierung der Paketfilterregeln der Tabelle filter aus diesem Artikel:

Graph der iptables Tabelle 'filter' von OpenWrt

Bei dieser Visualisierung habe ich die Regeln als Liste bei den Konten für die jeweilige Kette angezeigt, wodurch der genaue Entscheidungsablauf verfolgt werden kann. Es sind keine wichtigen Informationen aus der zugrunde liegenden Ausgabe von iptables-save verloren gegangen. Dementsprechend ist das Bild recht komplex und wohl am übersichtlichsten ausgedruckt auf großem Papier. Wegen der Komplexität und vor allem auch, weil zwar einerseits alle Regelketten für alle Zonen aufgeführt sind, andererseits nicht alle möglichen Verbindungen zwischen Regelketten aufgeführt sind, eignet sich diese Darstellung zwar als Visualisierung und Verständnishilfe für eine konkrete Firewallkonfiguration, nicht jedoch als allgemeines Modell. Immerhin ist es ein Anfang, von dem aus man weitergehen kann.

Anschließend habe ich die verschiedenen Einstellungen im Webinterface durchprobiert und die Änderungen in der Ausgabe von iptables-save dabei beobachtet. Dazu hatte ich OpenWrt mit ext2fs installiert und dieses read-only eingehängt, so dass die Änderungen zwar ausgeführt und mit iptables-save sichtbar wurden, anschließend aber einfach im Webinterface zurückgenommen werden konnten. Über eine SSH-Sitzung war ich gleichzeitig an dem Gerät angemeldet und hatte mir gleich am Anfang eine Referenzausgabe angelegt:

# mkdir /tmp/iptables
# iptables-save > /tmp/iptables/first

Nun konnte ich jede einzelne Änderung sehr leicht mit zwei Befehlen verfolgen:

# iptables-save > /tmp/iptables/second
# diff -u /tmp/iptables/*

Das Modell

Damit konnte ich den Einfluss der einzelnen Einstellungen in LuCI auf die Regeln sehr differenziert beobachten und mit dem gewonnenen Wissen bin ich zu folgendem Modell für die Tabelle filter gekommen:

Modell der iptables Tabelle 'filter' von OpenWrt

In diesem Bild steht das Teilwort bereich in den Namen der Regelketten für eine in LuCI definierte Zone. Das heißt, wenn ich in der Firewall die Zonen lan und wan definiert habe, gibt es die Regelketten zone_lan, zone_wan, zone_lan_ACCEPT, zone_wan_ACCEPT, zone_lan_DROP, zone_wan_DROP und so weiter.

Kanten mit durchgehenden Linien im Modell stehen für feste Sprungziele. Kanten mit gestrichelten Linien stehen für Sprungziele, die je nach den Einstellungen im Webinterface auftreten können oder nicht.

Ein Sprung aus einer Zonenkette in eine andere, kann, je nach Einstellung in LuCI zwischen verschiedenen Ketten erfolgen. So gibt es zum Beispiel einen Sprung aus der Regelkette zone_lan_forward in die Kette zone_wan_ACCEPT, wenn im Webinterface Datenverkehr aus der Zone lan in die Zone wan zugelassen ist.

Der Sprung aus der Kette INPUT zur Kette syn_flood ist abhängig davon, ob in den allgemeinen Einstellungen Enable SYN-flood protection markiert wurde oder nicht.

Schließlich muss zu diesem vereinfachten Modell noch angemerkt werden, dass hier aus der Darstellung nicht auf die Reihenfolge der Sprünge zwischen den Zonen geschlossen werden kann. Das bleibt der detaillierten Visualisierung vorbehalten.

Das Modell für die Tabelle nat ist etwas einfacher:

Modell der iptables Tabelle 'nat' von OpenWrt

Der Sprung aus der Kette zone_bereich_nat zu MASQUERADE wird durch Markieren von Masquerading in den Zoneneinstellungen aktiviert.

Die Ketten nat_reflection_in und nat_reflection_out werden bei Weiterleitungen (Redirection) von externen Adressen/Ports auf interne Rechner verwendet, damit dieselbe Kombination von Adresse/Port extern wie intern funktioniert. Näheres dazu in der detaillierten Beschreibung der Konfiguration in einem Folgeartikel.

Noch einfacher sind die Modelle für raw

Modell der iptables Tabelle 'raw' von OpenWrt

und mangle.

Modell der iptables Tabelle 'mangle' von OpenWrt

Der Sprung von FORWARD zu zone_bereich_MSSFIX ist abhängig davon, ob für die betreffende Zone MSS clamping in den Zoneneinstellungen markiert wurde, oder nicht.

Konfiguration mit LuCI

Wie die Konfiguration der Iptables-Firewall bei OpenWrt mit LuCI mit diesem Modell zusammenpasst, bleibt einem späteren Artikel vorbehalten.

Updates

20150123: Buch zu Paketfilter bei OpenWrt

Ich plane im Moment die Informationen zum Paketfilter von OpenWrt in einem Buch zusammen zu fassen. Dieses soll zunächst bei Leanpub herauskommen. Dafür benötige ich Feedback, ob daran interesse besteht.

20170314: Das Buch ist veröffentlicht.

Die Ebook-Versionen gibt es unter anderem bei Leanpub, das Paperback bei CreateSpace.

Posted 2012-02-02
Tags: