[[Vorlage(Fortgeschritten)]] [[Vorlage(Getestet, general)]] {{{#!vorlage Wissen [:iptables: Netfilter/iptables] [:Programme_starten: Starten von Programmen] [:Rechte: Dateirechte] [:Terminal: Ein Terminal öffnen] [:mit Root-Rechten arbeiten: Mit Root-Berechtigungen arbeiten] }}} [[Inhaltsverzeichnis()]] Hier wird ein Skript für die Shell [:Bash:] vorgestellt, welches den Systemverwalter bei der Verwaltung des [#Links 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 [#Links 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: {{{#!vorlage Befehl 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: [[Anhang(IPTadmin)]] {dl} ## *** Folgender Link funktioniert erst nach Entlassung aus der Baustelle! *** Auf der Seite des Anhangs werden einige programmiertechnische Details erläutert: [:Skripte/IPTadmin/IPTadmin: 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 [:systemd: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: [[Vorlage(Paketinstallation, "ipset, Verwaltungswerkzeug für Kernel-IP-Sets (Option)")]] 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 ☞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: {{{#!vorlage Befehl IPTadmin KOMMANDO }}} oder {{{#!vorlage Befehl 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 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 [[Vorlage(Tasten, 4)]] bzw. [[Vorlage(Tasten, 6)]] wählt das Protokoll. * Taste [[Vorlage(Tasten, 5)]] zeigt die IP-Adressmengen und wartet auf einen Tastendruck. * Die Tasten [[Vorlage(Tasten, z)]], [[Vorlage(Tasten, h)]] und [[Vorlage(Tasten, 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 [[Vorlage(Tasten, Umschalt+z)]], [[Vorlage(Tasten, Umschalt+h)]] und [[Vorlage(Tasten, Umschalt+n)]] die Regeln beider IP-Protokolle; das gilt dann auch für die Tasten [[Vorlage(Tasten, Umschalt+l)]] und [[Vorlage(Tasten, Umschalt+s)]] zum Laden/Speichern der Regeln für beide IP-Protokolle und für die IP-Adressmengen. * Taste [[Vorlage(Tasten, 2)]] bzw. [[Vorlage(Tasten, 8)]] verkleinert/vergrößert die Periode im Bereich 1-30 um jeweils 1 Sekunde. * Taste [[Vorlage(Tasten, 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: [[Vorlage(Befehl, "IPTadmin null" ) ]] 1. Optional: IP-Adressmengen definieren. [#Links Dokumentation] 1. Netfilter-Regeln manuell oder mit einem anderen Werkzeug erstellen. Diese können die zuvor definierten IP-Adressmengen benutzen. [#Links Dokumentation] 1. Definiertes Paketfilter sichern: [[Vorlage(Befehl, "IPTadmin save" ) ]] 1. Paketfilter testen, dabei kann dessen Arbeit im laufenden Betrieb überwacht werden: [[Vorlage(Befehl, "IPTadmin status" ) ]] 1. Versuchsweise vorgenommene Veränderungen können einfach wieder auf den gesicherten Ausgangszustand zurück gesetzt werden: [[Vorlage(Befehl, "IPTadmin load" ) ]] 1. 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 [:systemd/Service_Units: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:systemd-networkd] und dessen [:/systemd/networkd-dispatcher: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: {{{#!vorlage Befehl IPTadmin save | tee Paketfilter.$(date --iso) }}} = Links = * [wikipedia:Paketfilter:Paketfilter] {de} * [https://www.netfilter.org/ Projektseite von Netfilter] {en} – Dokumentation zu Netfilter, iptables & Co. * [https://ipset.netfilter.org/ Projektseite von IP sets] {en} – Dokumentation zu IP-Adressmengen (IP sets) #tag: Netzwerk, Internet, System, Sicherheit,