Monitorování IP adres aplikací Windows prostřednictvím PowerShellu a nftables
Vývojáři a síťoví správci často řeší úkol sledování IP adres, ke kterým se aplikace připojují. Statické seznamy rychle zastarají kvůli regionálním rozdílům u CDN a změnám směrování. PowerShell skript umožňuje v reálném čase zachytávat spojení ve stavu Established, filtrovat veřejné IPv4 adresy a předávat je na router s OpenWRT pro přidání do nftables.
Skript monitoruje zadaný proces (ve výchozím nastavení Telegram), shromažďuje jedinečné hodnoty RemoteAddress z Get-NetTCPConnection, vyloučí soukromé rozsahy a známé DNS servery (8.8.8.8, 1.1.1.1) a poté přes SSH přidá IP adresy do nft setu. Tímto způsobem zajišťuje aktuální kontrolu provozu bez ručního zásahu.
Struktura a parametry skriptu
Skript přijímá klíčové parametry pro flexibilní konfiguraci:
ProcessName: název procesu k monitorování ("Telegram")OutputFile: soubor pro logování IP adres ("telegram_ips.txt")PollSeconds: interval dotazování spojení (3 sekundy)RouterHost,RouterUser: cíl SSH ("192.168.1.1", "root")NftFamily,NftTable,NftSet: kontext nftables ("inet", "fw4", "vpn_domains")UseTimeout: časové omezení prvků ("1h")SshKeyPath: cesta k SSH klíči
Logika používá HashSet pro odstranění duplikátů a ověřuje veřejnost IP adres pomocí bajtové analýzy.
Filtrace veřejných IPv4 adres
Funkce Test-PublicIPv4 vylučuje RFC1918, link-local, carrier-grade NAT a populární DNS servery:
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
}
Toto zabrání falešným aktivacím z lokálního provozu nebo rezolvrů.
Integrace s OpenWRT nftables
Funkce Add-IpToOpenWrt provede SSH příkaz pro dynamické přidání IP adresy do setu:
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
}
Volby -o BatchMode=yes a || true zajišťují bezpečný běh bez interakce. Prvky s timeoutem se automaticky vyčistí, minimalizuje tak údržbu.
Hlavní cyklus monitorování
V nekonečném cyklu:
Get-Process -Name $ProcessNamezíská PID.Get-NetTCPConnection | Where State -eq "Established" -and OwningProcess -eq $PIDextrahuje RemoteAddress.- Nové veřejné IP adresy se přidají do HashSetu, do souboru i do nftables.
Start-Sleep -Seconds $PollSeconds.
Celý cyklus trvá přibližně 3 sekundy, což vyváží reaktivitu a zatížení systému.
Co je důležité
- Dynamické sledování: zachytává aktuální IP adresy z reálných spojení, ignoruje zastaralé seznamy.
- Filtrace provozu: vylučuje soukromé rozsahy, DNS a loopback pro čistotu dat.
- Automatizace nftables: přímé SSH přidání do OpenWRT bez API nebo webového rozhraní.
- Odstranění duplikátů: HashSet zabrání opakování v souboru i v setu.
- Flexibilita: parametry pro jakýkoli proces, router a nft kontext.
Použití pro jiné úkoly
Přístup je univerzální: nahraďte ProcessName libovolným exe souborem (Discord, Zoom, prohlížeče). Pro více procesů použijte pole PID. Integrujte s jinými systémy přes webhook místo SSH. Testujte na virtuálních strojích: spusťte proces s provozem, ověřte logy a příkaz nft list set.
— Editorial Team
Zatím žádné komentáře.