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:
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.
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:
Get-Process -Name $ProcessNameobtiene el ID del proceso.Get-NetTCPConnection | Where State -eq "Established" -and OwningProcess -eq $PIDextrae los valores de RemoteAddress.- Nuevas IPs públicas se añaden al HashSet, al archivo de salida y a nftables.
Start-Sleep -Seconds $PollSecondspausa 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
Aún no hay comentarios.