alix auswahl bewegung buecher computernetz debian dvcs grep hardware iptables ipv6 kalender latex laufen linux lua lur monotone openwrt perl pxelinux rs232 script seriell software stehen sysadmin troubleshoot vcs

Komplexe iptables-Ketten visualisieren

Manche Dinge sind für mich schwer zu verstehen. Lange Listen zählen dazu oder Tabellen, in denen sich Aktionen verbergen. Ganz schlimm sind verschachtelte Listen. Wie, zum Beispiel, komplexe Paketfilterregeln.

Für mein neues Buch will ich mich mit der Konfiguration der Paketfilter-Firewall bei OpenWrt vertraut machen. Diese besteht allein für die Filtertabelle aus 30 (dreißig) nutzerdefinierten Regelketten, wenn man drei Zonen (lan, wan, dmz) für die Netzwerk-Interfaces anlegt.

Hier hilft mir eine Visualisierung, ein Bild, welches die ursprüngliche Tabelle erläutert und die wesentlichen Elemente enthält. Ein graphisches Modell sozusagen. Graph ist das richtige Stichwort, denn komplexe Netfiltertabellen lassen sich als gerichtete Graphen darstellen, mit den Ketten (chains) als Knoten und den Sprüngen in den Regeln als Kanten.

Und für Graphen gibt es mit GraphViz einen sehr schönen Visualisierungsbaukasten. Bleibt also nur noch, die iptables-Ketten und -Regeln als Eingabe für GraphViz, genauer gesagt für das Programm dot, aufzubereiten.

Die Ausgabe von iptables-save lässt sich mit ein paar Zeilen Perl recht gut in eine Graphenbeschreibung für dot umwandeln. Dabei sind die Ketten INPUT, OUTPUT, FORWARD, PREROUTING und POSTROUTING die Ausgangsknoten, bei denen die Reise durch den iptables-Dschungel losgeht. Die Regeln jeder Kette stehen als Label zum Nachlesen bei den entsprechenden Knoten. Sprünge zu anderen Ketten werden zum Knoten für die entsprechende Kette geführt. Sprünge zu endgültigen Targets, wie ACCEPT, DROP, REJECT werden nicht als Kante dargestellt, für diese Targets habe ich auch keine Konten vorgesehen, um den Graph etwas leichter zu gestalten.

Das Target RETURN habe ich als Sprungmarke dargestellt, weil ich einen visuellen Hinweis geben wollte, dass es anderswo weitergeht, aber aus einer Kette heraus nicht sagen kann, wohin RETURN zurückspringt. Zumindest ist so unmittelbar ersichtlich, dass an dieser Stelle die aktuelle Kette verlassen wird.

Für jede der Tabellen filter, mangle, nat und raw wird ein eigener Graph gezeichnet.

Das Script kann als Filter eingesetzt werden:

$ sudo iptables-save \
  | graph-iptables-save --table filter \
  | dot -Tpdf iptables-save-filter.pdf
$ sudo iptables-save \
  | graph-iptables-save --table filter \
  | dot -Tpng iptables-save-filter.png

Zusätzlich kann man mit der Option --edgelabel die Schnittstellen bei den Kanten angeben, wodurch das Bild des Graphen noch etwas größer, aber auch übersichtlicher wird.

Geschrieben habe ich das Script, weil ich mir ein Modell für die Konfiguration der Paketfilter-Firewall in OpenWrt bilden will. Später fand ich dann das Programm gressgraph, welches mir für meinen Zweck aber nicht geeignet scheint. Schließlich fand ich noch dieses Python-Programm aus dem Jahr 2007, welches nicht nur den gleichen Ansatz verfolgt (GraphViz), sondern auch eine sehr ähnliche Ausgabe erzeugt.

Vorher etwas Recherchieren im Internet hätte also ein paar Stunden gespart. Aber so schwierig war es nun auch nicht zu schreiben. Und außerdem habe ich etwas über GraphViz dazugelernt.

Übrigens. Aus dieser iptables-save-Ausgabe erzeugt mein Script für die Tabelle filter diesen Graph mit den oben erwähnten 30 Ketten.

Graph der iptables Tabelle 'filter' von OpenWrt

Alternativ als PDF-Datei und mit Kantenbezeichnern

Posted 2012-01-27 Tags:

Buch - Linux kopflos
Posted 2012-01-18

Read-Write/Read-Only mit LuCI
Posted 2012-01-13

Billig-USV mit Signalisierung für ALIX
Posted 2012-01-08

Kalender 2012
Posted 2011-12-31

Mit grep zum Kern der Sache kommen
Posted 2011-12-30

Die Jagd nach dem Schnatz
Posted 2011-12-23

Die Hardware-Uhr in ALIX-Rechnern
Posted 2011-12-16

Hochverfügbarkeit für Arme mit ALIX
Posted 2011-12-09

Betriebssystem auf die Reservepartition
Posted 2011-12-04