
Logs sind das Gedächtnis jeder IT-Infrastruktur. Ob Firewall, Webserver oder Proxy – ohne Logauswertung bleibt die Fehlersuche oft reines Rätseln. Python eignet sich bestens, um Logdateien zu analysieren, zu filtern und aufzubereiten.
In diesem Artikel schauen wir uns zwei Beispiele an:
- Grundlagen der Logauswertung mit Python und Regex
- Gezieltes Filtern von Check Point VPN Logs
Warum Python für Logauswertung?
Python bringt von Grund auf alles mit, was man für Loganalyse braucht:
- einfache Dateiverarbeitung
- Regex matching (re)
- effiziente Datenstrukturen (deque, collections)
- einfache Lesbarkeit
Gerade im Security-Umfeld ist das ein grosser Vorteil, da Skripte schnell angepasst und erweitert werden können.
Beispiel 1: Einfache Logauswertung mit Regex
Beispielhafte Logdatei (access.log)
Wir starten mit einem einfachen Access-Log, wie man es z. B. von Proxies oder Webservern kennt:
192.168.20.10 10.10.10.10 443 [23.01.2026 08:05:56] accept [accepted by policy] 192.168.20.10 10.10.10.15 443 [23.01.2026 08:05:59] accept [accepted by policy] 192.168.20.10 10.10.10.20 443 [23.01.2026 08:06:01] accept [accepted by policy] 192.168.20.20 10.10.10.10 8443 [23.01.2026 08:07:45] drop [drop by cleanup]
Jede Zeile enthält:
- Source IP
- Destination IP
- Port
- Zeitstempel
- Aktion (accept / drop)
- Grund der Entscheidung
Python-Script zur Auswertung
import re # Define the path of the log file logfile = "access.log" # Regex matching pattern pattern = re.compile( r'(?P<src_ip>\S+) ' r'(?P<dst_ip>\S+) ' r'(?P<port>\S+) ' r'\[(?P<datetime>[^\]]+)\] ' r'(?P<action>\S+) ' r'\[(?P<reason>[^\]]+)\]' ) with open(logfile, 'r') as file: for line in file: match = pattern.match(line) if match: src_ip = match.group('src_ip') dst_ip = match.group('dst_ip') port = match.group('port') datetime = match.group('datetime') action = match.group('action') reason = match.group('reason') print( f"Source IP: {src_ip}, " f"Destination IP: {dst_ip}, " f"Port: {port}, " f"Datetime: {datetime}, " f"Action: {action}, " f"Reason: {reason}" )
Was passiert hier genau?
- Regex mit Named Groups
Durch (?P<name>…) bekommen die einzelnen Logfelder sprechende Namen. - Zeilenweise Verarbeitung
Die Logdatei wird speicherschonend Zeile für Zeile gelesen. - Strukturierte Ausgabe
Statt unübersichtlichem Text erhalten wir klar benannte Felder.
Dieses Prinzip ist die Basis für:
- Statistiken (z. B. Drops pro IP)
- CSV-Export
- Alerting bei bestimmten Aktionen
Beispiel 2: Check Point VPN Logs gezielt filtern
Während einfache Access-Logs übersichtlich sind, sehen reale Firewall-Logs deutlich komplexer aus. Besonders iked und vpnd Logs bei Check Point VPN-Problemen können schnell mehrere tausend Zeilen umfassen.
Hier hilft ein Skript, das:
- nach einem bestimmten Peer sucht
- Kontextzeilen anzeigt
- optional nur Fehler oder Fehlschläge filtert
Ziel des Skripts
- Suche nach Peer-IP oder Namen
- Anzeige von Kontextzeilen vor und nach dem Treffer
- Filteroptionen:
- –error → nur Error/Fatal
- –failed → nur fehlgeschlagene Aushandlungen
Python-Script zur iked / vpnd Analyse
# +----------------------------------------------------------+ # | Script Name: analyse_vpn_logs.py | # | Copyright: Copyright (c) https://www.avantec.ch | # | Last revision: 06.02.2026 | # +----------------------------------------------------------+ import sys import os import argparse from collections import deque # Argument parsing parser = argparse.ArgumentParser(description="Checkpoint VPN peer log viewer") parser.add_argument("peer", help="Peer IP or name") parser.add_argument( "--context", type=int, default=5, help="Number of context lines before and after a match" ) parser.add_argument( "--error", action="store_true", help="Show only error-level entries" ) parser.add_argument( "--failed", action="store_true", help="Show only failure-related entries" ) args = parser.parse_args() # Get peer / context from args PEER = args.peer CONTEXT = args.context # Environment / log paths fwdir = os.environ.get("FWDIR") # Standard path for vpnd and iked log files in $FWDIR if not fwdir: sys.exit("ERROR: FWDIR environment variable is not set") # Define log files location LOG_FILES = [ os.path.join(fwdir, "log", "test_iked1.elg"), os.path.join(fwdir, "log", "test_vpnd.elg") ] # Filter definitions ERROR_KEYWORDS = ["error", "fatal"] FAILED_KEYWORDS = [ "failed", "failure", "doomed", "no proposal", "authentication" ] def line_matches_filters(line): text = line.lower() if args.error and not any(k in text for k in ERROR_KEYWORDS): return False if args.failed and not any(k in text for k in FAILED_KEYWORDS): return False return True def block_matches_filters(block_lines): # If no filters are enabled, always show the block if not (args.error or args.failed): return True return any(line_matches_filters(line) for line in block_lines) # Main processing loop for log_file in LOG_FILES: print(f"\n=== {log_file} ===") try: with open(log_file, "r", errors="ignore") as f: buffer = deque(maxlen=CONTEXT) for line in f: if PEER in line: block = [] # Add context before block.extend(buffer) # Add trigger line block.append(line) # Add context after for _ in range(CONTEXT): try: following_line = next(f) block.append(following_line) except StopIteration: break # Apply filters to the whole block if block_matches_filters(block): print("------ context ------") for l in block: print(l.rstrip()) print("---- context end ----") buffer.append(line) except FileNotFoundError: print("File not found")
Module importieren
import sys import os import argparse from collections import deque
Zunächst werden die nötigen Module importiert – insbesondere argparse für Kommandozeilenparameter und deque für effizientes Kontext-Handling.
Argumente definieren
parser = argparse.ArgumentParser(description="Checkpoint VPN peer log viewer") parser.add_argument("peer", help="Peer IP or name") parser.add_argument("--context", type=int, default=5) parser.add_argument("--error", action="store_true") parser.add_argument("--failed", action="store_true") args = parser.parse_args()
So lässt sich das Skript flexibel nutzen, z. B.:
python3 vpnlog.py 1.2.3.4 --context 10 --failed
Logpfade aus der Umgebung
fwdir = os.environ.get("FWDIR") if not fwdir: sys.exit("ERROR: FWDIR environment variable is not set") LOG_FILES = [ os.path.join(fwdir, "log", "test_iked1.elg"), os.path.join(fwdir, "log", "test_vpnd.elg") ]
In Check Point Systemen zeigt $FWDIR standardmässig auf das Installationsverzeichnis – ein sauberer, portabler Ansatz.
Filterlogik
ERROR_KEYWORDS = ["error", "fatal"] FAILED_KEYWORDS = [ "failed", "failure", "doomed", "no proposal", "authentication" ]
Diese Schlüsselwörter spiegeln typische VPN-Probleme wider:
- Phase-1/2-Fehler
- Proposal-Mismatch
- Authentifizierungsprobleme
Kontextbasierte Logausgabe
buffer = deque(maxlen=CONTEXT)
Der deque speichert die letzten Zeilen vor einem Treffer. Sobald der Peer gefunden wird, werden:
- vorherige Zeilen
- die Trefferzeile
- folgende Zeilen
als zusammenhängender Block ausgegeben.
Das ist extrem hilfreich, um den Verbindungsaufbau im zeitlichen Zusammenhang zu verstehen.
Fazit
Python ist ein mächtiges Tool für Logauswertung – vom simplen Access-Log bis zur komplexen VPN-Fehleranalyse auf Check Point Firewalls.
Die wichtigsten Learnings:
- Regex bringt Struktur in unstrukturierte Logs
- Named Groups erhöhen Lesbarkeit und Wartbarkeit
- Kontextbasierte Analyse spart enorm Zeit bei der Fehlersuche
Gerade im Security- und Netzwerkumfeld lassen sich mit wenigen Zeilen Python Werkzeuge bauen, welche die Log-Analyse vereinfachen und verbessern.
UNCODE.initRow(document.getElementById(„row-unique-0“));
Der Beitrag Logauswertung mit Python – vom einfachen Access-Log bis zum Check Point VPN Debug erschien zuerst auf Tec-Bite.
