ubuntuusers.de

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
Anhang herunterladen

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 Umgebungsvariable IPT_DATA in die neue Umgebung übernommen.

  • Die Funktionen minN und Page 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 Variablen table auf. Sie wird intensiv von der Funktion Rules benutzt, welche die für Regelsätze benötigten Grundoperationen bereitstellt. Beachte die Bash-Besonderheit beim Trenner „;&“ im Case-Befehl; dieser sorgt hier (und auch bei der Funktion Sets) dafür, dass nach load auch noch status 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 auf Rules, Sets und Files 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 (Variable TMOUT) für den Bash-Befehl read 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.

Diese Revision wurde am 2. April 2022 11:17 von noisefloor erstellt.