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:
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.
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:
Get-Process -Name $ProcessNamepobiera PID.Get-NetTCPConnection | Where State -eq "Established" -and OwningProcess -eq $PIDwyodrę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
Brak komentarzy.