Vai al contenuto
GLGiuseppe Lanza Scrivimi

Windows Server: firewall e protezione di base con PowerShell

Configurare Windows Firewall da PowerShell su Windows Server: profili, regole mirate per RDP e servizi, log e backup, più RDP sicuro, SMBv1, aggiornamenti, Defender e blocco degli account.

Sistemi: Windows Server 2022 / 2025 · PowerShell 5.1Livello: IntermedioTempo: 40 minutiAggiornata: novembre 2026

Obiettivo e scenario

Windows Firewall è attivo per impostazione predefinita, ma su un server appena installato molte regole sono aperte a qualsiasi indirizzo. In questa guida lo configuri solo da PowerShell, in modo ripetibile e documentabile, e completi la protezione di base del server:

  • profili di rete con traffico in ingresso bloccato e log attivo;
  • regole mirate: RDP solo dalla rete di amministrazione, un servizio, il ping;
  • backup della configurazione e un paracadute contro gli errori;
  • RDP con NLA, SMBv1 disattivato, aggiornamenti, Microsoft Defender, blocco degli account.
ElementoValore negli esempi
ServerSRV01, 10.10.20.10
Rete di amministrazione10.10.99.0/24
Reti interne10.10.0.0/16
Dominiocorp.example.com

Tutti i comandi vanno eseguiti in una finestra PowerShell come amministratore. Il modulo NetSecurity è già presente su Windows Server 2022 e 2025.

Lavori su un server remoto?

Se sei collegato in RDP, una regola sbagliata ti chiude fuori. Prima di cominciare tieni a portata di mano la console fuori banda (hypervisor, iLO, iDRAC) e leggi la sezione Backup e paracadute.

I profili di rete

Windows applica regole e impostazioni in base al profilo della scheda di rete. Ogni scheda ha un solo profilo attivo; se il server ha più schede, possono essere attivi profili diversi contemporaneamente.

ProfiloQuando si applica
Domain (Dominio)Il server è membro di un dominio e da quella scheda raggiunge un domain controller. Lo decide Windows, non si imposta a mano.
Private (Privato)Rete considerata attendibile, scelta dall’amministratore. Tipico per server in workgroup su una LAN.
Public (Pubblico)Rete sconosciuta o non attendibile. È il profilo predefinito per una rete nuova.
# profilo attivo di ogni scheda
Get-NetConnectionProfile | Format-Table InterfaceAlias, Name, NetworkCategory

# stato dei tre profili del firewall
Get-NetFirewallProfile | Format-Table Name, Enabled, DefaultInboundAction, DefaultOutboundAction, LogBlocked, LogFileName

Il valore NotConfigured nelle azioni predefinite significa “usa il comportamento standard”: in ingresso blocca, in uscita consente.

Come viene valutato il traffico in ingresso Pacchetto TCP 3389 da 10.10.99.25 Profilo della scheda Dominio / Privato / Pubblico solo le regole di quel profilo 1. Regola Block? vince su ogni Allow 2. Regola Allow? porta, origine, programma 3. Nessuna regola vale il predefinito Bloccato log: DROP Consentito log: ALLOW Bloccato Inbound: Block
Il firewall considera solo le regole del profilo attivo sulla scheda. Una regola di blocco prevale su una di consenso; se nessuna regola corrisponde, decide l’azione predefinita del profilo.

Due conseguenze pratiche. Una regola creata solo per il profilo Domain non vale se la scheda finisce in Public. E una regola Block generica annulla le eccezioni Allow più specifiche: per chiudere “tutto tranne qualcosa” usa l’azione predefinita, non una regola di blocco.

Su un server in workgroup, se la scheda della LAN risulta Public, puoi portarla su Private:

Set-NetConnectionProfile -InterfaceAlias "Ethernet" -NetworkCategory Private

Impostare profili e log

Rendi esplicite le impostazioni su tutti e tre i profili: firewall attivo, ingresso bloccato salvo regole, uscita consentita, log dei pacchetti scartati.

PowerShell – impostazioni dei profili
Set-NetFirewallProfile -Profile Domain,Private,Public `
    -Enabled True `
    -DefaultInboundAction Block `
    -DefaultOutboundAction Allow `
    -NotifyOnListen False `
    -LogFileName '%SystemRoot%\System32\LogFiles\Firewall\pfirewall.log' `
    -LogBlocked True `
    -LogAllowed False `
    -LogMaxSizeKilobytes 16384
  • LogBlocked True registra i pacchetti scartati: è il primo posto dove guardare quando “non passa”.
  • LogAllowed lo lasci a False: su un server trafficato riempie il file in pochi minuti. Attivalo solo durante una diagnosi.
  • LogMaxSizeKilobytes arriva al massimo a 32767. Raggiunto il limite, il file viene rinominato in pfirewall.log.old e ricominciato.

Per leggere le ultime righe del log:

Get-Content "$env:SystemRoot\System32\LogFiles\Firewall\pfirewall.log" -Tail 30

Ogni riga riporta data, azione (DROP o ALLOW), protocollo, indirizzi e porte di origine e destinazione.

Il blocco in uscita

Bloccare anche il traffico in uscita (-DefaultOutboundAction Block) è più sicuro, ma richiede una regola per ogni servizio che il server contatta: DNS, aggiornamenti, antivirus, domain controller, backup. Fallo solo se hai inventariato tutto, altrimenti rompi funzioni in modo poco evidente.

Backup e paracadute

Esportare la configurazione

Prima di ogni modifica salva la configurazione completa (profili e regole) in un file .wfw:

New-Item -ItemType Directory -Path C:\Backup\Firewall -Force | Out-Null
netsh advfirewall export "C:\Backup\Firewall\fw-$(Get-Date -Format yyyyMMdd-HHmm).wfw"

Per ripristinarla, sostituendo l’intera configurazione locale:

netsh advfirewall import "C:\Backup\Firewall\fw-20261112-0930.wfw"

Per avere anche un elenco leggibile delle regole, utile per documentare o confrontare due server:

Get-NetFirewallRule | Select-Object Name, DisplayName, DisplayGroup, Enabled, Direction, Action, Profile |
    Export-Csv C:\Backup\Firewall\regole.csv -NoTypeInformation -Encoding UTF8

Il paracadute: ripristino automatico

Se lavori in RDP, programma un ripristino automatico prima di toccare le regole. Se ti chiudi fuori, dopo 10 minuti il server torna da solo alla configurazione salvata:

PowerShell – ripristino programmato
netsh advfirewall export C:\Backup\Firewall\fw-prima.wfw
$ora = (Get-Date).AddMinutes(10).ToString("HH:mm")
schtasks /create /tn "RipristinoFirewall" /tr "netsh advfirewall import C:\Backup\Firewall\fw-prima.wfw" /sc once /st $ora /ru SYSTEM /f

Fai le modifiche, apri una nuova connessione RDP per provarle e, se tutto funziona, cancella il ripristino:

schtasks /delete /tn "RipristinoFirewall" /f

Creare regole mirate

RDP solo dalla rete di amministrazione

Le regole predefinite di Desktop remoto accettano connessioni da qualsiasi indirizzo. Crea una regola più stretta, poi disattiva quelle predefinite:

PowerShell – RDP limitato
New-NetFirewallRule -Name "Admin-RDP-TCP" `
    -DisplayName "RDP - solo rete di amministrazione" `
    -Group "Amministrazione" `
    -Direction Inbound -Action Allow `
    -Protocol TCP -LocalPort 3389 `
    -RemoteAddress 10.10.99.0/24 `
    -Profile Domain,Private

New-NetFirewallRule -Name "Admin-RDP-UDP" `
    -DisplayName "RDP (UDP) - solo rete di amministrazione" `
    -Group "Amministrazione" `
    -Direction Inbound -Action Allow `
    -Protocol UDP -LocalPort 3389 `
    -RemoteAddress 10.10.99.0/24 `
    -Profile Domain,Private

# disattiva le regole predefinite (nomi interni, uguali in ogni lingua)
Disable-NetFirewallRule -Name "RemoteDesktop-UserMode-In-TCP", "RemoteDesktop-UserMode-In-UDP"

Uso il parametro -Name perché il nome interno non dipende dalla lingua del sistema; il DisplayName e il gruppo predefinito, invece, su un server in italiano sono tradotti. L’UDP serve a RDP per migliorare le prestazioni: se manca, la connessione funziona comunque su TCP.

Non ho incluso il profilo Public: se la scheda ci finisse per errore, RDP smetterebbe di funzionare. È voluto, ma tienilo presente quando leggi la tabella dei problemi.

Un servizio applicativo

Esempio: un sito HTTPS su IIS raggiungibile da tutte le reti interne.

New-NetFirewallRule -Name "App-HTTPS" `
    -DisplayName "HTTPS - reti interne" `
    -Group "Applicazioni" `
    -Direction Inbound -Action Allow `
    -Protocol TCP -LocalPort 443 `
    -RemoteAddress 10.10.0.0/16 `
    -Profile Domain,Private

Puoi indicare più porte (-LocalPort 80,443) o intervalli (-LocalPort 49152-65535), e legare la regola a un eseguibile con -Program "C:\Percorso\servizio.exe" o a un servizio con -Service NomeServizio.

Il ping (ICMP)

Rispondere al ping dalle reti interne aiuta il monitoraggio e la diagnosi:

New-NetFirewallRule -Name "Admin-ICMPv4-Echo" `
    -DisplayName "ICMPv4 Echo Request - reti interne" `
    -Group "Amministrazione" `
    -Direction Inbound -Action Allow `
    -Protocol ICMPv4 -IcmpType 8 `
    -RemoteAddress 10.10.0.0/16

New-NetFirewallRule -Name "Admin-ICMPv6-Echo" `
    -DisplayName "ICMPv6 Echo Request - reti interne" `
    -Group "Amministrazione" `
    -Direction Inbound -Action Allow `
    -Protocol ICMPv6 -IcmpType 128 `
    -RemoteAddress LocalSubnet

Senza -Profile la regola vale per tutti i profili. LocalSubnet è una parola chiave che indica le reti direttamente collegate alle schede del server.

Lavorare per gruppi

Il parametro -Group raccoglie le tue regole sotto un nome comune. Così le gestisci tutte insieme:

Get-NetFirewallRule -Group "Amministrazione"
Disable-NetFirewallRule -Group "Applicazioni"
Enable-NetFirewallRule -Group "Applicazioni"

# modificare una regola esistente: aggiungere una seconda rete
Set-NetFirewallRule -Name "Admin-RDP-TCP" -RemoteAddress 10.10.99.0/24, 10.10.98.0/24

Per le regole predefinite di Windows i gruppi hanno nomi tradotti; il parametro -DisplayGroup accetta il nome visualizzato nella lingua del sistema.

Verificare le regole

Get-NetFirewallRule mostra le proprietà generali; porte e indirizzi stanno in oggetti separati, i “filtri”, che si leggono con cmdlet dedicati.

# tutte le regole in ingresso attive che consentono traffico
Get-NetFirewallRule -Direction Inbound -Enabled True -Action Allow |
    Sort-Object DisplayName |
    Format-Table Name, DisplayName, Profile -AutoSize

# le tue regole con porte e indirizzi remoti
Get-NetFirewallRule -Group "Amministrazione" | Format-Table DisplayName, Enabled, Profile, Action,
    @{n='Porta';  e={($_ | Get-NetFirewallPortFilter).LocalPort}},
    @{n='Origine';e={($_ | Get-NetFirewallAddressFilter).RemoteAddress}} -AutoSize

# quali regole riguardano la porta 3389?
Get-NetFirewallPortFilter | Where-Object LocalPort -eq 3389 | Get-NetFirewallRule |
    Format-Table Name, DisplayName, Enabled, Action, Profile

Regole locali e regole da Criteri di gruppo

Per impostazione predefinita i cmdlet lavorano sulle regole locali. Se il server riceve regole da un GPO, quelle effettivamente in vigore si vedono nell’archivio ActiveStore:

# regole e profili effettivi, comprese quelle da GPO
Get-NetFirewallProfile -PolicyStore ActiveStore | Format-Table Name, Enabled, DefaultInboundAction
Get-NetFirewallRule -PolicyStore ActiveStore -PolicyStoreSourceType GroupPolicy |
    Format-Table DisplayName, Enabled, Action, Direction

Per provare una regola dalla rete di amministrazione, da un altro computer Windows:

Test-NetConnection 10.10.20.10 -Port 3389

RDP più sicuro

Network Level Authentication

Con NLA l’utente si autentica prima che il server crei la sessione grafica: chi non ha credenziali valide non arriva nemmeno alla schermata di accesso, e il server consuma meno risorse sotto attacco. È attiva per impostazione predefinita, ma conviene verificarla:

$rdp = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp'
(Get-ItemProperty $rdp).UserAuthentication        # 1 = NLA richiesta

# se vale 0, attivala
Set-ItemProperty -Path $rdp -Name UserAuthentication -Value 1

Per controllare se RDP è abilitato: fDenyTSConnections in HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server deve valere 0.

Limitare chi può accedere

Possono entrare in RDP gli amministratori locali e i membri del gruppo locale Remote Desktop Users. Il nome del gruppo è tradotto (“Utenti desktop remoto”), il suo SID no:

Get-LocalGroupMember -SID S-1-5-32-555
Add-LocalGroupMember -SID S-1-5-32-555 -Member "CORP\GG-Supporto-RDP"
Get-LocalGroupMember -SID S-1-5-32-544        # Administrators

Tieni il gruppo Administrators più piccolo possibile e assegna RDP tramite gruppi di dominio, non singoli utenti. In un dominio, il modo più pulito è un GPO che imposti i diritti utente Consenti accesso tramite Servizi Desktop remoto e Nega accesso tramite Servizi Desktop remoto (per esempio negandolo agli account di servizio).

Cambiare porta non è sicurezza

Spostare RDP dalla porta 3389 a un’altra riduce i tentativi automatici nei log, ma una scansione la trova in pochi secondi. La protezione vera è non esporre RDP su Internet: si raggiunge tramite VPN (vedi VPN IPsec tra Cisco e Windows Server e VPN IPsec tra Windows e Ubuntu) o un Remote Desktop Gateway, con la regola del firewall limitata alle reti di amministrazione come visto sopra.

SMBv1, aggiornamenti e Defender

Disattivare SMBv1

SMBv1 è il protocollo sfruttato da WannaCry e simili. Su Windows Server 2022 e 2025 non è installato per impostazione predefinita, ma su server aggiornati da versioni precedenti può esserci ancora. Verifica e disattiva:

Get-SmbServerConfiguration | Select-Object EnableSMB1Protocol, EnableSMB2Protocol
Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force

# rimuovere anche il componente (richiede un riavvio)
Get-WindowsFeature -Name FS-SMB1
Uninstall-WindowsFeature -Name FS-SMB1

Se temi che qualche vecchio apparato (scanner, NAS) lo usi ancora, prima di rimuoverlo attiva il controllo degli accessi SMBv1 e guarda il registro Microsoft-Windows-SMBServer/Audit per qualche giorno:

Set-SmbServerConfiguration -AuditSmb1Access $true -Force
Get-WinEvent -LogName Microsoft-Windows-SMBServer/Audit -MaxEvents 20

Controllare gli aggiornamenti

PowerShell 5.1 non ha cmdlet nativi per Windows Update, ma puoi leggere lo stato senza moduli esterni:

PowerShell – stato degli aggiornamenti
# ultimi aggiornamenti installati
Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 5 HotFixID, Description, InstalledOn

# data dell'ultima installazione riuscita
(New-Object -ComObject Microsoft.Update.AutoUpdate).Results.LastInstallationSuccessDate

# aggiornamenti disponibili non ancora installati
$ricerca = (New-Object -ComObject Microsoft.Update.Session).CreateUpdateSearcher()
$ricerca.Search("IsInstalled=0 and IsHidden=0").Updates | Select-Object Title

# riavvio in sospeso?
Test-Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired'

La ricerca degli aggiornamenti può richiedere qualche minuto. Per installarli da riga di comando usa sconfig (voce Install updates); in un’azienda, meglio WSUS o un sistema di gestione centralizzato.

Microsoft Defender

Su Windows Server 2022 e 2025 Microsoft Defender Antivirus è installato e attivo, salvo che tu abbia un altro antivirus. Controlla stato e firme:

Get-MpComputerStatus | Select-Object AMServiceEnabled, AntivirusEnabled, RealTimeProtectionEnabled,
    IsTamperProtected, AntivirusSignatureLastUpdated, AntivirusSignatureAge

Update-MpSignature
Start-MpScan -ScanType QuickScan
Get-MpThreatDetection          # minacce rilevate

AntivirusSignatureAge indica i giorni trascorsi dall’ultimo aggiornamento delle firme: oltre 1–2 giorni qualcosa non va (proxy, firewall in uscita, WSUS). Defender aggiunge da solo esclusioni automatiche per i ruoli del server, come Active Directory o DNS: non serve aggiungerle a mano.

Criteri di blocco degli account

Il blocco dell’account dopo un certo numero di password errate rende inutili gli attacchi a forza bruta su RDP e SMB. Per gli account locali di un server in workgroup o membro:

net accounts                                   # impostazioni attuali
net accounts /lockoutthreshold:5
net accounts /lockoutduration:15 /lockoutwindow:15
  • /lockoutthreshold:5: blocco dopo 5 tentativi errati;
  • /lockoutwindow:15: il contatore degli errori si azzera dopo 15 minuti;
  • /lockoutduration:15: l’account resta bloccato 15 minuti (0 significa “finché un amministratore non lo sblocca”). Non può essere inferiore alla finestra.

Imposta prima la soglia: con soglia 0 (blocco disattivato) le altre due opzioni non hanno effetto. Per gli account di dominio questi comandi non servono: vale il criterio del dominio, che si imposta nel Default Domain Policy oppure, da un domain controller:

Get-ADDefaultDomainPasswordPolicy
Set-ADDefaultDomainPasswordPolicy -Identity corp.example.com `
    -LockoutThreshold 5 -LockoutDuration 00:15:00 -LockoutObservationWindow 00:15:00
Soglia troppo bassa = blocchi a catena

Una soglia di 3 tentativi, con un servizio o un telefono che usa ancora una vecchia password, blocca l’account di continuo. Tra 5 e 10 è un buon compromesso. Le installazioni recenti di Windows possono avere già un blocco predefinito a 10 tentativi: controlla con net accounts prima di cambiare.

Problemi comuni

SintomoCausa probabileCosa fare
Ti sei chiuso fuori da RDPRegola RDP troppo stretta, disattivata o sul profilo sbagliatoAttendi il ripristino programmato, se l’hai creato. Altrimenti entra dalla console (hypervisor, iLO, iDRAC) e correggi: Set-NetFirewallRule -Name "Admin-RDP-TCP" -RemoteAddress …, oppure Enable-NetFirewallRule -Name "RemoteDesktop-UserMode-In-TCP", oppure netsh advfirewall import del backup
Fuori da RDP ma WinRM raggiungibileCome sopraDa un altro server: Invoke-Command -ComputerName SRV01 -ScriptBlock { Enable-NetFirewallRule -Name "RemoteDesktop-UserMode-In-TCP" }
La regola esiste ma il traffico non passaLa scheda ha un profilo diverso da quelli della regola (spesso Public invece di Domain)Get-NetConnectionProfile; aggiungi il profilo alla regola o correggi quello della scheda
Server di dominio con profilo Public o PrivateAll’avvio il domain controller non era raggiungibile (DNS, rete lenta)Controlla DNS e raggiungibilità del DC; Restart-Service NlaSvc -Force fa rivalutare la rete (può interrompere brevemente la connessione)
Le regole locali vengono ignorateUn GPO imposta “Applica regole firewall locali: No”, oppure una regola Block da GPOGet-NetFirewallRule -PolicyStore ActiveStore -PolicyStoreSourceType GroupPolicy; gpresult /h C:\Temp\gpo.html; correggi il GPO, non il server
Le impostazioni dei profili tornano come primaI profili sono gestiti da GPO: vince sulla configurazione localeConfronta Get-NetFirewallProfile con Get-NetFirewallProfile -PolicyStore ActiveStore
Il ping non risponde nonostante la regolaRegola solo ICMPv4 e il client usa IPv6, o viceversaCrea entrambe le regole oppure prova con ping -4
Il file di log resta vuotoLogBlocked attivo su un profilo diverso da quello in uso, oppure sovrascritto da GPOGet-NetFirewallProfile -PolicyStore ActiveStore | Format-Table Name, LogBlocked, LogFileName

Per lo stesso lavoro sui server Linux vedi Firewall completo con nftables e SSH sicuro su Linux.

Prima di andare in produzione

Prova sempre la configurazione in laboratorio, salva quella attuale prima di modificarla e tieni un accesso di emergenza (console o accesso fuori banda) quando lavori su firewall e VPN da remoto.