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.
| Elemento | Valore negli esempi |
|---|---|
| Server | SRV01, 10.10.20.10 |
| Rete di amministrazione | 10.10.99.0/24 |
| Reti interne | 10.10.0.0/16 |
| Dominio | corp.example.com |
Tutti i comandi vanno eseguiti in una finestra PowerShell come amministratore. Il modulo NetSecurity è già presente su Windows Server 2022 e 2025.
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.
| Profilo | Quando 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.
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.
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 16384LogBlocked Trueregistra i pacchetti scartati: è il primo posto dove guardare quando “non passa”.LogAllowedlo lasci aFalse: su un server trafficato riempie il file in pochi minuti. Attivalo solo durante una diagnosi.LogMaxSizeKilobytesarriva al massimo a 32767. Raggiunto il limite, il file viene rinominato inpfirewall.log.olde 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.
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:
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 /fFai 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:
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:
# 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
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
| Sintomo | Causa probabile | Cosa fare |
|---|---|---|
| Ti sei chiuso fuori da RDP | Regola RDP troppo stretta, disattivata o sul profilo sbagliato | Attendi 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 raggiungibile | Come sopra | Da un altro server: Invoke-Command -ComputerName SRV01 -ScriptBlock { Enable-NetFirewallRule -Name "RemoteDesktop-UserMode-In-TCP" } |
| La regola esiste ma il traffico non passa | La 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 Private | All’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 ignorate | Un GPO imposta “Applica regole firewall locali: No”, oppure una regola Block da GPO | Get-NetFirewallRule -PolicyStore ActiveStore -PolicyStoreSourceType GroupPolicy; gpresult /h C:\Temp\gpo.html; correggi il GPO, non il server |
| Le impostazioni dei profili tornano come prima | I profili sono gestiti da GPO: vince sulla configurazione locale | Confronta Get-NetFirewallProfile con Get-NetFirewallProfile -PolicyStore ActiveStore |
| Il ping non risponde nonostante la regola | Regola solo ICMPv4 e il client usa IPv6, o viceversa | Crea entrambe le regole oppure prova con ping -4 |
| Il file di log resta vuoto | LogBlocked attivo su un profilo diverso da quello in uso, oppure sovrascritto da GPO | Get-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.
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.