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.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
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 auf0
.halt
löscht alle Regeln und beendet damit das Paketfilter, löscht aber nicht die IP-Adressmengen.null
führthalt
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ürstatus
.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:
Paketfilter in einen definierten Grundzustand bringen:
IPTadmin null
Optional: IP-Adressmengen definieren. Dokumentation
Netfilter-Regeln manuell oder mit einem anderen Werkzeug erstellen. Diese können die zuvor definierten IP-Adressmengen benutzen. Dokumentation
Definiertes Paketfilter sichern:
IPTadmin save
Paketfilter testen, dabei kann dessen Arbeit im laufenden Betrieb überwacht werden:
IPTadmin status
Versuchsweise vorgenommene Veränderungen können einfach wieder auf den gesicherten Ausgangszustand zurück gesetzt werden:
IPTadmin load
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)
Links¶
Paketfilter 🇩🇪
Projektseite von Netfilter 🇬🇧 – Dokumentation zu Netfilter, iptables & Co.
Projektseite von IP sets 🇬🇧 – Dokumentation zu IP-Adressmengen (IP sets)