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
rootarbeiten. 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_DATAin die neue Umgebung übernommen.Die Funktionen
minNundPagedienen 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
protofür das IP-Protokoll und der Netfilter-Tabelle in der Variablentableauf. Sie wird intensiv von der FunktionRulesbenutzt, 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 nachloadauch nochstatusausgeführt wird.Die Funktion
Setsstellt 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
Filesrealisiert 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
Runrealisiert durch Rückgriff aufRules,SetsundFilesdie 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.Infoist die interaktive Hauptschleife des Programms. Die einstellbare Wiederholrate von 1-30 Sekunden wird über den Timeout (VariableTMOUT) für den Bash-Befehlreadrealisiert.KEYprä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.