Get-NetFirewallRule: auditar reglas del firewall de Windows

El Firewall de Windows suele quedar encendido y olvidado. Cada instalador que "pide permiso" crea una regla, y años después el equipo tiene cientos de excepciones que nadie revisó. Leer eso en el panel gráfico es un sufrimiento. En PowerShell, Get-NetFirewallRule convierte toda la lista en objetos que puedes filtrar y exportar en segundos.
Qué es Get-NetFirewallRule
Get-NetFirewallRule forma parte del módulo NetSecurity, que ya viene en Windows 10, Windows 11 y Windows Server. Lee las reglas del Firewall de Windows Defender con seguridad avanzada y devuelve cada una con propiedades como DisplayName, Enabled, Direction, Action y Profile. La documentación oficial está en Microsoft Learn.
Un detalle que sorprende a mucha gente: la regla en sí no muestra el puerto ni el programa. Esos datos están en "filtros" separados, que se consultan con cmdlets propios. Vamos a usar ambos.
Listar las reglas de entrada habilitadas
Abre PowerShell como administrador:
Get-NetFirewallRule -Direction Inbound -Enabled True -Action Allow |
Select-Object DisplayName, Profile |
Sort-Object DisplayNameEsto lista solo lo que importa para la superficie de ataque: reglas que permiten conexiones de entrada y están activas. Las reglas de salida y de bloqueo pueden esperar.
¿Cómo ver el puerto y el programa de cada regla?
Combina la regla con sus filtros: Get-NetFirewallPortFilter muestra protocolo y puerto, y Get-NetFirewallApplicationFilter muestra el ejecutable. Los filtros aceptan la regla por la canalización (pipeline).
Get-NetFirewallRule -Direction Inbound -Enabled True -Action Allow | ForEach-Object {
$porta = $_ | Get-NetFirewallPortFilter
$app = $_ | Get-NetFirewallApplicationFilter
[pscustomobject]@{
Regra = $_.DisplayName
Protocolo = $porta.Protocol
PortaLocal = $porta.LocalPort
Programa = $app.Program
}
} | Format-Table -AutoSizeEn un equipo doméstico, el resultado suele incluir reglas de Compartir archivos, Detección de redes y Escritorio remoto, además de programas como navegadores y juegos. Cada línea es un puerto que alguien en la misma red puede intentar alcanzar.
Señales de una regla sospechosa
Sin intentar adivinar malware por el nombre, estos patrones justifican una mirada más atenta:
- Programa en una carpeta de usuario — regla de entrada que apunta a
AppData,TempoDownloads - Puerto alto sin dueño conocido — cualquier puerto local que no puedas vincular a un software instalado
- Perfil "Any" o "Public" — regla de entrada abierta en redes públicas (cafés, aeropuertos)
- Nombre genérico o vacío — reglas llamadas "Allow", "Rule1" o similares
Para filtrar el primer caso:
Get-NetFirewallRule -Direction Inbound -Enabled True -Action Allow |
Where-Object { ($_ | Get-NetFirewallApplicationFilter).Program -like "*\Users\*" } |
Select-Object DisplayName, Profile¿Encontraste algo raro? Antes de borrar, deshabilítala y observa si algo deja de funcionar. Se deshace con un comando:
Disable-NetFirewallRule -DisplayName "Nombre de la regla"Usa Remove-NetFirewallRule solo cuando estés seguro. Y en un entorno corporativo, confirma si la regla viene de una directiva de grupo (GPO), porque puede volver sola.
Revisar los perfiles y el registro del firewall
El firewall tiene tres perfiles: Dominio, Privado y Público. Verifica que los tres estén encendidos y cuál es la acción de entrada predeterminada:
Get-NetFirewallProfile |
Select-Object Name, Enabled, DefaultInboundAction, DefaultOutboundActionLo esperado en una estación de trabajo es Enabled: True y DefaultInboundAction: Block en los tres. Si algún perfil aparece apagado, alguien (o algo) lo tocó — y conviene cruzarlo con lo que registró la auditoría de logs con PowerShell.
El registro de conexiones bloqueadas viene desactivado por defecto. Para activarlo:
Set-NetFirewallProfile -Profile Domain,Private,Public -LogBlocked True -LogMaxSizeKilobytes 16384El archivo queda, por defecto, en %systemroot%\system32\LogFiles\Firewall\pfirewall.log. Con él ves quién está golpeando puertos cerrados — útil después de proteger el RDP contra fuerza bruta.
Exportar un informe para comparar después
Una auditoría sin registro no sirve la segunda vez. Guarda un CSV hoy y compáralo el mes que viene:
$hoje = Get-Date -Format "yyyy-MM-dd"
Get-NetFirewallRule -Direction Inbound -Enabled True -Action Allow |
Select-Object DisplayName, Profile, Direction, Action |
Export-Csv "$env:USERPROFILE\Desktop\firewall-$hoje.csv" -NoTypeInformation -Encoding UTF8En la siguiente ronda, Compare-Object entre los dos CSV muestra exactamente qué reglas aparecieron o desaparecieron.
Una regla sin puerto abierto no vale nada por sí sola
Una regla de entrada solo importa si hay un programa escuchando en ese puerto. Por eso, cruza la lista del firewall con lo que está realmente abierto, usando Get-NetTCPConnection, y con los ejecutables de los servicios de Windows. Quien usa Linux aplica el mismo razonamiento con UFW en Ubuntu.
La lección mayor: el firewall es una política, no un producto. La regla más peligrosa es la que creaste "solo para probar" y nunca quitaste. Reserva diez minutos al mes para ejecutar este informe. Si quieres profundizar en los puertos, empieza por el post sobre puertos abiertos en Windows.




Comentarios