staging.inyokaproject.org

IPTadmin

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.

Hier wird ein Skript für die Shell Bash vorgestellt, welches den Systemverwalter bei der Verwaltung des Paketfilters auf einem Linux-Rechner unterstützen soll. Das Skript hilft selbst zwar nicht bei der Erstellung des Regelsatzes, ermöglicht aber dessen dauerhafte Speicherung in Dateien und die Wiederherstellung aus diesen Dateien z.B. nach Neustart des Systems sowie Start, Stopp, Test und Überwachung des Paketfilters.

Die einfache Wiederherstellung des Regelsatzes ist auch Voraussetzung für den automatischen Start des Paketfilters beim Hochlauf des Systems.

Funktionsumfang

  • Netfilter-Regeln[1] im iptables-Format sichern, löschen, und laden für die Protokolle IPv4 und IPv6.

  • Aktive Regeln im laufenden Betrieb anzeigen, umschaltbar für IPv4 und IPv6.

  • Optional: Zusätzlich auch IP-Adressmengen (wie durch die Erweiterung IP sets für iptables implementiert) sichern, löschen und laden.

Installation

Das Programm besteht nur aus einer einzigen Textdatei. Diese muss auf den eigenen Rechner geladen werden, an einer geeigneten Stelle im Dateisystem (d.h. in einem Order des durch die Umgebungsvariable PATH angegebenen Pfads) abgelegt werden (z.B. /usr/local/sbin/) und dort ausführbar gemacht werden. Benutzer und Gruppe setzt man auf root. Das Ergebnis soll dann beispielsweise so aussehen:

ls -Al /usr/local/sbin/IPTadmin 
-rwxr-xr-x 1 root root 2673 Mär 17 06:38 /usr/local/sbin/IPTadmin

Das Skript kann unter dem folgenden Link herunter geladen werden: IPTadmin

Auf der Seite des Anhangs werden einige programmiertechnische Details erläutert: Erläuterungen zum Programmcode

Zur Deinstallation löscht man einfach die Programmdatei und ggf. die vom Programm angelegten Dateien.

Das Skript benötigt kein gesetztes SUID-Bit[3]; es wird entweder als Benutzer root gestartet (z.B. durch das Init-System) oder verschafft sich selber die benötigten Root-Rechte[3] über des sudo-Mechanismus[4][5]. Dazu muss freilich der aufrufende Benutzer berechtigt sein.

Wer IP-Adressmengen benutzen möchte, muss die benötigte Unterstützung installieren:

  • ipset (Verwaltungswerkzeug für Kernel-IP-Sets (Option))

Befehl zum Installieren der Pakete:

sudo apt-get install ipset 

Oder mit apturl installieren, Link: apt://ipset

Wer das Skript zum automatischen Laden der Netfilter-Regeln beim Start des Systems verwenden möchte, benötigt zusätzlich noch eine aktivierte Systemd-Unit oder einen anderen Startmechanismus. ☞Automatischer Start des Paketfilters

Bedienung

Nachdem man das Skript in einem in PATH aufgeführten Verzeichnis abgespeichert und die Rechte gesetzt hat, startet man das Skript im Terminal[2][4] einfach mit Aufruf über seinen Namen und einen oder zwei Parameter:

IPTadmin KOMMANDO 

oder

IPTadmin PROTOKOLL KOMMANDO 

Für den Parameter KOMMANDO möglich sind load, zero, halt, null, save, copy, read, info und status:

  • Die Kommandos außer status können auf ihren ersten Buchstaben abgekürzt werden. Jeder andere Wert erzeugt eine Fehlermeldung; ein fehlender Wert bewirkt aber die einmalige Anzeige der momentan im Kernel definierten Netfilter-Regeln mit Zählern.

  • load bewirkt das Löschen aller bereits vorhandenen Regeln im Kernel, das Laden der in Dateien (siehe Funktionsweise) gespeicherten Regeln und den automatischen Start des Paketfilters. Zusätzlich zu den Regeln werden zuvor auch Mengen von IP-Adressen (IP sets) wieder aus den Dateien restauriert. Dieses Kommando bricht mit einem Fehler ab, wenn es eine benötigte Datei nicht findet.

  • zero setzt die Zähler zurück auf 0.

  • halt löscht alle Regeln und beendet damit das Paketfilter, löscht aber nicht die IP-Adressmengen.

  • null führt halt aus und löscht auch die IP-Adressmengen.

  • save schreibt alle Regeln und IP-Adressmengen in Dateien, beendet aber nicht das laufende Paketfilter.

  • copy kopiert die Dateien in ein Unterverzeichnis mit dem aktuellen Datum und einem Suffix (zur Unterscheidung, falls man an einem Tag mehrere Kopien erzeugt) als Namen. Die Unterverzeichnisse dürfen mit dem Befehl mv im Terminal umbenannt werden ohne Beeinträchtigung für IPTadmin.

  • read löscht die Dateien im Arbeitsverzeichnis des Programms und kopiert Dateien aus einem auswählbaren Unterverzeichnis.

  • info ist ein Synonym für status.

  • status zeigt wiederkehrend alle paar Sekunden für ein IP-Protokoll die definierten Regeln mit Zählern an. Dafür das Fenster so weit aufziehen, dass die gesamte Ausgabe angezeigt wird. Die Wiederholrate ist einstellbar und zwischen den Protokollen IPv4/IPv6 kann die Ansicht umgeschaltet werden:

    • Taste 4 bzw. 6 wählt das Protokoll.

    • Taste 5 zeigt die IP-Adressmengen und wartet auf einen Tastendruck.

    • Die Tasten Z , H und N starten jeweilig das oben beschriebene Kommando. (Aber nur, wenn Kleinbuchstaben eingegeben werden!) Beachte: Es werden nur die Regeln für das angezeigte IP-Protokoll bearbeitet.

    • Als Großbuchstabe bearbeiten die Tasten + Z , + H und + N die Regeln beider IP-Protokolle; das gilt dann auch für die Tasten + L und + S zum Laden/Speichern der Regeln für beide IP-Protokolle und für die IP-Adressmengen.

    • Taste 2 bzw. 8 verkleinert/vergrößert die Periode im Bereich 1-30 um jeweils 1 Sekunde.

    • Taste 0 beendet den interaktiven Modus ohne Speicherung; die Regeln bleiben im Arbeitsspeicher aktiv.

Der optionale Parameter PROTOKOLL beschränkt die Wirkung der folgenden Befehle auf die angegebene Version des IP-Protokolls. Möglich sind die Werte 4 und 6 zur alleinigen Auswahl des damit angegebenen Protokolls, sowie 46 und 64, die beide IP-Protokolle auswählen. Per Voreinstellung sind bei fehlendem Wert beide Protokolle ausgewählt.

Man kann auch weitere Parameter angegeben; diese werden dann iterativ wie die beiden ersten interpretiert und abgearbeitet.

Ein beispielhafter Arbeitsablauf:

  1. Paketfilter in einen definierten Grundzustand bringen:

    IPTadmin null 
  2. Optional: IP-Adressmengen definieren. Dokumentation

  3. Netfilter-Regeln manuell oder mit einem anderen Werkzeug erstellen. Diese können die zuvor definierten IP-Adressmengen benutzen. Dokumentation

  4. Definiertes Paketfilter sichern:

    IPTadmin save 
  5. Paketfilter testen, dabei kann dessen Arbeit im laufenden Betrieb überwacht werden:

    IPTadmin status 
  6. Versuchsweise vorgenommene Veränderungen können einfach wieder auf den gesicherten Ausgangszustand zurück gesetzt werden:

    IPTadmin load 
  7. Wenn man noch weiter verbessern möchte, springe zu 5 oder 4 oder 3 oder 2.

Beispielhafte Ausgabe des Programms im interaktiven Modus IPTadmin status, hier für einen Firewall eines Border-Routers zwischen internem Bereich und DMZ/Internet an der Schnittstelle extern:

Alle 3 Sekunden: = Regeln für IPv4 =
= mangle-4 =
Chain PREROUTING (policy ACCEPT 43940 packets, 52M bytes)
 pkts bytes target     prot opt in     out     source               destination         
43691   52M RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
  251 19886 RETURN     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
  155 24489            all  --  *      *       0.0.0.0/0            0.0.0.0/0           
   25  6590 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match src-type LOCAL limit-in
  120 15509 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set Localnet src
   10  2390 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set Martians src
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            ! match-set Localnet dst
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type BROADCAST
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set Auth-ext src ADDRTYPE match dst-type LOCAL limit-in
    0     0 SET        udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:7 ! match-set Localnet src add-set Auth-ext src
    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 4
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           
Chain POSTROUTING (policy ACCEPT 23255 packets, 1578K bytes)
 pkts bytes target     prot opt in     out     source               destination         
22642 1510K RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
  251 19886 RETURN     all  --  *      lo      0.0.0.0/0            0.0.0.0/0           
    3   120 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            ! state NEW
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            ! match-set Localnet src
  198 23605 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set Localnet dst
   18  5354 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type !UNICAST
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set Martians dst
  164 24431 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           
= nat-4 =
Chain POSTROUTING (policy ACCEPT 315 packets, 24714 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  152 23711 MASQUERADE  all  --  *      !lo     0.0.0.0/0            0.0.0.0/0            ! match-set Localnet dst

46zhnls5, 8=seltener, 2=öfter, 0=beenden 0

Funktionsweise

Das Skript liest und schreibt Dateien im Verzeichnis /var/local/IPTadmin/. Der Pfad zum Speicherort kann durch die Umgebungsvariable IPT_DATA festgelegt werden oder es wird die Vorgabe /var/local verwendet; der Ordner entspricht dem verwendeten Programmnamen. Für jedes Protokoll und jede Tabelle (table) filter, nat, mangle, raw und security wird getrennt in Dateien gespeichert. Für die IP-Adressmengen ist eine weitere Datei ipset zuständig.

Zum Lesen und Schreiben der Daten werden die einschlägigen Befehle von iptables bzw. ip6tables verwendet. Die Dateien sind Textdateien und beschreiben die Regeln im lesbaren (in der Syntax von iptables) Klartext.

Die Unterstützung von IP-Adressmengen ist Feature, aber nicht Voraussetzung für die Verwendung dieses Skripts. Wer ohne IP-Adressmengen auskommt, muss nichts weiter unternehmen. Das Skript überprüft die Verwendbarkeit von IP-Adressmengen und überspringt die jeweilige Funktionalität, wenn das Paket nicht installiert ist.

Automatischer Start des Paketfilters

In der Situation des Hochlaufs sind in automatisch gestarteten Skripten die Befehle load, null und halt sowie die Protokollauswahl über eine vorgestellte 4 usw. uneingeschränkt verwendbar. Beim Befehl load und ebenso bei save werden die geladenen Regeln auch auf der Standardausgabe ausgegeben und landen somit ggf. im Systemlog. Wenn man dies nicht möchte,muss die Ausgabe auf den Standardkanal stdout durch Umleitung auf /dev/null unterdrückt werden. Der Befehl status und die weiteren Befehle sind in dieser Situation nicht sinnvoll; ebenso sollte man unbekannte Befehle vermeiden, da diese eine Standard- oder Fehlerausgabe erzeugen.

Den Start kann man z.B. über eine Service-Unit für systemd oder über den Dispatcher von systemd-networkd realisieren:

Service-Unit

Zu den Einzelheiten lese bitte die Artikel zu systemd und Service-Units.

#/etc/systemd/system/packet-filter.service
[Unit]
Description = Paketfilter
Documentation = https://wiki.ubuntuusers.de/Skripte/IPTadmin/
# Siehe: https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/
After=network-pre.target

[Service]
Environment = TERM=none
StandardInput  = null
StandardOutput = null
# StandardOutput = journal     # Alternative, wenn man die Regeln im Systemlog sehen will
StandardError  = journal
ExecStart = /usr/local/sbin/IPTadmin load
RemainAfterExit = yes
ExecStop  = /usr/local/sbin/IPTadmin null

[Install]
WantedBy=network-online.target

Dispatcher-Skript

Zu den Einzelheiten lese bitte die Artikel zu systemd-networkd und dessen Dispatcher.

Eigenes Paketfilter dokumentieren

Der Befehl save des Programms gibt die Regeln und die IP-Adressmengen zusätzlich zu Sicherung in Dateien auch auf der Standardausgabe aus. Dies kann man zur Erzeugung einer Dokumentationsdatei verwenden:

IPTadmin save | tee Paketfilter.$(date --iso) 

Diese Revision wurde am 2. April 2022 09:51 von kB erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Internet, Sicherheit, System, Netzwerk