Script zum auslesen von variabeln in einer logdatei mit weitergabe an netsh advfirewall
hallo zusammen,
ich bin gerade auf der suche nach einem script (batch, vbscript, oder sogar powershell wenn möglich) und habe mehrere einträge gefunden, wo schon ein ähnliches thema von anderen usern erfragt wurde.
bei den scripts konnte ich nur das auslesen einer logdatei und dann übertragen in eine andere logdatei sehen, ich benötige jedoch nach dem auslesen einen befehl an die windows firewall damit eine entsprechende regel hinzugefügt wird.
das problem...
ich habe eine logdatei, die mir zb sowas hier anzeigt:
10/23-03:18:46.074314 [119:14:1] (http_inspect) NON-RFC DEFINED CHAR [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 188.76.112.X:52135 -> 146.4.94.X:443
ich benötige nun ein script welches permanent (zb jede sekunde) die logdatei auslesen kann, dann die entsprechenden variabeln für die ereignisse setzt und letztendlich an die windows firewall als block events weiter leitet, mit den zuvor gesetzten variabeln.
es sei angemerkt, dies habe ich hier erlesen, dass manche es für sinnlos erachten die logs aus einer datei auszulesen, wenn sie doch eh in eine mysql datenbank eingepflegt werden.
der grund ist der, dass das eigentliche programm, welche die logs schreibt nicht direkt mit der datenbank verbunden ist, sondern erst ein zweites die daten einpflegt.
das hauptprogramm hingegen erlaubt mir mehrere ausgabeformate, zb direkter text... s.o.
bevor nun das zweite programm erstmal anfängt den log in die db einzupflegen, ist der eigentliche log ja schon verfügbar und könnte bereits verarbeitet werden (vom benötigtem script).
ich dachte für die umsetzung an:
variabel 1: zeit/datum - 10/23-03:18:46.074314
variabel 2: beschreibung - [119:14:1] (http_inspect) NON-RFC DEFINED CHAR [Classification: Potentially Bad Traffic] [Priority: 2]
variabel 3: protokoll - {TCP}
variabel 4: ip - 188.76.112.X
variabel 1,2+4 sollen in die beschreibung von der firewall regel eingetragen werden - $description
variabel 3 bestimmt das protokoll - $proto
variabel 4 setzt die remote ip - $blockip und $description
als command wäre dann zb möglich
netsh advfirewall firewall add rule name="$description" dir=in action=block protocol=$proto remoteip=$blockip
mir fehlt hier der ansatz, wie ich nach dem lesen der logdatei den befehl mit den gesetzten variabeln ausführen kann.
ich hoffe bald von euch zu hören.
gruß
ich bin gerade auf der suche nach einem script (batch, vbscript, oder sogar powershell wenn möglich) und habe mehrere einträge gefunden, wo schon ein ähnliches thema von anderen usern erfragt wurde.
bei den scripts konnte ich nur das auslesen einer logdatei und dann übertragen in eine andere logdatei sehen, ich benötige jedoch nach dem auslesen einen befehl an die windows firewall damit eine entsprechende regel hinzugefügt wird.
das problem...
ich habe eine logdatei, die mir zb sowas hier anzeigt:
10/23-03:18:46.074314 [119:14:1] (http_inspect) NON-RFC DEFINED CHAR [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 188.76.112.X:52135 -> 146.4.94.X:443
ich benötige nun ein script welches permanent (zb jede sekunde) die logdatei auslesen kann, dann die entsprechenden variabeln für die ereignisse setzt und letztendlich an die windows firewall als block events weiter leitet, mit den zuvor gesetzten variabeln.
es sei angemerkt, dies habe ich hier erlesen, dass manche es für sinnlos erachten die logs aus einer datei auszulesen, wenn sie doch eh in eine mysql datenbank eingepflegt werden.
der grund ist der, dass das eigentliche programm, welche die logs schreibt nicht direkt mit der datenbank verbunden ist, sondern erst ein zweites die daten einpflegt.
das hauptprogramm hingegen erlaubt mir mehrere ausgabeformate, zb direkter text... s.o.
bevor nun das zweite programm erstmal anfängt den log in die db einzupflegen, ist der eigentliche log ja schon verfügbar und könnte bereits verarbeitet werden (vom benötigtem script).
ich dachte für die umsetzung an:
variabel 1: zeit/datum - 10/23-03:18:46.074314
variabel 2: beschreibung - [119:14:1] (http_inspect) NON-RFC DEFINED CHAR [Classification: Potentially Bad Traffic] [Priority: 2]
variabel 3: protokoll - {TCP}
variabel 4: ip - 188.76.112.X
variabel 1,2+4 sollen in die beschreibung von der firewall regel eingetragen werden - $description
variabel 3 bestimmt das protokoll - $proto
variabel 4 setzt die remote ip - $blockip und $description
als command wäre dann zb möglich
netsh advfirewall firewall add rule name="$description" dir=in action=block protocol=$proto remoteip=$blockip
mir fehlt hier der ansatz, wie ich nach dem lesen der logdatei den befehl mit den gesetzten variabeln ausführen kann.
ich hoffe bald von euch zu hören.
gruß
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 193155
Url: https://administrator.de/forum/script-zum-auslesen-von-variabeln-in-einer-logdatei-mit-weitergabe-an-netsh-advfirewall-193155.html
Ausgedruckt am: 13.05.2025 um 09:05 Uhr
23 Kommentare
Neuester Kommentar
Hallo wsecure!
Das Problem dürfte weniger das Zerlegen der Log-Zeilen sein - als Batch annäherungsweise so:
- sondern eher die Frage des zeitnahen Auslesens der (neuen) Einträge.
Was die Sinnhaftigkeit des Erzeugens der Firewallregeln angeht, hast Du vermutlich ohnehin schon Deine Überlegungen angestellt ...
Grüße
bastla
Das Problem dürfte weniger das Zerlegen der Log-Zeilen sein - als Batch annäherungsweise so:
@echo off & setlocal
for /f "tokens=1*" %%i in ('findstr /c:"Bad Traffic" D:\LogDatei.txt') do (
for /f "tokens=1-3 delims={}" %%a in ("%%j") do (
for /f "delims=: " %%r in ("%%c") do (
echo netsh advfirewall firewall add rule name="%%i %%r %%a" dir=in action=block protocol=%%b remoteip=%%r
)
)
)
Was die Sinnhaftigkeit des Erzeugens der Firewallregeln angeht, hast Du vermutlich ohnehin schon Deine Überlegungen angestellt ...
Grüße
bastla
moin wsecure,
das Permanente Auslesen der Logdatei um diese zum Beispiel als Puffer zu benutzen ist mit dem Filehandle 0 und einer gleichzeitigen Pipe zu dem Programm, welches die Zeilen verarbeitet möglich.
Die Pipe erzeugt für beide Seiten je eine CMD instanz.
Mit der Findstr Pipe wird nur Zeilenweise aus den Befehl ausgelesen und im zweiten Batch zweilenweise verarbeitet.
Somit bleibst Du später immer in der Letzten Zeile zum auslesen:
Dieser Batch erzeugt eine Zweite Batch um mit den readinput.cmd-Write.cmd die Log (nummeriert) ständig abzuarbeiten.
Gruß Phil
das Permanente Auslesen der Logdatei um diese zum Beispiel als Puffer zu benutzen ist mit dem Filehandle 0 und einer gleichzeitigen Pipe zu dem Programm, welches die Zeilen verarbeitet möglich.
Die Pipe erzeugt für beide Seiten je eine CMD instanz.
Mit der Findstr Pipe wird nur Zeilenweise aus den Befehl ausgelesen und im zweiten Batch zweilenweise verarbeitet.
Somit bleibst Du später immer in der Letzten Zeile zum auslesen:
:readinput.cmd
@echo off
if "%~1" equ "/?" echo Stellt eine Pufferdatei zum Permaneten auslesen zur verfuegung.^
&echo Dies ermoeglicht Tee waerend der Ausfuehrung eines Befehls.^
&echo(&<nul set /p "=%~n0 " &echo [Logfile] [/.]&echo(^
&echo Logfile Angabe eines zu Puffernden Logfiles.^
&echo /. Auch Leerzeilen Puffern.&echo(^
&echo "%~pd0%~n0-write.cmd" wird zum^
&echo abarbeiten des Puffers Bereitgestellt.&echo(^
&echo Befehle mit Pipe einleiten:^
&echo Befehl1 ^| "%~n0" [Logfile] [/.] &exit /b
if not exist "%~pd0%~n0-write.cmd" for /f "delims=:" %%i in ('findstr /nb :INSTALLPuffer "%~f0"') do more +%%i "%~f0" > "%~pd0%~n0-write.cmd"
setlocal disabledelayedexpansion
set "Puffertmp=%temp%\Tee%random%.txt"
set "Puffer=%Puffertmp%"
set "LN=."
set "del=/D"
if "%~1" equ "" goto :noParam
:Parameter
if /i "%~1" equ "/N" (set "N=1" &set LN="^" ) else set "del=" &set "Puffer=%~1"
if "%~2" neq "" shift &goto :Parameter
:noParam
(findstr /n %LN% && ECHO E_O_F_END_OF_FILE:) >"%Puffer%" | <"%Puffer%" "%~pd0%~n0-write.cmd" "%Puffer%" %del%
exit /b
:INSTALLPuffer
@echo off
setlocal
set /a Limit=60
if "%~1" equ "/?" echo Liest aus einer nummerierten Pufferdatei, bis zur Abschlusszeile "E_O_F_END_OF_FILE:".^
&echo oder bis diese Datei kleiner als Vorher wird: ^( type nul ^<PufferDatei ^).&echo(^
&<nul set /p "=%~n0 Pufferdatei [/d] ^<PufferDatei" &echo(^
&echo /D Die ^(temporaere^) Datei wird nachher geloescht.^
&echo Werden %Limit% Sekunden keine Ausgaben Produziert wird dieses Programm beendet.&exit /b
if not exist "%~1" echo Pufferdatei nicht gefunden! >&2 &exit /b 1
if /i "%~2" neq /D (set "Del=") else set del=^&del %1 ^>nul
for %%i in (%1) do set "Z=%%~zi"
set /a R=limit
:IN
set /a r-=1
set "out=1"
set "inline="
set /p "inline="
setlocal enabledelayedexpansion
rem Abbruch mit AbschlussZeile
for /f "delims=:" %%i in ("!inline!") do set "out=" &if %%i equ E_O_F_END_OF_FILE (title Verabeitung Fertig.%del%&exit /b) else title Verarbeite Zeile %%i
rem Abbruch wenn nach Zeitlimit keine Ausgabe
if %r% leq 0 title Verabeitung Fertig.%del%&exit /b
rem Abbruch wenn Datei kleiner
for %%i in (%1) do if %Z% gtr %%~zi (title Verabeitung Fertig.%del%&exit /b) else set "Z=%%~zi"
if defined Out endlocal &waitfor EineSekundePause /t 1 >nul 2>&1 &title Timer %r%&goto :in
rem Hier muss die Verarbeitung Hinein zB.
echo(!inline:*:=!
for /f "tokens=1,2,3*" %%i in ("!inline:*:=!") do endlocal &echo %%j-%time%-%%l
if "%os%" equ "!OS!" endlocal
set /a R=limit
goto :in
Dieser Batch erzeugt eine Zweite Batch um mit den readinput.cmd-Write.cmd die Log (nummeriert) ständig abzuarbeiten.
(for /l %i in (1 1 10) do @Dir & ping localhost -n 5 1>nul ) |readinput.cmd Testlog.txt
Gruß Phil
Hallo wsecure!
Um jeweils nur die letzten 10 Zeilen zu verarbeiten, könntest Du etwa so vorgehen:
Grüße
bastla
P.S.: Magst Du Deine Batch-Ansätze nicht auch vernünftig (als Code) formatiert posten (lässt sich sogar noch nachholen
)?
[Edit] Reihenfolge der Zeilen 10 und 11 korrigiert [/Edit]
Um jeweils nur die letzten 10 Zeilen zu verarbeiten, könntest Du etwa so vorgehen:
@echo off & setlocal enabledelayedexpansion
set "Log=D:\log\alert.id
set /a Zeilen=10
:loop
for /f "delims=:" %%i in ('findstr /n "^" "%Log%"') do set /a Setoff=%%i-%Zeilen%
if %Setoff% lss 0 set /a Setoff=0
for /f "tokens=1*" %%i in ('more +%Setoff% "%Log%"^|findstr /c:"Priority"') do (
for /f "tokens=1-3 delims={}" %%a in ("%%j") do (
for /f "tokens=4 delims=: " %%r in ("%%c") do (
set "Name=%%i %%r %%a"
echo netsh advfirewall firewall add rule name="!Name:~,-1!" dir=in action=block protocol=%%b remoteip=%%r
)
)
)
sleep 30
goto :loop
bastla
P.S.: Magst Du Deine Batch-Ansätze nicht auch vernünftig (als Code) formatiert posten (lässt sich sogar noch nachholen
[Edit] Reihenfolge der Zeilen 10 und 11 korrigiert [/Edit]
moin,
Hier ist das Script zum offenhalten an der letzten Zeile:
So nu aber inne Haia
Gruß Phil
Hier ist das Script zum offenhalten an der letzten Zeile:
@echo off
setlocal disabledelayedexpansion
if not exist "%~pd0%~n0-write.cmd" for /f "delims=:" %%i in ('findstr /nb :INSTALLPuffer "%~f0"') do more +%%i "%~f0" > "%~pd0%~n0-write.cmd"
set "Datei=D:\log\alert.id"
rem wenig CPUlast
rem Verarbeitet alle Zeilen und wenn eine neue angefügt wird immer die Letzte Zeile
<"%Datei%" "%~pd0%~n0-write.cmd"
exit /b
:INSTALLPuffer
@echo off
setlocal
set /a Limit=60
set /a R=limit
:IN
set /a r-=1
set "out=1"
set "inline="
set /p "inline="
setlocal enabledelayedexpansion
rem Abbruch wenn nach Zeitlimit keine Ausgabe
if %r% leq 0 exit /b
if not defined inline endlocal &waitfor EineSekundePause /t 1 >nul 2>&1&title Timer %r% &goto :in
rem Verarbeite Zeile mit Programm
for /f "tokens=1*" %%t in ("!inline!") do ^
for /f "tokens=1-5* delims=]" %%a in ("%%u") do ^
for /f "tokens=1,3,4 delims=[{}: " %%p in ("%%e %%f") do if %%p equ Priority ^
echo netsh advfirewall firewall add rule name="%%t %%r %%a]%%b]%%c]%%d]%%e]" dir=in action=block protocol=%%q remoteip=%%r
if "!os!" equ "%OS%" endlocal
set /a R=limit
title verarbeite Zeile
goto :in
So nu aber inne Haia
Gruß Phil
moin,
Die Fehlermeldung besagte ja das Fehlen einer Datei also der Datei "D:\log\alert.id".
Sonst sollte es aber laufen.
Ich habs nochmal ein wenig gekürzt (läuft jetzt auch nur als einzelner Batch) und der Eintrag in die Firewall wurde mit bedingter Befehlsverkettung verknüpft.
Wieso steht eigentlich der Zeitstempel im Regelnamen?
Gruß Phil
Die Fehlermeldung besagte ja das Fehlen einer Datei also der Datei "D:\log\alert.id".
Sonst sollte es aber laufen.
Ich habs nochmal ein wenig gekürzt (läuft jetzt auch nur als einzelner Batch) und der Eintrag in die Firewall wurde mit bedingter Befehlsverkettung verknüpft.
@echo off
setlocal disabledelayedexpansion
if "%~1" neq "" (set "Datei=%~1") else set "Datei=D:\log\alert.id"
find "" "%Datei%"|find "-" >nul ||exit /b 1 &for /f %%i in ('more +5 "%datei%" ^|find /c /v "" ') do Call <"%Datei%" :Read_Lines %%i &exit /b
:Read_Lines
for /l %%i in (1 1 %1 ) do set /p "inline="
:IN
set "inline="
set /p "inline="
if not defined inline waitfor EineSekundePause /t 1 >nul 2>&1 &goto :in
setlocal enabledelayedexpansion
for /f "tokens=1*" %%t in ("!inline!") do ^
for /f "tokens=1-5* delims=]" %%a in ("%%u") do ^
for /f "tokens=1,3,4 delims=[{}: " %%p in ("%%e %%f") do if %%p equ Priority ^
netsh advfirewall firewall show rule name="%%t %%r %%a]%%b]%%c]%%d]%%e]" >nul|| netsh advfirewall firewall add rule name="%%t %%r %%a]%%b]%%c]%%d]%%e]" dir=in action=block protocol=%%q remoteip=%%r
if "!os!" equ "%OS%" endlocal
goto :in
Wieso steht eigentlich der Zeitstempel im Regelnamen?
Gruß Phil
Hallo wsecure!
Die Verhindern doppelter Regeln sollte sich bei dieser Namensgebung auch vereinfachen lassen und könnte etwa so erfolgen, dass beim Start des Scripts die derzeitigen Regeln in eine Datei exportiert und jeweils nach dem Setzen einer neuen Regel diese Datei ergänzt (bzw wieder neu erstellt wird - vermutlich eine Frage der Performance). Abfragen ließe sich dann am einfachsten das Vorhandensein einer Regel mit der aktuell ermittelten IP:
BTW: Inziwschen hatte ich Zeit, mir Deinen letzten Ansatz genauer anzusehen: Noch schlimmer, als mein Fauxpas mit 
Grüße
bastla
bei der regelbeschreibung mit "%%i %%a %%r" bleiben, dass die ip variabel hinten stehen muss, damit am ende der zeile kein freizeichen mehr vorhanden und somit die regel in der firewall gültig ist.
Dagegen ist nix einzuwenden (außer, dass mit meinem (inzwischen korrigierten) Ansatz oben bereits das Leerzeichen am ende entfernt sein sollte) ...Die Verhindern doppelter Regeln sollte sich bei dieser Namensgebung auch vereinfachen lassen und könnte etwa so erfolgen, dass beim Start des Scripts die derzeitigen Regeln in eine Datei exportiert und jeweils nach dem Setzen einer neuen Regel diese Datei ergänzt (bzw wieder neu erstellt wird - vermutlich eine Frage der Performance). Abfragen ließe sich dann am einfachsten das Vorhandensein einer Regel mit der aktuell ermittelten IP:
findstr /e "%%r" "Regeln.txt">nul || (
netsh advfirewall firewall add rule name="!Name:~,-1!" dir=in action=block protocol=%%b remoteip=%%r
)
%%r
ist es, wenn Du die (unnötige) Variable %IDNAME%
schon vor der ersten Schleife setzt (da gibt es nämlich weder %%r
noch %Name%
) - daher vielleicht doch noch einmal mit meiner angesprochenen Variante antesten ... Grüße
bastla
Hallo wsecure!
Da sich (wie ich mir zwischenzeitlich angesehen habe) das Ergebnis von "
Die Reihenfolge innerhalb der Benennung kannst Du auf Wunsch in der Zeile 11 natürlich trotzdem anpassen bzw auf die Variable
Das Ganze ist, falls ich das noch nicht erwähnt haben sollte
, weiterhin ungetestet ...
Grüße
bastla
Da sich (wie ich mir zwischenzeitlich angesehen habe) das Ergebnis von "
netsh advfirewall export Regeln.wfw
" nicht wirklich gut zum Durchsuchen per "findstr
" eignet, wäre vielleicht die oben von Dir verwendete Variante der bessere Weg - das könnte dann insgesamt etwa so aussehen:@echo off & setlocal enabledelayedexpansion
set "Log=D:\log\alert.id
set /a Zeilen=10
:loop
for /f "delims=:" %%i in ('findstr /n "^" "%Log%"') do set /a Setoff=%%i-%Zeilen%
if %Setoff% lss 0 set /a Setoff=0
for /f "tokens=1*" %%i in ('more +%Setoff% "%Log%"^|findstr /c:"Priority"') do (
for /f "tokens=1-3 delims={}" %%a in ("%%j") do (
for /f "tokens=4 delims=: " %%r in ("%%c") do (
set "Name=%%i %%r %%a"
netsh advfirewall firewall show rule name="!Name:~,-1!">nul || (
netsh advfirewall firewall add rule name="!Name:~,-1!" dir=in action=block protocol=%%b remoteip=%%r
)
)
)
)
sleep 30
goto :loop
%Name%
(bzw wegen der "delayedExpansion
" eigentlich "!Name!
) ganz verzichten - das sähe dann so aus:@echo off & setlocal
set "Log=D:\log\alert.id
set /a Zeilen=10
:loop
for /f "delims=:" %%i in ('findstr /n "^" "%Log%"') do set /a Setoff=%%i-%Zeilen%
if %Setoff% lss 0 set /a Setoff=0
for /f "tokens=1*" %%i in ('more +%Setoff% "%Log%"^|findstr /c:"Priority"') do (
for /f "tokens=1-3 delims={}" %%a in ("%%j") do (
for /f "tokens=4 delims=: " %%r in ("%%c") do (
netsh advfirewall firewall show rule name="%%i %%a %%r">nul || (
netsh advfirewall firewall add rule name="%%i %%a %%r" dir=in action=block protocol=%%b remoteip=%%r
)
)
)
)
sleep 30
goto :loop
Grüße
bastla
Hallo wsecure!
... was aber offenbar auch egal ist, wenn die Methode mit "
).
Zu
Grüße
bastla
mir ist aufgefallen, dass du nun nicht mehr die errorlevel 1 abfrage inkludiert hast.
... was aber offenbar auch egal ist, wenn die Methode mit "
show rule
" doch nicht funktioniert (und nein, ich kann leider derzeit keine sinnvolle Alternative anbieten Zu
"kann jetzt auch die datei nicht finden"
noch eine Frage: An welcher Stelle im Ablauf (nach welcher Batchzeile) taucht denn diese Fehlermeldung auf?Grüße
bastla