﻿# TCP-Verbindungsüberwachung

## Funktion

Der Python-Monitor (Python 3.11/3.12 auf FreeBSD/Linux) verbindet sich dauerhaft
zum Windows-PowerShell-5.1-Listener auf TCP-Port 46181. Alle 5 Sekunden sendet
er PING plus fortlaufendem Zähler; Windows antwortet mit PONG und demselben
Zähler. Der Zähler startet mit der Unix-Zeit, wird je Heartbeat erhöht und
bleibt bei Reconnects erhalten. RTT, Zustände und Fehler werden mit Zeitstempel
protokolliert.

Timeout nach 3 Sekunden, Mismatch und Socket-Abbruch sind Störungen. Reconnect
erfolgt alle 5 Sekunden. Eine Mail geht nur beim Zustandswechsel zur Störung
(auch beim Start ohne Verbindung) und nach dem ersten korrekten PONG bei
Wiederherstellung raus. Fehlgeschlagene Reconnects erzeugen keinen Mailspam.

## Konfiguration und Installation

Oben in tcp-monitor.py TARGET_HOST, MAIL_FROM und MAIL_TO anpassen. Der lokale
MTA muss /usr/sbin/sendmail bereitstellen. Python verwendet nur subprocess mit
sendmail -t -i, keine SMTP- oder Mailbibliothek. Oben in tcp-listener.ps1 sind
Adresse, Port, Timeouts und Logpfad konfigurierbar.

Empfohlene Orte: C:\Monitoring und /opt/tcp-monitor (Linux) beziehungsweise
/usr/local/libexec/tcp-monitor (FreeBSD). Das Dienstkonto braucht Schreibrecht
für das Log neben dem Skript. Der Listener selbst braucht keine Adminrechte.

Windows-Firewall als Administrator auf die Monitor-IP begrenzen:

    New-NetFirewallRule -DisplayName 'TCP-Monitor 46181' -Direction Inbound -Protocol TCP -LocalPort 46181 -RemoteAddress 192.168.100.20 -Action Allow

Breitere Parallelregeln deaktivieren. Wenn möglich ListenAddress auf die
Monitoring-Netzadresse setzen. Das Protokoll hat weder Verschlüsselung noch
Authentifizierung: nur in geschütztem Netz oder Tunnel verwenden. Uhren per NTP
synchronisieren und Dateirechte einschränken.

## Start

Windows:

    powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\Monitoring\tcp-listener.ps1

FreeBSD/Linux:

    python3 /opt/tcp-monitor/tcp-monitor.py

## Tests

1. Listener, dann Monitor starten. Beide Logs müssen gleiche Zähler zeigen; der
   Monitor ergänzt die RTT.
2. Listener stoppen: genau eine Störungsmail muss entstehen.
3. Mehrere Reconnects abwarten: keine weitere Störungsmail.
4. Listener starten: erster korrekter PONG erzeugt genau eine
   Wiederherstellungsmail; der Zähler ist weitergelaufen.
5. Monitor bei gestopptem Listener starten: genau eine Start-Störungsmail.
6. SENDMAIL für einen isolierten Test vorübergehend auf ein ausführbares
   Fake-Programm setzen, das stdin speichert und Exit 0 liefert. Danach
   unbedingt zurückstellen.

System-sendmail separat testen:

    printf 'To: admin@example.com\nSubject: Test\n\nTest\n' | /usr/sbin/sendmail -t -i

## Diensteinsatz

Windows-Aufgabenplanung: Trigger „Beim Systemstart“, Programm powershell.exe,
Argumente -NoProfile -ExecutionPolicy Bypass -File C:\Monitoring\tcp-listener.ps1.
Unprivilegiertes Konto, unabhängig von Anmeldung, Neustart bei Fehler.

Linux-systemd-Beispiel:

    [Unit]
    Description=TCP PING/PONG Monitor
    After=network-online.target
    Wants=network-online.target
    [Service]
    Type=simple
    User=tcpmonitor
    WorkingDirectory=/opt/tcp-monitor
    ExecStart=/usr/bin/python3 /opt/tcp-monitor/tcp-monitor.py
    Restart=on-failure
    RestartSec=5
    [Install]
    WantedBy=multi-user.target

Auf FreeBSD ein lokales rc.d-Skript mit daemon(8), unprivilegiertem Benutzer und
automatischem Neustart verwenden.

## Logs, Sicherheit und Einschränkungen

tcp-listener.log und tcp-monitor.log liegen neben den Skripten. Der Monitor
protokolliert RTT, Zähler, Mismatch, Timeout, Socket-Abbruch, Zustand und
Mailfehler. Es gibt keine eingebaute Rotation: newsyslog, logrotate oder eine
Windows-Aufgabe einrichten.

Der Listener bedient bewusst nur einen Client; ein fremder Client kann ihn bis
zum 30-Sekunden-Lesetimeout belegen. Die Firewallbegrenzung ist wichtig. Ein
erfolgreicher Test beweist nicht die Funktion der AEZ-Anwendung. Heartbeats
können Idle-Timeout-Probleme verdecken. sendmail-Erfolg bestätigt nur lokale
Annahme, nicht Zustellung. Die maximale Erkennungszeit ist typischerweise etwa
8 Sekunden (5 Sekunden bis PING plus 3 Sekunden Timeout).
