Powrót do strony głównej

PowerShell monitorowanie IP Windows nftables

Artykuł opisuje skrypt PowerShell do monitorowania w czasie rzeczywistym adresów IP połączeń aplikacji Windows. Zaimplementowano filtrowanie publicznych IPv4, deduplikację i automatyczne dodawanie do nftables OpenWRT przez SSH. Podejście nadaje się do dynamicznej kontroli ruchu.

Śledzenie IP aplikacji: PowerShell + nftables
Advertisement 728x90

Monitorowanie adresów IP aplikacji Windows przez PowerShell i nftables

Programiści i administratorzy sieci często napotykają na potrzebę śledzenia adresów IP, do których się łączą aplikacje. Statyczne listy szybko się dezaktualizują z powodu różnic regionalnych CDN oraz zmian routingu. Skrypt PowerShell pozwala w czasie rzeczywistym przechwytywać połączenia Established dla procesu, filtrować publiczne adresy IPv4 i przekazywać je do routera OpenWRT w celu dodania do nftables.

Skrypt monitoruje określony proces (domyślnie Telegram), zbiera unikalne RemoteAddress z Get-NetTCPConnection, pomija zakresy prywatne i znane DNS (8.8.8.8, 1.1.1.1), a następnie za pomocą SSH dodaje IP do setu nftables. Zapewnia to aktualną kontrolę ruchu bez konieczności ręcznego interwencji.

Struktura i parametry skryptu

Skrypt akceptuje kluczowe parametry do elastycznej konfiguracji:

Google AdInline article slot
  • ProcessName: nazwa procesu do monitorowania ("Telegram")
  • OutputFile: plik do logowania IP ("telegram_ips.txt")
  • PollSeconds: interwał sprawdzania połączeń (3 sekundy)
  • RouterHost, RouterUser: cel SSH ("192.168.1.1", "root")
  • NftFamily, NftTable, NftSet: kontekst nftables ("inet", "fw4", "vpn_domains")
  • UseTimeout: elementy z timeoutem ("1h")
  • SshKeyPath: ścieżka do klucza SSH

Logika wykorzystuje HashSet do eliminacji duplikatów i sprawdza publiczność IP poprzez analizę bajtową.

Filtrowanie publicznych adresów IPv4

Funkcja Test-PublicIPv4 pomija RFC1918, link-local, Carrier-Grade NAT oraz popularne serwery DNS:

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
}

Zapobiega to fałszywym sygnałom od ruchu lokalnego i resolverów.

Google AdInline article slot

Integracja z nftables OpenWRT

Funkcja Add-IpToOpenWrt wykonuje polecenie SSH do dynamicznego dodania IP 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
}

Opcje -o BatchMode=yes i || true zapewniają nieblokujący uruchomienie. Elementy z timeoutem samoczynnie czyszczą się, minimalizując konserwację.

Główny cykl monitorowania

W nieskończonym cyklu:

Google AdInline article slot
  • Get-Process -Name $ProcessName pobiera PID.
  • Get-NetTCPConnection | Where State -eq "Established" -and OwningProcess -eq $PID wyodrębnia RemoteAddress.
  • Nowe publiczne IP są dodawane do HashSet, pliku i nftables.
  • Start-Sleep -Seconds $PollSeconds.

Pełny cykl trwa ok. 3 sekundy, balansując reaktywność i obciążenie.

Co jest ważne

  • Dynamiczne śledzenie: przechwytuje aktualne adresy z rzeczywistych połączeń, pomijając przestarzałe listy.
  • Filtrowanie ruchu: pomija zakresy prywatne, DNS i loopback dla czystości danych.
  • Automatyzacja nftables: bezpośredni SSH do dodania do OpenWRT bez API czy interfejsu webowego.
  • Deduplikacja: HashSet zapobiega duplikatom w pliku i zbiorze.
  • Elastyczność: parametry do dowolnego procesu, routera, kontekstu nft.

Zastosowanie do innych zadań

Podejście jest uniwersalne: zamień ProcessName na dowolny plik exe (Discord, Zoom, przeglądarki). Dla kilku procesów użyj tablicy PID. Zintegruj z innymi systemami przez webhook zamiast SSH. Testuj na maszynach wirtualnych: uruchom proces z ruchem, sprawdź logi i nft list set.

— Editorial Team

Advertisement 728x90

Czytaj dalej