VPN free o quasi con WireGuard e AWS Lightsail

Come creare un tunnel VPN con WireGuard e un'istanza creata su AWS Lightsail. Una guida passo passo per non dipendere da servizi VPN di terze parti e avere la possibilità di scegliere il Paese di uscita.

Le VPN commerciali hanno cominciato a diffondersi anche tra gli utenti italiani intorno al 2014-2015. Oggi è possibile scegliere tra i migliori servizi VPN che consentono di superare le censure, le restrizioni imposte per tramite della geolocalizzazione IP, di uscire in rete con un indirizzo IP diverso, anche di un altro Paese, proteggere i dati in transito e molto altro ancora. Le VPN free che funzionano bene e, per contro, non raccolgono dati personali dell’utente sono una rarità.

Un ricercatore indipendente, Michael Oliver, ha presentato una soluzione davvero convincente e soprattutto di semplice e immediata applicazione, che permette di creare un’infrastruttura VPN sul cloud. Servendosi di un’istanza creata su AWS (Amazon Web Services), piattaforma che mette a disposizione una vasta gamma di servizi di cloud computing, tra cui storage, elaborazione, database, analisi dei dati, intelligenza artificiale, sicurezza e molti altri, si può creare un tunnel VPN utile per uscire sulla rete Internet da un vasto numero di Paesi del mondo.

WireGuard: protocollo VPN ultraperformante

In altri articoli ci siamo soffermati su quanto incide la scelta del protocollo sulle prestazioni della VPN. Tanto.

WireGuard è un protocollo VPN leggero e sicuro che fu presentato nel 2016 da Jason A. Donenfeld. Da allora è diventato sempre più popolare grazie alla sua semplicità, efficienza e sicurezza. Chi è abituato a utilizzare, ad esempio, IPSec/L2TP o addirittura OpenVPN si stupisce ancora oggi della rapidità con cui viene stabilita la connessione VPN ricorrendo a WireGuard. Per questo motivo, nel giro di breve tempo, WireGuard è stato accolto nel kernel Linux da Linus Torvalds in persona (era il 2020) e in seguito si è parlato dell’integrazione di WireGuard con Windows.

Per fare qualche altro nome, WireGuard è alla base del funzionamento di Cloudflare WARP ed è ampiamente sfruttato anche dagli sviluppatori di Tailscale, anch’esso utile per realizzare una VPN distribuita.

WireGuard si serve della crittografia a chiave pubblica o asimmetrica per stabilire una connessione sicura tra due dispositivi. Utilizza una coppia di chiavi crittografiche, una pubblica e una privata, per crittografare e decifrare i dati scambiati tra i dispositivi. Il tunnel cifrato che viene allestito permette di trasferire dati senza che soggetti terzi possano monitorali, leggerli, modificarli o danneggiarli. I pacchetti inviati attraverso il tunnel sono crittografati con la chiave pubblica del destinatario e possono essere riportati in chiaro solo con la chiave privata corrispondente.

L’architettura di WireGuard è tipo peer-to-peer: ogni dispositivo connesso ha una sua identità e una coppia di chiavi crittografiche. In questo modo è possibile stabilire connessioni dirette tra i dispositivi senza dover passare attraverso un server centrale, migliorando l’efficienza e la velocità delle connessioni.

Cos’è AWS Lightsail

Nell’ambito del suo catalogo cloud davvero esteso, Amazon offre anche AWS Lightsail è un servizio di hosting gestito che offre una soluzione semplice e conveniente per ospitare applicazioni Web e siti Web. È progettato per semplificare il processo di creazione e gestione delle risorse di hosting, consentendo agli sviluppatori di concentrarsi sulla costruzione delle proprie applicazioni senza doversi preoccupare dell’infrastruttura sottostante.

AWS Lightsail permette di creare una propria istanza, accedervi via SSH o tramite il protocollo di accesso remoto predefinito, configurare le risorse. Ad esempio indirizzi IP statici, firewall, bilanciamento del carico e altri servizi AWS come database, servizi di storage e servizi di rete. Il servizio di Amazon offre anche gli strumenti per monitorare le prestazioni dell’applicazione.

Al posto di Lightsail è ovviamente possibile utilizzare altri servizi simili forniti da provider differenti. La configurazione di Lightsail si rivela tuttavia davvero semplice e immediata.

Creazione della VPN free: si parte con la configurazione del client WireGuard

Dalla pagina download di WireGuard è possibile scaricare e installare il client per il sistema operativo in uso. Il primo passo consiste nell’aggiungere un tunnel. L’applicazione restituisce di per sé la coppia di chiavi pubblica e privata. Il seguente è un esempio di configurazione che si può usare:

[Interface]
Address = 10.99.99.100/24
PrivateKey = <chiave privata>
DNS = 1.1.1.1

[Peer]
PublicKey = <chiave pubblica server VPN>
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = <indirizzo IP pubblico server VPN:PORTA>

Al posto di <indirizzo IP pubblico server VPN:PORTA> vanno specificati l’indirizzo IP pubblico dell’istanza creata su AWS seguito dalla porta corretta (la porta predefinita per WireGuard è 51820). Questo indica il punto finale del tunnel.

La stringa <chiave pubblica server VPN> va invece sostituita con la chiave privata del server VPN ottenuta eseguendo il codice riportato di seguito. Quanto visualizzato accanto a PrivateKey, invece, non va modificato perché si tratta della chiave privata WireGuard del dispositivo locale.

Configurazione di Lightsail

Oliver propone una serie di comandi perfettamente funzionanti da impartire in Lightsail. Le trovate nel suo articolo Quick VPN setup with AWS Lightsail and Wireguard al paragrafo LightSail setup. Qui ci limitiamo a commentare le istruzioni fornite che, una dopo l’altra, eseguono le seguenti operazioni:

  1. Impostazione di alcune variabili come il percorso del file contenente la chiave pubblica (`KEYPAIRFILE`), il nome del “portachiavi” (`KEYPAIRNAME`), il nome della macchina (`MACHINENAME`), il sistema operativo (`OS`), la porta (`PORT`) e la regione (`REGION`). La regione, che Oliver ha impostato su ap-south-1 ovvero Asia Pacifico (Mumbai), può essere personalizzata a proprio piacimento. Nella pagina di supporto Regioni e zone di disponibilità in Amazon Lightsail di AWS, si trova la lista completa.
  2. Caricamento del “portachiavi” nella console di AWS Lightsail utilizzando il comando aws lightsail import-key-pair.
  3. Selezione del bundle più economico con il comando aws lightsail get-bundles. Viene poi utilizzato per la creazione dell’istanza. In Lightsail, un bundle è una configurazione predefinita che comprende le specifiche di risorse (CPU, RAM, storage e larghezza di banda) per un’istanza. I bundle semplificano il processo di selezione delle risorse necessarie per ogni istanza da creare e consentono di scegliere rapidamente una configurazione adatta alle esigenze dell’utente.
  4. Creazione dell’istanza con il comando aws lightsail create-instances. Vengono specificati tutti i dati necessari.
  5. Lettura dell’indirizzo IP pubblico dell’istanza utilizzando il comando aws lightsail get-instance-access-details.
  6. Impostazione del firewall di Lightsail utilizzando il comando aws lightsail put-instance-public-ports. Definite due regole di apertura delle porte: una per la porta UDP 41194 e l’altra per la porta TCP 22 (SSH).
  7. Visualizzazione a schermo dell’indirizzo dell’istanza per consentire l’accesso tramite SSH.

Configurazione del server WireGuard: la VPN free è servita

Al paragrafo Wireguard Setup del documento condiviso da Oliver si trova il codice necessario per configurare WireGuard lato server sull’istanza Lightsail appena creata. Le operazioni richieste sono, in questo caso, le seguenti:

  1. Connessione al server tramite SSH utilizzando il comando `ssh` e l’indirizzo IP esterno (`$EXTERNALIP`) dell’istanza Lightsail.
  2. Aggiornamento del sistema operativo e installazione di WireGuard utilizzando i comandi sudo apt update -y && sudo apt install wireguard -y
  3. Creazione di una cartella `/etc/wireguard/` con le appropriate autorizzazioni utilizzando il comando mkdir -m 0700 /etc/wireguard/.
  4. Generazione di una chiave privata e di una chiave pubblica per WireGuard utilizzando il comando wg genkey | tee privatekey | wg pubkey > publickey. La chiave pubblica viene successivamente mostrata.
  5. Definizione di alcune variabili come l’interfaccia Ethernet (`ETHINT`), l’indirizzo IP del server WireGuard (`SRVRIP`), gli indirizzi IP consentiti (`ALLOWEDIPS`) e la chiave pubblica del peer WireGuard (`PEERPUBKEY`).
  6. Creazione di un file di configurazione WireGuard (`wg0.conf`) utilizzando il comando tee /etc/wireguard/wg0.conf. Questo file specifica l’indirizzo IP del server, la porta di ascolto, la chiave privata, le regole iptables per il NAT (Network Address Translation) e le informazioni sul peer, come la chiave pubblica e gli indirizzi IP consentiti.
  7. Abilitazione del traffico UDP sulla porta 41194 utilizzando il comando ufw allow 41194/udp.
  8. Configurazione della funzione IP forwarding utilizzando i comandi echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.d/10-wireguard.conf e echo 'net.ipv6.conf.all.forwarding=1' | sudo tee -a /etc/sysctl.d/10-wireguard.conf. Queste impostazioni consentono il routing dei pacchetti dati attraverso l’interfaccia WireGuard.
  9. Applicazione delle modifiche di configurazione utilizzando il comando sysctl -p /etc/sysctl.d/10-wireguard.conf.
  10. Abilitazione e avvio del servizio WireGuard con i comandi systemctl enable wg-quick@wg0 e systemctl start wg-quick@wg0.
  11. Verifica dello stato del servizio WireGuard con il comando systemctl status wg-quick@wg0 e visualizzazione delle informazioni sull’interfaccia WireGuard utilizzando i comandi wg e ip a show wg0.

AWS Lightsail si paga a consumo: spegnere l’istanza quando la VPN non serve

Può sembrare complicato, ma in realtà la configurazione fila liscia in pochi passaggi. E con qualche minuto di lavoro, è possibile uscire sulla rete Internet con un IP pubblico diverso da quello assegnato dal proprio provider Internet, in totale sicurezza. Inoltre, i server remoti rileveranno un indirizzo IP di un altro Paese, diverso dall’Italia.

Ciò che bisogna tenere presente, è che l’istanza Lightsail su AWS si paga a consumo, solo quando essa risulta in esecuzione. Come calcolato da Oliver, però, il costo è veramente minimo (0,007 dollari l’ora) e si ha il vantaggio di poter spegnere l’istanza quando non si ha necessità di usare la VPN.

Il comando seguente consente di arrestare l’istanza:

aws lightsail stop-instance --region ${REGION} --instance-name ${MACHINENAME}

Per eseguirla di nuovo si può invece usare:

aws lightsail start-instance --region ${REGION} --instance-name ${MACHINENAME}

Ti consigliamo anche

Link copiato negli appunti