Volver al inicio

Monitoreo PowerShell IP Windows nftables

El artículo describe un script de PowerShell para el monitoreo en tiempo real de direcciones IP de conexiones de aplicaciones Windows. Implementado filtrado de IPv4 pública, desduplicación y adición automática a nftables OpenWRT mediante SSH. El enfoque es adecuado para el control dinámico de tráfico.

Seguimiento de IP de aplicaciones: PowerShell + nftables
Advertisement 728x90

Monitorea las direcciones IP de aplicaciones de Windows con PowerShell y nftables

Desarrolladores y administradores de red a menudo necesitan rastrear las direcciones IP a las que se conectan las aplicaciones. Las listas estáticas de IPs se vuelven rápidamente obsoletas debido a variaciones regionales de CDNs y rutas de enrutamiento cambiantes. Este script de PowerShell captura en tiempo real las conexiones activas (Establecidas) de un proceso específico, filtra las direcciones IPv4 públicas y las envía a un router OpenWRT para su inserción dinámica en nftables.

El script monitorea un proceso definido (por defecto: Telegram), recopila valores únicos de RemoteAddress desde Get-NetTCPConnection, excluye rangos de IPs privadas y servidores DNS conocidos (8.8.8.8, 1.1.1.1), y luego utiliza SSH para añadir las IPs a un conjunto nft. Esto permite un control actualizado del tráfico sin intervención manual.

Estructura del script y parámetros

El script acepta parámetros clave para una configuración flexible:

Google AdInline article slot
  • ProcessName: nombre del proceso a monitorear (por ejemplo, "Telegram")
  • OutputFile: archivo de registro para IPs grabadas (por ejemplo, "telegram_ips.txt")
  • PollSeconds: intervalo de sondeo de conexiones (3 segundos)
  • RouterHost, RouterUser: destino SSH (por ejemplo, "192.168.1.1", "root")
  • NftFamily, NftTable, NftSet: contexto de nftables (por ejemplo, "inet", "fw4", "vpn_domains")
  • UseTimeout: elementos de tiempo de espera opcionales (por ejemplo, "1h")
  • SshKeyPath: ruta a la clave privada SSH

La lógica utiliza HashSet para eliminar duplicados y valida el estado de IP pública mediante comprobaciones a nivel de byte.

Filtrado de direcciones IPv4 públicas

La función Test-PublicIPv4 excluye direcciones RFC1918, locales de enlace, NAT de proveedores y direcciones DNS populares:

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
}

Esto evita falsos positivos provenientes del tráfico local y resolvers DNS.

Google AdInline article slot

Integración con nftables de OpenWRT

La función Add-IpToOpenWrt ejecuta un comando SSH para añadir dinámicamente IPs al conjunto 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
}

Opciones como -o BatchMode=yes y || true aseguran una ejecución no interactiva. Las entradas con tiempo de expiración se eliminan automáticamente, reduciendo la carga de mantenimiento.

Bucle principal de monitoreo

En un bucle infinito:

Google AdInline article slot
  • Get-Process -Name $ProcessName obtiene el ID del proceso.
  • Get-NetTCPConnection | Where State -eq "Established" -and OwningProcess -eq $PID extrae los valores de RemoteAddress.
  • Nuevas IPs públicas se añaden al HashSet, al archivo de salida y a nftables.
  • Start-Sleep -Seconds $PollSeconds pausa antes de la siguiente verificación.

El ciclo completo se ejecuta en ~3 segundos, equilibrando reactividad y carga del sistema.

Beneficios clave

  • Rastreo dinámico: Captura IPs en vivo desde conexiones reales, evitando listas estáticas desactualizadas.
  • Filtrado de tráfico: Excluye rangos privados, DNS y direcciones de bucle invertido para datos limpios.
  • Actualización automática de nftables: Integración directa por SSH con OpenWRT — sin API ni interfaz web necesaria.
  • Eliminación de duplicados: HashSet evita repeticiones en registros y conjuntos nft.
  • Flexibilidad: Configurable para cualquier proceso, router o contexto nft.

Casos de uso más allá de Telegram

Este enfoque es altamente adaptable: sustituye ProcessName por cualquier ejecutable (Discord, Zoom, navegadores). Para múltiples procesos, usa un array de PIDs. Integra con sistemas externos mediante webhook en lugar de SSH. Prueba en máquinas virtuales: ejecuta la app objetivo con tráfico, verifica los logs e inspecciona la salida con nft list set.

— Editorial Team

Advertisement 728x90

Leer después