Retour à l'accueil

Surveillance PowerShell IP Windows nftables

L'article décrit un script PowerShell pour la surveillance en temps réel des adresses IP des connexions d'applications Windows. Mise en œuvre du filtrage IPv4 public, déduplication et ajout automatique à nftables OpenWRT via SSH. L'approche convient au contrôle dynamique du trafic.

Suivi IP des applications : PowerShell + nftables
Advertisement 728x90

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 :

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

Google AdInline article slot

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 :

Google AdInline article slot
  • Get-Process -Name $ProcessName récupère l’ID du processus.
  • Get-NetTCPConnection | Where State -eq "Established" -and OwningProcess -eq $PID extrait les valeurs RemoteAddress.
  • Les nouvelles IP publiques sont ajoutées au HashSet, au fichier journal et à nftables.
  • Start-Sleep -Seconds $PollSeconds met 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

Advertisement 728x90

Lire ensuite