Configurare un server OpenVPN

ATTENZIONE! -La configurazione illustrata funziona con la versione Raspbian Strech che può essere scaricata dal link http://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2019-04-09/

A causa di una modifica del comando ifconfig, sostituito con ip, con l'ultima versione di Raspbian (Buster) non si riesce ad attivare la modalità bridge.

 

Grazie Nicholas, 2E0GKG, per aver individuato il problema.

Prerequisiti e materiale occorrente

Prima di partire con la configurazione del server è necessario assicurarsi di soddisfare una checklist abbastanza semplice.

 

Rete Domestica

1- Assicurarsi di avere un indirizzo IP pubblico (e fisso). In alternativa è necessario sottoscrivere un abbonamento ad uno dei servizi DNS come NO-IP o Dynamic DNS. E' opportuno verificare quale sia il provider DNS che è possibile configurare sul proprio router domestico. Questo requisito è imprescindibile perchè i client che si collegano alla nostra VPN dovranno avere un certificato legato all'indirizzo IP oppure al nome registrato sul server DNS.

 

2- Configurare il router domestico riducendo il pool di indirizzi disponibili per il server DHCP. Solitamente i router utilizzano lo spazio di indirizzi da 2 a 254. Per la nostra configurazione conviene ridurre lo spazio da 30 a 230 come si vede nella figura sottostante.

 

Ovviamente gli indirizzi IP vanno modificati tenendo conto della propria classe di rete (ad es. 192.168.1.X o 10.0.10.X, ecc.), ma per la nostra configurazione è importante considerare solo il quarto numero.

Nella mia intranet utilizzo i primi 30 per l'attribuzione di indirizzi IP fissi a determinati dispositivi della rete, ad esempio la radio ed il server Raspberry avranno un indirizzo IP fisso che non potrà essere usato dal server DHCP. In tal modo saremo sicuri che la radio ed il server Raspberry avranno sempre lo stesso indirizzo IP.

Il range di indirizzi IP che va da 231 a 254 sarà invece usato dal server OpenVPN per attribuire un indirizzo IP ai client che man mano si collegheranno alla nostra intranet attraverso la VPN.

3- Ora installiamo l'immagine Raspbian sulla SD del Raspberry. Vi consiglio di usare la versione lite che è leggerissima e richiede un tempo di avvio di pochi secondi.

E' importante che al termine dell'installazione sia eseguito e completato l'aggiornamento del sistema operativo. Esattamente come indicato nel video accanto.

Vi consiglio inoltre di cambiare la password dell'utente pi, di cambiare il nome host del Raspberry e di attivare il server ssh. Tutte e tre le operazioni si possono eseguire tramite l'utility raspi-config.


4- Perchè la connessione VPN sia veloce ed affidabile è opportuno collegare il Raspberry tramite il cavo ethernet, pertanto al termine dell'installazione è opportuno disabilitare la scheda wi-fi e la scheda bluetooth integrate.

 

Dalla shell Linux eseguire nell'ordine i seguenti comandi

 

echo "dtoverlay=pi3-disable-wifi" | sudo tee -a /boot/config.txt

echo "dtoverlay=pi3-disable-bt" | sudo tee -a /boot/config.txt

sudo cat /boot/config.txt

sudo systemctl disable hciuart

sudo reboot

 

Tale accorgimento ci permette di ridurre al minimo il consumo di energia. Nella mia installazione ad esempio, il RPI3 è alimentato attraverso una delle porte USB del router ed entrambi restano costantemente accesi.

5- Ora che il Raspberry è attivo e funzionante è necessario fare in modo che all'avvio acquisisca sempre lo stesso indirizzo IP. Per farlo è necessario intervenire sul router domestico ed utilizzare la funzione di Prenotazione Indirizzo (in alcuni casi si chiama Associazione DHCP).

L'operazione consiste nell'individuare attraverso il MAC address il dispositivo di rete che ci interessa , e poi assegnargli un indirizzo IP libero. Ricordiamo che, se abbiamo seguito le indicazioni del punto 2, abbiamo 30 indirizzi IP disponibili. Basta stare attenti a non utilizzarne uno già prenotato per un altro dispositivo.

E' utile precisare che il MAC address è una combinazione di 6 numeri esadecimali, separati da due punti, e che il MAC address di tutti i Raspberry inizia con B8:27:EB.

Di seguito è riportata la configurazione del mio RPI3

Terminata la configurazione assicurarsi di applicare le modifiche e di eseguire un riavvio del router. Quindi eseguite il riavvio del Raspberry ed assicuratevi che l'indirizzo IP sia lo stesso che avete prenotato nel vostro router.

Ora finalmente è possibile procedere con l'installazione del server OpenVPN.

Installazione del server OpenVPN

L'installazione del server OpenVPN non è un'operazione complicata. Come al solito qualcuno ha già pensato a semplificare quello che altrimenti sarebbe un lavoro abbastanza complesso.

Inoltre, avendo già predisposto l'ambiente nel modo corretto, dovremo semplicemente portare a termine il wizard di installazione intervenendo minimamente sulle opzioni che man mano ci vengono proposte. L'installazione di pivpn si avvia con il comando:

 

curl -L https://install.pivpn.io | bash

 

A questo punto vi consiglio di seguire il wizard di installazione dal link https://pimylifeup.com/raspberry-pi-vpn-server/ partendo direttamente dal punto 3.

Se per qualche ragione il link non dovesse funzionare mandatemi una mail perchè posso mandarvi una copia salvata dello stesso sito.

 

Vi lascio alcune note sui punti che potrebbero sembrare più complicati:

         5 - rispondere yes - gli indirizzi proposti vanno bene

         10 - rispondere yes

         11 - selezionare il protocollo UDP 

         12 - selezionare una porta possibilmente diversa da quella proposta. Dobbiamo ricordare il numero perchè in una fase successiva

                dovrete eseguira una configurazione sul router domestico usando proprio questo numero di porta.

         14 -  selezionare 2048

         17-18 - fate attenzione ad usare le impostazioni corrette in base al vostro nome di dominio o indirizzo IP.

                Se commettete un errore in questo punto la VPN non funzionerà.

 

A questo punto lo script impiegherà un po' di tempo per installare il server e per creare i certificati . Dovete attendere circa 15 minuti e poi riavviare il Raspberry.

 

Se qualcosa dovesse andare storto non preoccupatevi. Basta usare il comando sudo pivpn -u che esegue una rimozione completa del server OpenVpn consentendovi di ripartire di nuovo con l'installazione di pivpn.

6- Per rendere accessibile dall'esterno la nostra VPN è necessario tornare ancora una volta (l'ultima) sul router domestico. Quello che dovremo fare è attivare verso l'esterno la porta di ascolto di OpenVPN. Il numero è quello che abbiamo annotato al passo 12 del wizard di installazione. Inoltre dovremo configurare un port-forward tra router e Raspberry.

Sul router dovrete configurare qualcosa di simile alla figura sottostante.

Creazione degli utenti

Ora che il server è pronto è possibile creare gli utenti ed il relativo certificato. Il certificato è un piccolo file senza il quale il client non potrà accedere alla VPN.

Anche in questo caso l'operazione è molto semplice. Basta eseguire il comando

 

    sudo pivpn add

 

Vi verrà chiesto di indicare il nome utente e la password. Poi verrà creato un file con estensione .ovpn nella directory /home/pi/ovpn.

Se il nome utente è iw7dmh il file creato sarà iw7dmh.ovpn.

Il file ovpn contiene tutte le informazione che occorrono al client per stabilire una connessione alla nostra VPN. In esso sono contenuti anche i certificati che implementano la crittografia della connessione, rendendo impossibile per chiunque intercettare i dati che passano attraverso la rete. I certificati si attivano solo inserendo la password corretta nel momento in cui si avvia la connessione.

Poichè il file ovpn risiede nel filesystem del raspberry è necessario portarlo su una chiavetta o su un altro computer utilizzando un programma come Filezilla, che permette il trasferimento di file da e verso i sistemi Linux.

 

L'attivazione di una connessione client può essere fatta importando il file ovpn nel client OpenVPN adatto alla vostro sistema operativo. Non sono necessarie altre operazioni, ad eccezione di digitare la password dell'utente la prima volta che si attiva una connessione.  Per Windows è necessario installare una applicazione mentre Linux e Mac-Osx hanno già un loro client che supporta OpenVPN.

Configurazione del bridge - da TUN a TAP

L'installlazione che abbiamo appena completato ci permette di accedere all nostra intranet e di interagire con i dispositivi ad essa collegati. Il nostro client si collega in modo sicuro, ma il suo indirizzo IP appartiene ad un'altra classe di rete. Tale configurazione viene chiamata tunneling, e l'interfaccia virtuale creata da OpenVPN è denominata (non a caso) TUN. Benchè tale aspetto della connessione possa sembrare insignificante, di fatto presenta un grosso inconveniente: se il nostro client deve acquisire flussi di dati in streaming oppure deve indivduare altri dispositivi connessi, attraverso il protocollo UDP, non riesce a farlo. Semplificando il concetto (con qualche necessaria forzatura) , possiamo dire che attraverso un tunnel i pacchetti UDP (o in generale tutti i pacchetti non-IP) non vengono instradati. Questo rende impossibile l'uso di certi dispositivi come radio Flexradio, Playstation, ed altri ancora. 

Ora vedremo come con una modifica della configurazione al server OpenVPN, faremo in modo che il client della VPN acquisisca un indirizzo IP della nostra intranet rendendo finalmente possibile intercettare ed usare tutto il traffico presente nella intranet, pacchetti UDP inclusi.

Tecnicamente procederemo con l'installazione di un bridge ossia verrà creata una interfaccia di rete denominata TAP ed apporteremo una modifica al file ovpn obbligando il client ad usare l'interfaccai TAP invece di quella predefinita TUN. 

Prima di tutto installiamo il pacchetto software aggiuntivo che permette di implementare il bridge. Digitiamo il comando

 

sudo apt install bridge-utils

 

Ora modifichiamo i parametri indicati di seguito tenendo conto della nostra classe di rete

 

IP address of Raspberry Pi: 192.168.33.36   (indirizzo IP del Raspberry che abbiamo bloccato sul nostro router)
Netmask: 255.255.255.0                      (maschera di rete che rimane così com'è)
Broadcast address: 192.168.33.255           (le prime tre cifre sono quelle della nostra classe di rete, la quarta dev'essere 255)
Router's IP address: 192.168.33.1           (indirizzo IP del router - come sopra, ma la quarta dev'essere 1 o 254)

Il passo successivo consiste nel creare il file openvpn-bridge nella directory /etc/openvpn. Di solito è impossibile scrivere in questa directory, pertanto vi consiglio di preparare il file sul vostro PC, poi di copiarlo sul Raspberry nella home dell'utente pi e poi di spostarlo nella directory /etc/openvpn.

 

Copiate ed incollate il seguente codice

================================================================

#!/bin/sh

# Define Bridge Interface
br="br0"

# Define list of TAP interfaces to be bridged,
# for example tap="tap0 tap1 tap2".
tap="tap0"

# Define physical ethernet interface to be bridged
# with TAP interface(s) above.
eth="eth0"
eth_ip="192.168.33.36"
eth_netmask="255.255.255.0"
eth_broadcast="192.168.33.255"
eth_gateway="192.168.33.1"

case "$1" in
start)
for t in $tap; do
openvpn --mktun --dev $t
done

brctl addbr $br
brctl addif $br $eth

for t in $tap; do
brctl addif $br $t
done

for t in $tap; do
ifconfig $t 0.0.0.0 promisc up
done

sleep 10

ifconfig $eth 0.0.0.0 promisc up

sleep 5

ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast

sleep 2

route add default gw $eth_gateway
;;
stop)
ifconfig $br down
brctl delbr $br

for t in $tap; do
openvpn --rmtun --dev $t
done

ifconfig $eth $eth_ip netmask $eth_netmask broadcast $eth_broadcast

route add default gw $eth_gateway
;;
*)
echo "Usage: openvpn-bridge {start|stop}"
exit 1
;;
esac
exit 0
==============================================================

- Dopo aver spostato il file in /etc/openvpn rendiamolo eseguibile con il comando

chmod 744 /etc/openvpn/openvpn-bridge

- Modifichiamo il file del servizio

sudo nano /lib/systemd/system/openvpn@.service

- aggiungendo, dopo la linea "WorkingDirectory=/etc/openvpn", le due righe riportate di seguito

ExecStartPre=/etc/openvpn/openvpn-bridge start
ExecStopPost=/etc/openvpn/openvpn-bridge stop

- Dopo la modifica il file si presenterà cosi:

[Unit]
Description=OpenVPN connection to %i
PartOf=openvpn.service
ReloadPropagatedFrom=openvpn.service

[Service]
Type=forking
ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --config /etc/openvpn/%i.conf
ExecReload=/bin/kill -HUP $MAINPID
WorkingDirectory=/etc/openvpn
ExecStartPre=/etc/openvpn/openvpn-bridge start
ExecStopPost=/etc/openvpn/openvpn-bridge stop

[Install]
WantedBy=multi-user.target

 

- Modifichiamo il file /etc/openvpn/server.conf sostituendo l'interfaccia TUN con quella TAP

...
port 6666
proto udp
dev tap0
ca /etc/openvpn/easy-rsa/pki/ca.crt
...

- Sempre nel file /etc/openvpn/server.conf commentiamo la riga

 

#server 10.8.0.0 255.255.255.0

 

- ed aggiungiamo la nuova riga che fa avviare il bridge


server-bridge 192.168.0.1 255.255.255.0 192.168.0.231 192.168.0.254

 

In rosso è evidenziato l'indirizzo del gateway, coincidente con quello del router, in verde la maschera di rete ed in blu l'intervallo di indirizzi IP che verranno assegnati ai client della VPN. Come si vede, ora gli indirizzi sono della stessa classe della nostra rete, mentre gateway e subnet mask garantiranno l'accesso all'intera rete. 

 

Ora è sufficiente salvare e riavviare Raspberry.

L'ultima modifica da compiere riguarda il file ovpn.

Anche qui, con un editor di testo, dovremo aprire il file e modificare la riga 2 sostituendo l'interfvaccia TUN con quella TAP.

Ora il client potrà accedere alla vostra VPN ed usare la rete come se fosse fisicamente presente.

 

Fino ad ora non ho trovato soluzioni più semplici, versatili ed a buon mercato di questa. Considerate inoltre che OpenVPN è universalmente supportato da tutti i sistemi operativi e questo è un grossissomo punto a favore, soprattutto considerando che il client EESDR è disponibile per Windows, Linux, Mac.