Kapitel 12. HIP Firewall

In Ip6tables muss eine Regel definiert werden damit HIP und ESP Pakete im User-Space verarbeitet werden. Diese Regel muss allen anderen Firewallregeln vorausgeht damit HIP und ESP Pakete nicht verändert werden. Falls ESP Pakete nicht gefiltert werden können ESP betreffende Regeln (-p 50) weggelassen werden.

        ip6tables -A FORWARD -p 99 -j QUEUE
        ip6tables -A FORWARD -p 50 -j QUEUE
        ip6tables -A INPUT -p 99 -j QUEUE
        ip6tables -A INPUT -p 50 -j QUEUE
        ip6tables -A OUTPUT -p 99 -j QUEUE
        ip6tables -A OUTPUT -p 50 -j QUEUE
        

ip6_queue muss mit "modprobe ip6_queue" geladen werden

Die Firewall kann mit "./firewall <file_name>" "timeout value" im Firewall-Verzeichnis gestartet werden. file_name ist der Pfad zu der Datei mit den Firewall regeln und timeout value bestimmt die Zeit in Sekunden. Falls ein timeout von Null oder negativer Wert angegeben wird, so wird keine timeout Prüfung vorgenommen. Alle Regeln müssen in einer separaten Zeile stehen. Die aktuellen Firewallregeln geben Debug-Informationen über Regelanalyse und gefilterte Pakete aus.

Die Regeln folgen lose der Linux Iptables Syntax:

Grundformat von Regeln:

HOOK [match] TARGET

Hier ist HOOK einer der netfilter Haken: "INPUT", "OUTPUT", "FORWARD". TARGET ist entweder "ACCEPT" oder "DROP", je nachdem ob das Paket weiter geleitet oder verworfen wird. Match ist eine Kombination von Filteroptionen wie im folgenden beschrieben.

Filter Optionen:

-src_hit [!] <hit value> --hi <file name>

Vergleichen der Quell-HIT in Paketen. HI kann durch --hi Optionn und durch definition eines Pfades zur Public Key Datei als Argument. Damit können Sender Signaturen überprüft werden. Die Datei muss entweder "_rsa_" oder "_dsa_" enthalten abhängig davon ob der RSA- oder der DSA-Algorithmus verwendet wird.

-dst_hit [!] <hit>

Vergleichen der Ziel-HIT in Paketen.

-type [!] <hip packet type>

Vergleicht HIP Pakettyp. Der Typ ist einer der folgenden Typen: "I1", "R1", "I2", "R2", "CER", "UPDATE", "NOTIFY", "CLOSE", "CLOSE_ACK"

-i [!] <incoming interface>

Vergleichen auf hereinkommendes Interface. Das Argument enthält den Namen des Interfaces. Diese Regel kann nicht für OUTPUT-Regeln verwendet werden, denn die Pakete haben kein Incoming Interface.

-o [!] <outgoing interface>

Vergleichen auf ausgehendes Interface. Das Argument enthält den Namen des ausgehenden Interfaces. Diese Regel kann nicht für INPUT Regeln verwendet werden, denn diese Pakete haben kein ausgehendes Interface.

-state [!] <state> --verify_responder --accept_mobile

Vergleichen auf Status der HIP Verbindung: "NEW" oder "ESTABLISHED". ESP Pakete werden auch gefiltert als Teil der Verbindung. Mit der "--verify_responder" Option speichert die Firewall die Responder HI des R1 Paketes und nutzt es zur Überprüfung der Paketsignaturen. Mit der "--accept_mobile" Option aktualiseirt die Firwall den Status der Verbindung wenn ein mobiler Host das durch die Firewall geschützte Netzwerk betritt. In der Praxis bedeutet dies, dass das vorherige Interface runtergefahren und im neuen Netzwerk reaktiviert werden muss.

Management der Interfaces:

Das Firewall-Management-Interface enthält Funktionen um die Regel der laufenden Firewall zu verändern. Die Funktionen sind in firewall/rule_management.h definiert und in firewall/rule_management.c implementiert. Die Datei Rule_management.c enthält auch Funktionen zum kopieren, vergleichen, löschen von Regeln usw. Falls eine Funktion aussehalb des rule_managment benötigt wird, kann diese in den Header Dateien definiert werden.

Das Argument "hook" ist der Haken zu Netfilter für dessen Regel er gedacht ist. Der Haken ist definiert in linux/netfilter_ipv6.h als NF_IP6_LOCAL_IN, NF_IP6_FORWARD, NF_IP6_LOCAL_OUT.

Die Struktur des Arguments rule ist unter rule_management.h beschrieben. Die Struktur enthält Zeiger zu den Optionen. Wenn eine Option nicht definiert ist muss der Wert NULL sein. Die Strukturen der Optionen sind ebenfalls in rule_management.h definiert. Die Funktion rule * parse_rule(char * string) kann zur erzeugen einer rule Struktur aus einem String genutzt werden. Der String wird auf die Korrektheit gegenüber der rule Syntax geprüft.

void insert_rule(const struct rule * rule, int hook):

Einfügen des Arguments rule an die hook Funktion. Insert erzeugt eine lokale Kopie des Argumentes rule.

int delete_rule(const struct rule * rule, int hook):

Löscht die lokale Regel die dem Argument rule entspricht.

GList * list_rules(int hook):

Erzeugt eine Kopie der Regelliste und gibt diese zurück. Die Aufrufende Funktion muss die Freigabe des Speichers regeln.

int flush(int hook):

Löscht alle Regeln.