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:
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.
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:
Get-Process -Name $ProcessNameruft die Prozess-ID ab.Get-NetTCPConnection | Where State -eq "Established" -and OwningProcess -eq $PIDextrahiert RemoteAddress-Werte.- Neue öffentliche IPs werden dem HashSet hinzugefügt, in die Protokolldatei geschrieben und in nftables eingefügt.
Start-Sleep -Seconds $PollSecondspausiert 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
Noch keine Kommentare.