Vai al contenuto
GLGiuseppe Lanza Scrivimi

VPN IPsec site-to-site tra Cisco e Windows Server (RRAS)

Collegare una sede con Windows Server 2022 a un router Cisco IOS XE: RRAS con interfaccia IKEv2 a chiave condivisa, VTI sul Cisco, algoritmi allineati, rotte, firewall, verifiche e limiti di questa soluzione.

Sistemi: Cisco IOS XE · Windows Server 2022Livello: AvanzatoTempo: 60 minutiAggiornata: novembre 2026

Quando ha senso usare RRAS

Windows Server include il ruolo Accesso remoto, con il servizio Routing e Accesso remoto (RRAS). Oltre a fare da server VPN per gli utenti, RRAS può collegare due sedi con un’interfaccia di connessione su richiesta (demand-dial): un’interfaccia virtuale che apre un tunnel IKEv2 verso l’altra sede e ci instrada le reti remote.

È una soluzione utile in sedi piccole dove c’è già un Windows Server e non c’è un firewall in grado di fare VPN, oppure come collegamento temporaneo durante una migrazione.

Siamo onesti su RRAS

Per una sede importante un firewall o un router dedicato è quasi sempre la scelta migliore. RRAS si configura soprattutto da PowerShell, ha una diagnostica povera, mescola il ruolo di router con quello di server (aggiornamenti e riavvii fanno cadere la VPN) e Microsoft non lo sviluppa più attivamente. Usalo con consapevolezza e annota bene la configurazione.

Lo scenario

La sede A è la stessa delle altre guide della serie, con il router Cisco. La sede C ha un Windows Server 2022 con due schede di rete: una verso Internet e una verso la LAN, di cui fa da gateway.

LAN sede A 192.168.10.0/24 Router Cisco Gi0/0 198.51.100.1 Internet Windows Server WAN 192.0.2.10 LAN sede C 192.168.30.0/24 IPsec IKEv2 · chiave condivisa Tunnel2 (VTI) interfaccia S2S Gi0/1 .1 (gateway) LAN .1 (gateway)
Il router Cisco e Windows Server negoziano un tunnel IKEv2; ciascuno instrada verso il tunnel la LAN dell’altra sede.
ElementoSede A (Cisco)Sede C (Windows Server)
IP pubblico198.51.100.1 su Gi0/0192.0.2.10 sulla scheda WAN
LAN192.168.10.0/24, gateway .1 su Gi0/1192.168.30.0/24, gateway .1 sulla scheda LAN
Interfaccia VPNTunnel2 (VTI, ip unnumbered)interfaccia S2S “SedeA”

Scelta: VTI sul Cisco, non crypto map

L’interfaccia di RRAS è basata sul routing: si comporta come un’interfaccia di rete e le reti remote ci arrivano con delle rotte. Sul Cisco l’equivalente naturale è una VTI (tunnel mode ipsec ipv4), che negozia selettori di traffico “qualsiasi ↔ qualsiasi” e lascia decidere alle rotte. Con una crypto map dovresti far combaciare reti precise su entrambi i lati, cosa che RRAS gestisce male.

E se Windows Server è dietro NAT?

Funziona, grazie al NAT-T di IKEv2. Sul router della sede C inoltra le porte UDP 500 e 4500 verso l’indirizzo privato del server (per esempio 172.16.30.10). Sul Cisco la destinazione del tunnel resta l’IP pubblico 192.0.2.10, ma Windows si presenta con il proprio indirizzo privato come identità IKE: nel profilo IKEv2 del Cisco usa quindi match identity remote address 172.16.30.10 255.255.255.255. Le altre righe non cambiano.

Gli algoritmi da allineare

Come in ogni VPN IPsec, i due lati devono proporre gli stessi algoritmi. Su RRAS li fissi con la politica personalizzata (-CustomPolicy); senza, Windows propone una lista ampia che comprende anche algoritmi deboli.

ParametroWindows Server (RRAS)Cisco IOS XE
IKE – cifratura-EncryptionMethod AES256encryption aes-cbc-256
IKE – integrità e PRF-IntegrityCheckMethod SHA256integrity sha256
IKE – Diffie-Hellman-DHGroup ECP256group 19
ESP-CipherTransformConstants GCMAES256 e -AuthenticationTransformConstants GCMAES256esp-gcm 256
PFS al rinnovo-PfsGroup ECP256set pfs group19
Durata IKE SA-MMSALifeTimeSeconds 28800lifetime 28800
Durata IPsec SA-SALifeTimeSeconds 3600set security-association lifetime seconds 3600
Autenticazionechiave condivisa (PSKOnly)pre-share

Per IKE uso AES-CBC con SHA-256 perché il cmdlet di RRAS non accetta AES-GCM come cifratura IKE. Per ESP, dove passa il traffico vero, AES-GCM è supportato su entrambi i lati ed è la scelta migliore.

Windows Server: installare RRAS

Prima di tutto rinomina le schede di rete con nomi chiari: ti serviranno nei comandi e nella diagnostica.

PowerShell (amministratore)
Get-NetAdapter
Rename-NetAdapter -Name "Ethernet"   -NewName "WAN"
Rename-NetAdapter -Name "Ethernet 2" -NewName "LAN"

# ruolo Accesso remoto con le funzioni di routing
Install-WindowsFeature RemoteAccess -IncludeManagementTools
Install-WindowsFeature Routing -IncludeManagementTools -IncludeAllSubFeature

# configura RRAS per le VPN site-to-site
Install-RemoteAccess -VpnType VpnS2S

Install-RemoteAccess -VpnType VpnS2S avvia il servizio RRAS e abilita l’instradamento tra le interfacce. La scheda WAN non deve avere un gateway sulla LAN, e la scheda LAN non deve avere un gateway predefinito: il gateway predefinito sta solo sulla WAN.

Interfaccia grafica

Tutto ciò che segue si vede anche nella console rrasmgmt.msc, sotto Interfacce di rete. È comoda per controllare, ma alcune opzioni (la politica IPsec personalizzata in particolare) si impostano solo da PowerShell.

Windows Server: l’interfaccia verso la sede A

Genera una chiave condivisa lunga e casuale, per esempio con openssl rand -base64 32 su qualunque Linux, e usala identica sui due lati. Quella qui sotto è solo un esempio.

PowerShell (amministratore)
Add-VpnS2SInterface -Name "SedeA" `
    -Destination 198.51.100.1 `
    -Protocol IKEv2 `
    -AuthenticationMethod PSKOnly `
    -SharedSecret "Esempio-Da-Sostituire-Con-Una-Chiave-Lunga" `
    -IPv4Subnet "192.168.10.0/24:100" `
    -Persistent `
    -InitiateConfigPayload $false `
    -CustomPolicy `
    -EncryptionMethod AES256 `
    -IntegrityCheckMethod SHA256 `
    -DHGroup ECP256 `
    -CipherTransformConstants GCMAES256 `
    -AuthenticationTransformConstants GCMAES256 `
    -PfsGroup ECP256 `
    -MMSALifeTimeSeconds 28800 `
    -SALifeTimeSeconds 3600 `
    -PassThru

Connect-VpnS2SInterface -Name "SedeA"
  • -IPv4Subnet "192.168.10.0/24:100" crea una rotta verso la LAN A con metrica 100 attraverso questa interfaccia. Per più reti passa un elenco: @("192.168.10.0/24:100","10.10.10.0/24:100");
  • -Persistent tiene il tunnel sempre attivo, anche dopo un riavvio del servizio. Senza, RRAS lo aprirebbe solo quando c’è traffico;
  • -InitiateConfigPayload $false impedisce a Windows di chiedere al Cisco un indirizzo IP per l’interfaccia, come farebbe verso un altro server RRAS;
  • con la chiave condivisa RRAS associa le connessioni in arrivo all’interfaccia il cui -Destination coincide con l’IP del mittente: anche il Cisco può quindi avviare il tunnel.

Per cambiare un parametro in seguito usa Set-VpnS2SInterface con gli stessi nomi, per esempio:

Set-VpnS2SInterface -Name "SedeA" -SharedSecret "Nuova-Chiave-Lunga-E-Casuale"
Disconnect-VpnS2SInterface -Name "SedeA" -Force
Connect-VpnS2SInterface -Name "SedeA"

Il firewall di Windows

IKEv2 usa UDP 500 e, con il NAT, UDP 4500; senza NAT il traffico cifrato è ESP (protocollo IP 50). Autorizza solo il router della sede A, come spiegato nella guida Windows Server: firewall e protezione di base con PowerShell:

PowerShell (amministratore)
New-NetFirewallRule -DisplayName "VPN sede A - IKE" `
    -Direction Inbound -Protocol UDP -LocalPort 500,4500 `
    -RemoteAddress 198.51.100.1 -Action Allow -Profile Any

New-NetFirewallRule -DisplayName "VPN sede A - ESP" `
    -Direction Inbound -Protocol 50 `
    -RemoteAddress 198.51.100.1 -Action Allow -Profile Any

L’installazione di RRAS aggiunge già alcune regole proprie (gruppo “Routing e Accesso remoto”): controllale con Get-NetFirewallRule -DisplayGroup "Routing*" e disattiva quelle che non usi, come PPTP e L2TP. Il traffico instradato tra la LAN C e il tunnel non passa dalle regole del Windows Firewall, che filtrano solo il traffico diretto al server stesso.

Configurazione del router Cisco

Cisco IOS XE – configurazione
configure terminal
!
crypto ikev2 proposal PROP-SEDE-C
 encryption aes-cbc-256
 integrity sha256
 group 19
!
crypto ikev2 policy POL-SEDE-C
 match address local 198.51.100.1
 proposal PROP-SEDE-C
!
crypto ikev2 keyring KR-SEDE-C
 peer SEDE-C
  address 192.0.2.10
  pre-shared-key Esempio-Da-Sostituire-Con-Una-Chiave-Lunga
!
crypto ikev2 profile PROF-SEDE-C
 match identity remote address 192.0.2.10 255.255.255.255
 identity local address 198.51.100.1
 authentication remote pre-share
 authentication local pre-share
 keyring local KR-SEDE-C
 lifetime 28800
 dpd 10 5 on-demand
 no config-exchange request
!
crypto ipsec transform-set TS-SEDE-C esp-gcm 256
 mode tunnel
!
crypto ipsec profile IPSEC-SEDE-C
 set transform-set TS-SEDE-C
 set pfs group19
 set security-association lifetime seconds 3600
 set ikev2-profile PROF-SEDE-C
!
interface Tunnel2
 description VPN IPsec verso sede C (Windows Server RRAS)
 ip unnumbered GigabitEthernet0/1
 ip mtu 1400
 ip tcp adjust-mss 1360
 tunnel source GigabitEthernet0/0
 tunnel mode ipsec ipv4
 tunnel destination 192.0.2.10
 tunnel protection ipsec profile IPSEC-SEDE-C
!
ip route 192.168.30.0 255.255.255.0 Tunnel2
!
end
write memory
  • ip unnumbered evita di inventare una rete di transito: RRAS non assegna un indirizzo alla sua interfaccia S2S, quindi una /30 sul tunnel non servirebbe a nulla;
  • no config-exchange request è il corrispettivo di -InitiateConfigPayload $false: niente richieste di configurazione tra i due lati;
  • ip mtu 1400 e ip tcp adjust-mss 1360 lasciano spazio alle intestazioni ESP e NAT-T. Il Cisco corregge l’MSS dei SYN in entrambe le direzioni, quindi basta farlo qui.

Se sulla WAN hai una access list in ingresso, aggiungi:

Cisco IOS XE – access list WAN
ip access-list extended WAN-IN
 permit udp host 192.0.2.10 host 198.51.100.1 eq isakmp
 permit udp host 192.0.2.10 host 198.51.100.1 eq non500-isakmp
 permit esp host 192.0.2.10 host 198.51.100.1
E il NAT del Cisco?

Con una VTI il traffico verso 192.168.30.0/24 esce dall’interfaccia Tunnel2, non da quella esterna: il NAT overload verso Internet non lo tocca. Controlla comunque con show ip nat translations dopo i primi ping.

Rotte nelle due LAN

Le due rotte principali sono già a posto: ip route … Tunnel2 sul Cisco e -IPv4Subnet su RRAS. Restano i client:

  • nella sede C i PC devono usare Windows Server (192.168.30.1) come gateway. Se il gateway della LAN C è un altro router, aggiungi su quel router una rotta verso 192.168.10.0/24 via 192.168.30.1;
  • nella sede A i PC usano già il Cisco come gateway, che conosce la rotta verso il tunnel.

Se la sede A è collegata anche alla sede B (VPN IPsec tra Cisco e Ubuntu) e vuoi far parlare B e C passando per A, ti servono due modifiche:

  • su RRAS aggiungi 192.168.20.0/24 all’elenco -IPv4Subnet;
  • sul collegamento tra A e B aggiungi la rete 192.168.30.0/24: ai selettori di traffico se quel tunnel usa una crypto map, alle rotte se usa una VTI o GRE.

Il Cisco sa già raggiungere entrambe le sedi, quindi sulla Tunnel2 non serve altro.

Verifiche

Su Windows Server

Get-VpnS2SInterface -Name "SedeA" |
    Format-List Name, Destination, ConnectionState, LastError, IPv4Subnet

Get-NetRoute -DestinationPrefix 192.168.10.0/24
Test-NetConnection 192.168.10.1
Test-NetConnection 192.168.10.10 -Port 445

# eventi del servizio RRAS
Get-WinEvent -LogName System -MaxEvents 30 |
    Where-Object ProviderName -eq "RemoteAccess"

ConnectionState deve essere Connected e LastError pari a 0. Un valore diverso da zero è un codice di errore Windows: lo decodifichi con [ComponentModel.Win32Exception]13868 (sostituisci il numero).

Sul router Cisco

show crypto ikev2 sa detailed          ! stato READY, algoritmi negoziati
show crypto ipsec sa peer 192.0.2.10   ! contatori encaps/decaps in crescita
show interfaces Tunnel2                ! up/up
show ip route 192.168.30.0
ping 192.168.30.1 source GigabitEthernet0/1

Se il tunnel non sale, accendi il debug per pochi minuti e poi spegnilo:

debug crypto ikev2
debug crypto ikev2 error
! ... prova la connessione ...
undebug all

Problemi comuni

SintomoCausa probabileCosa fare
NO_PROPOSAL_CHOSEN nel debug del CiscoAlgoritmi non allineati, spesso perché -CustomPolicy non è stato applicatoControlla con Get-VpnS2SInterface -Name "SedeA" | Format-List * e confronta con la tabella degli algoritmi
Errore di autenticazione, AUTHENTICATION_FAILEDChiave condivisa diversa, oppure identità non corrispondenteReimposta la chiave su entrambi i lati; se Windows è dietro NAT, usa il suo IP privato in match identity remote
TS_UNACCEPTABLE o SA figlia rifiutataSelettori di traffico diversi da “qualsiasi”Verifica di usare la VTI e non una crypto map; con show crypto ikev2 sa detailed guarda quali reti propone Windows
Tunnel su, ma le LAN non si vedonoRotte mancanti o gateway dei client sbagliatoControlla la rotta su entrambi i lati e il gateway dei PC della sede C
Il tunnel cade e non si rialza da soloInterfaccia senza -Persistent, oppure servizio RRAS fermoGet-Service RemoteAccess; ricrea l’interfaccia con -Persistent; il Cisco può comunque riaprire il tunnel
Ping OK, condivisioni e siti bloccatiMTU/MSSVerifica ip tcp adjust-mss sulla Tunnel2; da un PC: ping -f -l 1372 192.168.10.10
Nessun pacchetto in arrivo su WindowsUDP 500/4500 bloccati dal provider o dal router davanti al serverCattura con pktmon sulla scheda WAN; controlla l’inoltro delle porte se il server è dietro NAT

Il passo successivo

Con questa guida la sede A è collegata sia alla sede B Linux sia alla sede C Windows. Se le sedi crescono, valuta un protocollo di routing dinamico sopra i tunnel, come visto in GRE su IPsec tra Cisco e Ubuntu: RRAS però non lo gestisce bene sulle interfacce S2S, ed è un’altra buona ragione per sostituirlo con un apparato dedicato quando la sede C diventa importante. Per dare accesso anche agli utenti remoti vedi Accesso remoto IKEv2: client Windows verso Ubuntu con strongSwan.

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.