Get-NetFirewallRule: auditar reglas del firewall de Windows

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 DisplayName

Esto 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 -AutoSize

En 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, Temp o Downloads
  • 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, DefaultOutboundAction

Lo 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 16384

El 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 UTF8

En 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