Zurück zur Startseite

PowerShell Überwachung IP Windows nftables

Der Artikel beschreibt ein PowerShell-Skript zur Echtzeit-Überwachung von IP-Adressen von Windows-Anwendungsverbindungen. Implementierte Filterung öffentlicher IPv4, Deduplizierung und automatisches Hinzufügen zu nftables OpenWRT über SSH. Der Ansatz eignet sich für dynamische Traffic-Steuerung.

IP-Tracking von Anwendungen: PowerShell + nftables
Advertisement 728x90

Windows-App-IPs mit PowerShell und nftables überwachen

Entwickler und Netzwerkadministratoren müssen oft die IP-Adressen überwachen, zu denen Anwendungen Verbindungen herstellen. Statische IP-Listen werden schnell veraltet, da sich regionale CDNs und Routing-Pfade ständig ändern. Dieses PowerShell-Skript erfasst in Echtzeit aktive (Established) Verbindungen eines bestimmten Prozesses, filtert öffentliche IPv4-Adressen heraus und sendet sie an einen OpenWRT-Router, um dynamisch in nftables einzufügen.

Das Skript überwacht einen definierten Prozess (Standard: Telegram), sammelt eindeutige RemoteAddress-Werte aus Get-NetTCPConnection, schließt private IP-Bereiche und bekannte DNS-Server (8.8.8.8, 1.1.1.1) aus und fügt die IPs per SSH in eine nft-Menge ein. So bleibt die Traffic-Steuerung aktuell – ohne manuelle Eingriffe.

Skriptstruktur und Parameter

Das Skript akzeptiert wichtige Parameter für flexible Konfiguration:

Google AdInline article slot
  • ProcessName: Name des zu überwachenden Prozesses (z. B. "Telegram")
  • OutputFile: Protokolldatei für aufgezeichnete IPs (z. B. "telegram_ips.txt")
  • PollSeconds: Abfrageintervall für Verbindungen (3 Sekunden)
  • RouterHost, RouterUser: SSH-Zieladresse (z. B. "192.168.1.1", "root")
  • NftFamily, NftTable, NftSet: nftables-Kontext (z. B. "inet", "fw4", "vpn_domains")
  • UseTimeout: Optionales Timeout (z. B. "1h")
  • SshKeyPath: Pfad zur SSH-Privatschlüsseldatei

Die Logik verwendet HashSet zur Duplikatvermeidung und prüft die Öffentlichkeit der IP mittels Byte-Check.

Filtern von öffentlichen IPv4-Adressen

Die Funktion Test-PublicIPv4 schließt RFC1918, Link-Local, Carrier-Grade NAT und gängige DNS-Adressen aus:

function Test-PublicIPv4([string]$ip) {
    try {
        $addr = [System.Net.IPAddress]::Parse($ip)
    } catch {
        return $false
    }

    if ($addr.AddressFamily -ne [System.Net.Sockets.AddressFamily]::InterNetwork) {
        return $false
    }

    $b = $addr.GetAddressBytes()

    if ($b[0] -eq 10) { return $false }
    if ($b[0] -eq 127) { return $false }
    if ($b[0] -eq 169 -and $b[1] -eq 254) { return $false }
    if ($b[0] -eq 172 -and $b[1] -ge 16 -and $b[1] -le 31) { return $false }
    if ($b[0] -eq 192 -and $b[1] -eq 168) { return $false }
    if ($b[0] -eq 100 -and $b[1] -ge 64 -and $b[1] -le 127) { return $false }
    if ($ip -eq "0.0.0.0") { return $false }

    if ($ip -eq "8.8.8.8") { return $false }
    if ($ip -eq "8.8.4.4") { return $false }
    if ($ip -eq "1.1.1.1") { return $false }
    if ($ip -eq "1.0.0.1") { return $false }

    return $true
}

So werden Falschmeldungen durch lokale Traffic- oder DNS-Aufrufe vermieden.

Google AdInline article slot

Integration mit OpenWRT nftables

Die Funktion Add-IpToOpenWrt führt einen SSH-Befehl aus, um IPs dynamisch in die nft-Menge einzufügen:

function Add-IpToOpenWrt([string]$ip) {
    $target = "$RouterUser@$RouterHost"

    if ($UseTimeout) {
        $remoteCmd = "nft add element $NftFamily $NftTable $NftSet { $ip timeout $TimeoutValue } 2>/dev/null || true"
    } else {
        $remoteCmd = "nft add element $NftFamily $NftTable $NftSet { $ip } 2>/dev/null || true"
    }

    & ssh \
        -i $SshKeyPath \
        -o IdentitiesOnly=yes \
        -o BatchMode=yes \
        $target \
        $remoteCmd | Out-Null

    return $LASTEXITCODE
}

Optionen wie -o BatchMode=yes und || true gewährleisten eine nicht-interaktive Ausführung. Timeout-basierte Einträge löschen sich automatisch – Wartungsaufwand sinkt.

Hauptüberwachungsschleife

In einer Endlosschleife:

Google AdInline article slot
  • Get-Process -Name $ProcessName ruft die Prozess-ID ab.
  • Get-NetTCPConnection | Where State -eq "Established" -and OwningProcess -eq $PID extrahiert RemoteAddress-Werte.
  • Neue öffentliche IPs werden dem HashSet hinzugefügt, in die Protokolldatei geschrieben und in nftables eingefügt.
  • Start-Sleep -Seconds $PollSeconds pausiert vor der nächsten Prüfung.

Der gesamte Zyklus dauert etwa 3 Sekunden – optimal zwischen Reaktionsfähigkeit und Systembelastung.

Hauptvorteile

  • Dynamische Überwachung: Erfasst echte IPs aus laufenden Verbindungen – keine veralteten Listen mehr.
  • Traffic-Filterung: Schließt private Bereiche, DNS und Loopback-Adressen aus – saubere Daten.
  • Automatisierte nftables-Updates: Direkte SSH-Integration mit OpenWRT – kein API oder Webinterface nötig.
  • Duplikatvermeidung: HashSet verhindert Doppelungen in Logs und nft-Mengen.
  • Flexibilität: Konfigurierbar für beliebige Prozesse, Router oder nft-Kontexte.

Einsatzmöglichkeiten jenseits von Telegram

Dieser Ansatz ist hochgradig anpassungsfähig: Ersetzen Sie ProcessName durch beliebige Programme (Discord, Zoom, Browser). Für mehrere Prozesse verwenden Sie ein Array von PIDs. Integrieren Sie statt SSH auch Webhooks mit externen Systemen. Testen Sie am besten in einer VM: Starten Sie die Ziel-App mit Traffic, überprüfen Sie die Logs und prüfen Sie die Ausgabe mit nft list set.

— Editorial Team

Advertisement 728x90

Weiterlesen