Anhang: IPTadmin
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | #! /bin/bash -e # IPTadmin: Laden/Beobachten/Speichern von Netfilter-Regelsätzen und IP Sets # IPTadmin: Load/Watch/Save Netfilter rules or IP sets # Version 2022-03-26 # Copyright (C) 2022 kB @ UbuntuUsers.de # SPDX-License-Identifier: GPL-2.0-or-later # https://spdx.org/licenses/GPL-2.0-or-later.html test $UID = 0 || exec sudo env IPT_DATA=$IPT_DATA "$0" "$@" # Mach mich Admin! minN() case $1 in (0) cat - ;; (1) awk -v RS="\n\n+" "/$2./" ;; ([0-9]*) (( N = $1, --N )) ; minN $N "\n(.)*$2" ;; (*) false esac Page() { printf '%s\n' "$*" ; cat - ; echo ;} IPT () { test $proto = 6 && X=6 || X= ; ip${X}tables -t $table $* ;} Rules() for proto in $PROTOs do for table in raw mangle nat filter security do case $1 in (load) while read ; do IPT $REPLY ; done < $table-$proto ;& (status) IPT -nvL | minN 3 | sed "s/Chain/$table-$proto:/" ;; (save) IPT -S | tee $table-$proto | Page "# IP$proto-Tabelle $table" ;; (null) IPT -S | while read PN chain _ do case $PN in (-P|-N) IPT -F $chain ; esac case $PN in (-N) IPT -X $chain ; esac done ;; (zero) IPT -Z esac done | minN 3 | Page "= Regeln für IPv$proto =" done Sets() { case $1 in (load) ipset restore < ipset ;& (status) ipset list -output save | awk '/add/{print $2" "$3}' ;; (save) ipset save | tee ipset ;; (null) ipset destroy ; echo esac | minN 2 | Page "= IP Sets =" } && test -x /sbin/ipset || Sets() { true ;} Files() case $1 in (null) rm -f ./* 2>/dev/null || true ;; (save) Dir=$( mktemp -d -p $PWD $(date +%F)~XXX ) for File in * ; do test -d $File || cp $File $Dir ; done ;; (load) select Dir in * do test -d "$Dir" && cp "$Dir"/* $PWD || continue break done esac Run() case $1 in (4|6) PROTOs=$1 ;; (46|''|64) PROTOs='6 4' ;; (z|zero) Rules zero ;; (h|halt) Rules null ;; (n|null) Rules null ; Sets null ;; (l|load) Run null ; Sets load ; Rules load ;; (s|save) Files null ; Rules save ; Sets save ;; (c|copy) Files save ;; (r|read) Files null ; Files load ;; (status|i|info) TMOUT=3 PROTOs=${PROTOs: -1} Info ;; (*) echo "??? Unknown command: $1" >&2 ; false esac Info() while clear ; echo -n "Alle $TMOUT Sekunden: " ; Rules status KEY '46zhnls5, 8=seltener, 2=öfter, 0=beenden ' do case $REPLY in ([4zhn6]) Run $REPLY ;; (2) (( 0 < --TMOUT )) || TMOUT=1 ;; (5) clear ; Sets status ; TMOUT= KEY '> ' ;; (8) (( TMOUT++ < 30 )) || TMOUT=30 ;; ([ZHNLS]) PROTOs='6 4' Run ${REPLY,} ;; (0) break esac done >&2 KEY() { read -s -n1 ${*:+ -p "$*"} ; echo $REPLY ;} mkdir -p "${IPT_DATA:=/var/local}/${0##*/}" ; cd "$_" test $TERM = none || KEY "Arbeitsverzeichnis: $PWD. OK oder Abbruch mit CRTL-C: " for CMD in 64 $@ ; do Run $CMD ; done case $CMD in (4|46|''|64|6) Rules status ; esac |
Das Bash-Skript Skripte/IPTadmin, wie im Wiki beschrieben.
Es kann unter den Bedingungen der GNU General Public License (kurz GNU GPL oder GPL) in der Version 2.0 oder wahlweise einer neueren Version verwendet werden.
Erläuterungen zum Programmcode¶
Es werden die Programme iptables und ip6tables verwendet, die nur für den Benutzer
root
arbeiten. Das Skript verschafft sich deshalb zuerst per sudo die benötigte Identität, sofern es diese nicht bereits besitzt. Dabei wird eine ggf. gesetzte UmgebungsvariableIPT_DATA
in die neue Umgebung übernommen.Die Funktionen
minN
undPage
dienen nur zur Formatierung des Ausgabe indem durch Angabe einer mindestens vorhanden Zeilenanzahl leere Abschnitte unterdrückt bzw. mit Überschriften versehen werden.Die Funktion IPT dient zur Verbesserung der Übersicht im Programm und ruft die Programme iptables und ip6tables entsprechend der im eigenen Kontext gefundenen Werte in der Variablen
proto
für das IP-Protokoll und der Netfilter-Tabelle in der Variablentable
auf. Sie wird intensiv von der FunktionRules
benutzt, welche die für Regelsätze benötigten Grundoperationen bereitstellt. Beachte die Bash-Besonderheit beim Trenner„;&“
imCase
-Befehl; dieser sorgt hier (und auch bei der FunktionSets
) dafür, dass nachload
auch nochstatus
ausgeführt wird.Die Funktion
Sets
stellt die Grundoperationen für IP-Adressmengen bereit, sofern das benötigte Dienstprogramm ipset verfügbar ist und wird sonst als leere Dummy-Funktion definiert.Die Funktion
Files
realisiert die benötigten Grundoperationen für Dateisätze. Da das Programm nur Dateinamen ohne Leerzeichen und anderen problematischen Zeichen verwendet, wird auf Quotierung der Variablen zur Verbesserung der Lesbarkeit (hier und an anderen Stellen) weitgehend verzichtet.Die Funktion
Run
realisiert durch Rückgriff aufRules
,Sets
undFiles
die Kommandos. Indem dies nicht als Hauptprogramm, sondern als Funktion implementiert wird, eröffnet sich die einfache Möglichkeit, dass Bediener-Aktionen auch selbst andere Aktionen aufrufen können.Info
ist die interaktive Hauptschleife des Programms. Die einstellbare Wiederholrate von 1-30 Sekunden wird über den Timeout (VariableTMOUT
) für den Bash-Befehlread
realisiert.KEY
präsentiert dem Bediener einen Prompt und wartet auf einen Tastendruck.Das Haupprogramm besteht nur aus 4 Befehlen:
Es wird zuerst in das Arbeitsverzeichnis gewechselt, welches ggf. erst erzeugt wird.
Wenn das Programm nicht von systemd gestartet wurde und somit einen menschlichen Bediener hat, wird das Arbeitsverzeichnis zur Bestätigung angezeigt.
Die als Programmargumente auf der Kommandozeile angegebenen Kommandos werden abgearbeitet. Als erstes wird automatisch die Protokollauswahl auf „beide“ (=64) eingestellt.
Wenn das letzte ausgeführte Kommando eine Protokollauswahl war, werden einmalig nur die Regeln ausgegeben.