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:

  1. Grundlagen der Logauswertung mit Python und Regex
  2. 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.



Freezing Penguin

Freezing Penguin ist Security Engineer bei der AVANTEC AG. Er interessiert sich für alles rund um das Thema Netzwerksicherheit und arbeitet besonders gerne mit Firewalls. In seiner Freizeit spielt er gerne Videospiele und treibt Sport.

Privacy Preference Center