Zpět na domů

PowerShell monitorování IP Windows nftables

Článek popisuje PowerShell skript pro monitorování IP adres připojení aplikací Windows v reálném čase. Implementováno filtrování veřejných IPv4, deduplikace a automatické přidávání do nftables OpenWRT prostřednictvím SSH. Přístup je vhodný pro dynamickou kontrolu provozu.

Sledování IP aplikací: PowerShell + nftables
Advertisement 728x90

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:

Google AdInline article slot
  • 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ů.

Google AdInline article slot

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:

Google AdInline article slot
  • Get-Process -Name $ProcessName získá PID.
  • Get-NetTCPConnection | Where State -eq "Established" -and OwningProcess -eq $PID extrahuje 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

Advertisement 728x90

Číst dál