Una VPN site-to-site è una connessione sicura che collega due o più subnet geograficamente separate attraverso una rete pubblica, come Internet. A differenza di una VPN remote access, che consente a un singolo utente di accedere a una rete privata, una VPN site-to-site mette in comunicazione intere reti, permettendo ai dispositivi presenti in ciascuna sede di raggiungere le risorse dell’altra come se appartenessero alla stessa infrastruttura di rete.
Dal punto di vista del routing, ciascun gateway VPN conosce le sottoreti raggiungibili attraverso il tunnel e instrada esclusivamente il traffico destinato a tali reti. Tutto il restante traffico continua a utilizzare il gateway predefinito, salvo configurazioni specifiche di tipo full tunnel.
Nel caso illustrato in questa guida, l’obiettivo consiste nel realizzare una VPN site-to-site tra un server VPS e l’infrastruttura del proprio homelab, così da consentire al VPS di comunicare direttamente con Proxmox Backup Server (PBS) attraverso il tunnel WireGuard. In questo modo, le operazioni di backup avvengono su un canale privato e cifrato, senza esporre il servizio PBS su Internet.
Prerequisiti
Prima di intervenire su OPNsense, assicurarsi di disporre dei seguenti elementi:
- Un VPS con server WireGuard già configurato e testato, come descritto nell’articolo specifico
- L’IP pubblico del VPS e la porta WireGuard (solitamente
51820/UDP) - La chiave pubblica WireGuard del VPS
- La subnet del tunnel VPN, ad esempio
10.8.0.0/24 - Gli indirizzi IP del tunnel scelti:
10.8.0.1per il VPS,10.8.10.2per OPNsense
Si raccomanda di eseguire un backup della configurazione di OPNsense prima di apportare modifiche.
Nelle versioni 25.x e successive di OPNsense, WireGuard è integrato nativamente in OPNsense e non richiede l’installazione di componenti aggiuntivi. Nelle versioni precedenti, il supporto a WireGuard è fornito tramite il plugin os-wireguard, che deve essere installato da System > Firmware > Plugin, prima di poter configurare il servizio.
OPNsense
Abilitare WireGuard
Dal percorso VPN > WireGuard > Instances, abilitare WireGuard.
Creazione dell’istanza WireGuard
Da VPN > WireGuard > Instance > Add configurare i seguenti parametri:
- Enabled: Yes
- Name:
VPS-WG - Generare una nuova coppia di chiavi utilizzando l’icona dell’ingranaggio
- Tunnel Address:
10.8.0.2/24(indica l’indirizzo IP di OPNsense nel tunnel) - MTU:
1420per installazioni bare metal,1380se OPNsense è eseguito in ambiente virtualizzato (QEMU/KVM),1412se la connessione WAN utilizza PPPoE - Disable Routes: lasciare l’opzione disabilitata
Configurazione del peer WireGuard
Spostarsi al percorso VPN > WireGuard > Peer > Add:
- Enabled: Yes
- Name:
VPS - Public Key: chiave pubblica del server VPS
- Tunnel Address (AllowedIPs):
10.8.0.0/24,10.0.10.0/24,10.0.5.0/24 - Endpoint Address: indirizzo IP pubblico del VPS
- Endpoint Port:
51820 - Instances:
VPS-WG - Persistent Keepalive (in secondi):
25
Dopo aver salvato il peer, tornare nella configurazione dell’istanza VPS-WG e, nella sezione Peers, selezionare il peer VPS appena creato. Salvare la configurazione e applicare le modifiche.
L’obiettivo di questa configurazione non è instradare il traffico Internet della LAN attraverso il VPS, ma esclusivamente consentire a OPNsense di raggiungere il VPS attraverso il tunnel WireGuard. Il parametro AllowedIPs definisce infatti le subnet consentite attraverso il tunnel WireGuard.
Con questa configurazione:
- Il traffico destinato alla rete
10.8.0.0/24viene instradato attraverso l’interfaccia WireGuard - All’interno del tunnel, é consentito anche il traffico proveniente dalle reti
10.0.10.0/24(LAN) e10.0.5.0/24(MNG) - Tutto il restante traffico continua a utilizzare l’interfaccia WAN secondo la normale tabella di routing
L’utilizzo di 0.0.0.0/0 è invece previsto per configurazioni full tunnel, nelle quali tutto il traffico della LAN viene instradato attraverso il VPS, che diventa il gateway di uscita per il traffico proveniente dalla rete locale. Tale configurazione richiede ulteriori impostazioni e presenta una complessità significativamente maggiore.
Assegnazione dell’interfaccia WireGuard
Una volta completata la configurazione del tunnel, la comunicazione tra OPNsense e il VPS risulta già funzionante. Tuttavia, senza l’assegnazione di un’interfaccia dedicata, non è possibile applicare regole di firewall al traffico proveniente dal tunnel: in assenza di tale assegnazione, qualsiasi traffico inviato dal VPS verso la LAN viene bloccato automaticamente.
Da Interfaces > Assignments selezionare e assegnare l’interfaccia wg0.
Successivamente, abilitare la nuova interfaccia:
- Enable: Yes
- Description:
VPS_WG - IPv4 Configuration Type:
None
Salvare la configurazione e applicare le modifiche.
L’indirizzo IP del tunnel (10.8.0.2/24) è già configurato all’interno dell’istanza. Configurare nuovamente lo stesso indirizzo come Static IPv4 sull’interfaccia può generare conflitti o comportamenti anomali. L’assegnazione dell’interfaccia ha il solo scopo di consentire l’applicazione di regole firewall dedicate al traffico WireGuard.
Regole di firewall
Per consentire al VPS di accedere a un servizio presente nella LAN è necessario creare una regola dedicata. Nel nostro caso, l’obiettivo è consentire al VPS di raggiungere Proxmox Backup Server (10.0.5.5), così da permettere l’esecuzione dei backup mediante Proxmox Backup Client, secondo la procedura illustrata nel precedente articolo.
Da Firewall > Rules > VPS_WG
Creare una nuova regola con i seguenti parametri:
- Enabled: Yes
- Description:
Allow to PBS01 for BACKUP - Action: Pass
- Direction: In
- Protocol: TCP
- Sources:
wg0_VPSoppure10.8.0.1 - Destination:
PBS01oppure10.0.5.5 - Destination Port: 8007
Salvare la configurazione e applicare le modifiche. Questa regola consente esclusivamente l’accesso a PBS. Qualsiasi altro dispositivo, rimane inaccessibile dal tunnel WireGuard.
Di seguito alcune utili regole:
Normalization
In OPNsense, la funzionalità di normalization consente di modificare determinati parametri dei pacchetti IP prima che vengano elaborati dal firewall. Nel contesto di una VPN WireGuard, il principale impiego della normalizzazione consiste nell’applicazione del MSS clamping, una tecnica utilizzata per limitare il valore massimo del Maximum Segment Size (MSS) durante la negoziazione delle connessioni TCP.
L’obiettivo è prevenire problematiche legate alla frammentazione dei pacchetti e garantire il corretto funzionamento delle connessioni TCP attraverso il tunnel.
MTU e MSS
Per comprendere il funzionamento del MSS clamping è necessario distinguere tra i concetti di MTU (Maximum Transmission Unit) e MSS (Maximum Segment Size).
La MTU rappresenta la dimensione massima di un pacchetto IP che può essere trasmesso su un collegamento senza ricorrere alla frammentazione. L’MSS, invece, indica la quantità massima di dati applicativi contenuti in un segmento TCP, escludendo gli header IP e TCP.
Per il protocollo IPv4 la relazione è:
MSS = MTU − 40 byte
dove:
- 20 byte corrispondono all’header IPv4
- 20 byte corrispondono all’header TCP
Per IPv6 la relazione diventa:
MSS = MTU − 60 byte
poiché l’header IPv6 ha una dimensione di 40 byte.
L’impostazione di un valore MSS superiore non produrrebbe alcun beneficio, poiché consentirebbe la negoziazione di segmenti TCP potenzialmente incompatibili con la MTU effettiva del tunnel.
Ad esempio, un host con MTU pari a 1500 byte annuncia normalmente un MSS di 1460 byte. Qualora il traffico debba attraversare un tunnel WireGuard configurato con MTU pari a 1380 byte, OPNsense può riscrivere automaticamente il valore MSS a 1340 byte.
In questo modo gli endpoint negoziano una dimensione dei segmenti TCP compatibile con la MTU del tunnel, evitando la generazione di pacchetti eccessivamente grandi che potrebbero richiedere la frammentazione oppure essere scartati lungo il percorso.
Configurazione
Da Firewall > Settings > Normalization aggiungere una nuova regola di normalizzazione del traffico.
Una configurazione tipica solitamente prevede:
Interface: WireGuard (Group)
Direction: Any
Protocol: Any
Source: Any
Destination: Any
Max MSS IPv4: 1340
L’utilizzo di criteri più restrittivi non risulta generalmente necessario, poiché la regola viene applicata esclusivamente al traffico che attraversa l’interfaccia WireGuard.
VPS
Una volta completata la configurazione di OPNsense, il VPS deve essere configurato affinché possa raggiungere PBS attraverso il tunnel WireGuard.
Il server VPS deve conoscere la posizione della subnet 10.0.5.0/24: la modalità più semplice consiste nell’aggiungere la rete tra gli AllowedIPs del peer OPNsense all’interno del file /etc/wireguard/wg0.conf.
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <VPS_PRIVATE_KEY>
[Peer]
#opnsense
PublicKey = <OPNSENSE_PUBLIC_KEY>
AllowedIPs = 10.8.0.2/32, 10.0.5.5/32
L’inclusione dell’host 10.0.5.5/32 negli AllowedIPs indica a WireGuard che PBS è raggiungibile attraverso il peer OPNsense. In assenza di questa configurazione, il VPS non inoltrerà il traffico destinato al PBS nel tunnel.
Dopo aver modificato il file, riavviare WireGuard col comando systemctl restart wg-quick@wg0. Riavviare Wireguard anche da OPNsense:
Semplicemente, disabilitare l’istanza, applicare, riattivare l’istanza e riapplicare nuovamente le modifiche.
Verificare quindi la correttezza delle rotte:
ip route | grep wg0
default via 173.212.234.1 dev eth0 proto static
10.0.5.5 dev wg0 scope link
10.0.10.50 dev wg0 scope link
Dal VPS eseguire:
ping 10.8.0.2 -c 4
PING 10.8.0.2 (10.8.0.2) 56(84) bytes of data.
64 bytes from 10.8.0.2: icmp_seq=1 ttl=64 time=72.3 ms
64 bytes from 10.8.0.2: icmp_seq=2 ttl=64 time=50.8 ms
64 bytes from 10.8.0.2: icmp_seq=3 ttl=64 time=55.2 ms
64 bytes from 10.8.0.2: icmp_seq=4 ttl=64 time=68.8 ms
--- 10.8.0.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 50.807/61.780/72.289/8.978 ms
per verificare la raggiungibilità di OPNsense. E quindi:
ping 10.0.5.5 -c 4
PING 10.0.5.5 (10.0.5.5) 56(84) bytes of data.
64 bytes from 10.0.5.5: icmp_seq=1 ttl=63 time=67.0 ms
64 bytes from 10.0.5.5: icmp_seq=2 ttl=63 time=61.5 ms
64 bytes from 10.0.5.5: icmp_seq=3 ttl=63 time=59.2 ms
64 bytes from 10.0.5.5: icmp_seq=4 ttl=63 time=52.8 ms
--- 10.0.5.5 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 52.755/60.115/67.000/5.110 ms
per assicurasi che PBS sia correttamente raggiungibile. Una volta rimosse da PBS le vecchie configurazioni, disinstallato il pacchetto wireguard-tools e rimosso l’interfaccia wg0 (tramite il comando ip link delete wg0), il backup del VPS dovrebbe avviarsi correttamente.
Per completezza, nel file /etc/default/proxmox-backup , l’indirizzo di PBS deve essere corretto:
cat /etc/default/proxmox-backup
# PBS
PBS_REPOSITORY="vps-backup@pbs@10.0.5.5:pbs-usb-pool"