Surveiller les adresses IP des applications Windows avec PowerShell et nftables
Les développeurs et administrateurs réseau doivent souvent suivre les adresses IP auxquelles les applications se connectent. Les listes statiques d'adresses IP deviennent rapidement obsolètes en raison des variations CDN régionales et des changements dans les itinéraires de routage. Ce script PowerShell capture en temps réel les connexions actives (Établies) d'un processus spécifique, filtre les adresses IPv4 publiques, puis les transmet à un routeur OpenWRT pour une insertion dynamique dans nftables.
Le script surveille un processus défini (par défaut : Telegram), collecte les valeurs uniques de RemoteAddress à partir de Get-NetTCPConnection, exclut les plages d'adresses privées et les serveurs DNS populaires (8.8.8.8, 1.1.1.1), puis utilise SSH pour ajouter les IP à un ensemble nft. Cela permet un contrôle du trafic à jour sans intervention manuelle.
Structure du script et paramètres
Le script accepte des paramètres clés pour une configuration flexible :
ProcessName: nom du processus à surveiller (ex. : "Telegram")OutputFile: fichier journal pour les IP enregistrées (ex. : "telegram_ips.txt")PollSeconds: intervalle de sondage des connexions (3 secondes)RouterHost,RouterUser: cible SSH (ex. : "192.168.1.1", "root")NftFamily,NftTable,NftSet: contexte nftables (ex. : "inet", "fw4", "vpn_domains")UseTimeout: éléments de délai optionnels (ex. : "1h")SshKeyPath: chemin vers la clé privée SSH
La logique utilise HashSet pour éviter les doublons et valide l'état d'adresse publique via des vérifications au niveau des octets.
Filtrage des adresses IPv4 publiques
La fonction Test-PublicIPv4 exclut les plages RFC1918, les adresses locales liées au lien, le NAT de niveau opérateur et les adresses DNS courantes :
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
}
Cela évite les faux positifs provenant du trafic local ou des résolveurs DNS.
Intégration avec nftables OpenWRT
La fonction Add-IpToOpenWrt exécute une commande SSH pour ajouter dynamiquement les IP à l’ensemble nft :
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
}
Des options comme -o BatchMode=yes et || true garantissent une exécution non interactive. Les entrées avec délai expirent automatiquement, réduisant ainsi la charge de maintenance.
Boucle principale de surveillance
Dans une boucle infinie :
Get-Process -Name $ProcessNamerécupère l’ID du processus.Get-NetTCPConnection | Where State -eq "Established" -and OwningProcess -eq $PIDextrait les valeurs RemoteAddress.- Les nouvelles IP publiques sont ajoutées au HashSet, au fichier journal et à nftables.
Start-Sleep -Seconds $PollSecondsmet en pause avant la prochaine vérification.
Le cycle complet s’exécute en environ 3 secondes — un bon équilibre entre réactivité et charge système.
Principaux avantages
- Suivi dynamique : capte les IP en direct depuis les connexions réelles, contournant les listes statiques périmées.
- Filtrage du trafic : exclut les plages privées, les DNS et les adresses de boucle locale pour des données propres.
- Mises à jour automatisées de nftables : intégration directe par SSH avec OpenWRT — pas besoin d’API ou d’interface web.
- Suppression des doublons : HashSet empêche les répétitions dans les logs et les ensembles nft.
- Flexibilité : configurables pour tout processus, routeur ou contexte nft.
Cas d’utilisation au-delà de Telegram
Cette approche est très adaptable : remplacez ProcessName par n’importe quel exécutable (Discord, Zoom, navigateurs). Pour plusieurs processus, utilisez un tableau d’ID de processus. Intégrez-le à des systèmes externes via webhook au lieu de SSH. Testez sur une machine virtuelle : lancez une application cible avec du trafic, vérifiez les logs, inspectez la sortie avec nft list set.
— Editorial Team
Aucun commentaire pour le moment.