Wireguard è una VPN moderna e molto facile da configurare disponibile su più sistemi operativi. L'applicazione è disponibile nei repository ufficiali di Ubuntu 20.04, quindi è anche molto facile da installare. A differenza di altri software come OpenVPN che si basa sull'uso di certificati SSL, Wireguard si basa sull'uso di coppie di chiavi. In questo tutorial vedremo come configurare, in pochi semplici passaggi, un server VPN e un client peer sull'ultima versione stabile di Ubuntu.
In questo tutorial imparerai:
- Come installare Wireguard su Ubuntu 20.04 Focal Fossa
- Come creare una coppia di chiavi pubbliche e private
- Come configurare il server e un peer client
- Come reindirizzare tutto il traffico in entrata alla VPN
Requisiti e convenzioni software utilizzati
Categoria | Requisiti, convenzioni o versione del software utilizzata |
---|---|
Sistema | Ubuntu 20.04 Fossa focale |
Software | guardia metallica |
Altro | Privilegi di root |
Convenzioni | # – richiede che i comandi linux dati vengano eseguiti con i privilegi di root direttamente come utente root o usando sudo comando$ – richiede che i comandi linux dati vengano eseguiti come un normale utente non privilegiato |
Installazione
Wireguard è ufficialmente disponibile nel repository "universe" di Ubuntu 20.04, quindi possiamo installarlo tramite apt
. La versione disponibile, al momento della scrittura è 1.0.20200319-1ubuntu1
:
$ sudo apt install wireguard
Il sistema ci chiederà di confermare che vogliamo installare il programma e le sue dipendenze e completerà l'operazione in pochi secondi.
Generazione chiavi
Dobbiamo generare una chiave pubblica e una privata per ogni macchina che vogliamo utilizzare nella nostra VPN. La chiave privata deve essere tenuta segreta sulla macchina, quella pubblica serve per accedere alla macchina dagli altri peer.
Per generare le chiavi possiamo usare il wg
utilità. All'interno del file di configurazione di Wireguard dovremo fare riferimento alla chiave privata della macchina, mentre quella pubblica verrà utilizzata sugli altri peer. Si noti che faremo riferimento direttamente alle chiavi, quindi in teoria non è necessario archiviarle in file. Comunque lo faremo comunque, solo per comodità.
Per generare la chiave privata per il nostro server, dobbiamo utilizzare il genkey
sottocomando di wg
. Il comando restituisce la chiave creata a stdout
; per scrivere la chiave in un file possiamo usare il potere dei reindirizzamenti della shell:
$ wg genkey > server_private_key
Il comando genererà la chiave e la memorizzerà nella server_private_key
file, ma genererà il seguente avviso:
Warning: writing to world accessible file. Consider setting the umask to 077 and trying again.
Questo perché con l'utente predefinito umask (002
) i file vengono creati con la modalità 664
, quindi sono leggibili in tutto il mondo, il che non è raccomandato. Per risolvere questo problema possiamo cambiare la umask usata nella sessione della shell corrente prima di creare i file:
$ umask 077
Oppure modifica i permessi dei file su 600
dopo la creazione. Qui andremo per quest'ultima soluzione.
Una volta che la nostra chiave privata è pronta, possiamo generare il pubblico uno che si basa su di esso. Per portare a termine il compito utilizziamo la pubkey
sottocomando di wg
. Proprio come prima usiamo i reindirizzamenti della shell:prima di passare il contenuto della server_private_key
file nel stdin
del comando, quindi e per reindirizzare la chiave generata alla server_public_key
file:
$ wg pubkey < server_private_key > server_public_key
Per risparmiare qualche digitazione possiamo generare entrambe le chiavi, con un solo comando, che prevede l'uso della shell |
(pipe) e il tee
comando:
$ wg genkey | tee server_private_key | wg pubkey > server_public_key
L'output del comando sul lato sinistro dell'operatore pipe (|
) viene passato allo standard input del programma sul lato destro. La tee
command, invece ci permette di reindirizzare l'output di un comando sia a un file che allo standard output ( maggiori informazioni sui reindirizzamenti della shell qui).
Una volta che le nostre chiavi sono pronte possiamo creare il file di configurazione del server.
File di configurazione del server
Per configurare la nostra installazione di Wireguard, possiamo creare un file di configurazione chiamato wg0.conf
con il seguente contenuto:
[Interface] PrivateKey = <private key of the server (the content of the server_private_key file)> Address = 10.0.0.1/24 ListenPort = 51820
Nota che il nome del file è arbitrario, ma dovrebbe essere basato sul nome che useremo per la nostra interfaccia, wg0
in questo caso. A questo nome verrà fatto riferimento all'avvio del servizio, come vedremo di seguito.
Nel nostro esempio. il [interface]
sezione del file di configurazione contiene i seguenti campi:
- Chiave privata
- Indirizzo
- Porta di ascolto
La Chiave privata il valore del campo non è altro che la chiave privata del server che abbiamo generato in precedenza.
Nell'Indirizzo campo abbiamo specificato l'indirizzo da assegnare all'interfaccia nella VPN insieme alla subnet mask utilizzando il CIDR notazione. In questo caso abbiamo usato 10.0.0.1/24
, quindi il nostro indirizzo "server" Wireguard all'interno della VPN sarà 10.0.0.1
, che si trova nell'intervallo di indirizzi disponibile che va da 10.0.0.1
a 10.0.0.254
.
Infine, in ListenPort campo, abbiamo specificato su quale porta Wireguard ascolterà il traffico in entrata. Una regola per consentire detto traffico deve essere aggiunta anche al nostro firewall. Lo faremo nella prossima sezione.
Ora possiamo modificare i permessi dei file e spostarli in /etc/wireguard
directory:
$ chmod 600 server_public_key server_private_key wg0.conf $ sudo mv server_private_key server_public_key wg0.conf /etc/wireguard
Ora possiamo avviare il wg-quick
servizio specificando il nome dell'interfaccia Wireguard dopo @
nel nome dell'unità. Qual è questa notazione? È una caratteristica di systemd:con esso possiamo generare più file unit sulla base di uno “template”, passando il valore che verrà sostituito nel template, dopo il @
simbolo nel nome dell'unità. Questo è il contenuto del [email protected]
unità:
[Unit] Description=WireGuard via wg-quick(8) for %I After=network-online.target nss-lookup.target Wants=network-online.target nss-lookup.target Documentation=man:wg-quick(8) Documentation=man:wg(8) Documentation=https://www.wireguard.com/ Documentation=https://www.wireguard.com/quickstart/ Documentation=https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8 Documentation=https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8 [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/wg-quick up %i ExecStop=/usr/bin/wg-quick down %i Environment=WG_ENDPOINT_RESOLUTION_RETRIES=infinity [Install] WantedBy=multi-user.target
Il valore che specificheremo dopo il @
nel nome dell'unità all'avvio o all'arresto, sostituirà %i
nel ExecStart
e ExecStop
Linee. In questo caso useremo wg0
:
$ sudo systemctl enable --now wg-quick@wg0
Con il comando sopra abbiamo avviato il servizio e fatto in modo che venga avviato automaticamente all'avvio. Per verificare che la nostra configurazione sia stata applicata, possiamo eseguire il wg
comando. L'output prodotto dovrebbe visualizzare informazioni su wg0
interfaccia:
$ sudo wg interface: wg0 public key: nNx3Zpcv9D2dtgHDsoYGBNr64zG5jTJ4Z4T2sE759V4= private key: (hidden) listening port: 51820
Ora procediamo e configuriamo il nostro firewall e l'inoltro dei pacchetti.
Firewall e configurazione di rete
In questo tutorial assumerò l'uso di ufw
. Come abbiamo detto prima, dobbiamo aggiungere una regola per consentire il traffico in entrata attraverso la porta che abbiamo specificato nel file di configurazione, 51820
. Lo facciamo eseguendo un comando molto semplice:
$ sudo ufw allow 51820/udp
Dobbiamo anche consentire l'inoltro dei pacchetti sul nostro sistema. Per portare a termine il compito rimuoviamo il commento dalla riga 28
del /etc/sysctl.conf
file, in modo che assomigli a questo:
# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1
Per rendere effettive le modifiche senza riavviare il sistema, dobbiamo eseguire il seguente comando:
$ sudo sysctl -p
Nel passaggio successivo configureremo il client.
Generazione chiave client
Passiamo ora al sistema che vogliamo utilizzare come client. Abbiamo bisogno di installare Wireguard su di esso; una volta fatto, possiamo generare una coppia di chiavi proprio come abbiamo fatto sul server:
$ wg genkey | tee client_private_key | wg pubkey > client_public_key
Proprio come abbiamo fatto lato server, creiamo il wg0.conf
file di configurazione. Questa volta con questo contenuto:
[Interface] PrivateKey = <client_private_key> Address = 10.0.0.2/24 [Peer] PublicKey = <server_public_key> EndPoint = <server_public_ip>:51820 AllowedIPs = 0.0.0.0/0
Abbiamo già visto il significato dei campi contenuti nell'Interface
sezione, quando abbiamo generato la configurazione del server. Qui abbiamo appena adattato i valori al nostro client (avrà il 10.0.0.2
indirizzo nella VPN).
In questa configurazione, abbiamo utilizzato una nuova sezione, [Peer]
. In esso possiamo specificare le informazioni relative a un peer, in questo caso quello che utilizziamo come “server”. I campi che abbiamo utilizzato sono:
- Chiave pubblica
- Punto finale
- IP consentiti
Nella PublicKey campo, specifichiamo il pubblico chiave del peer, quindi, in questo caso, la chiave pubblica che abbiamo generato sul server.
L'Endpoint è l'indirizzo IP pubblico o il nome host del peer seguito da due punti e il numero di porta su cui il peer è in ascolto (nel nostro caso 51820
).
Infine, il valore è passato agli IP consentiti campo, è un elenco separato da virgole di indirizzi IP e subnet mask con notazione CIDR. Sarà consentito solo il traffico diretto al peer che proviene dagli indirizzi specificati. In questo caso abbiamo usato 0.0.0.0/0
come valore:funziona come valore "catch-all", quindi tutto il traffico verrà inviato al peer VPN (il server).
Proprio come abbiamo fatto lato server, impostiamo i permessi appropriati e spostiamo le chiavi e il file di configurazione in /etc/wireguard
directory:
$ chmod 600 client_public_key client_private_key wg0.conf $ sudo mv client_public_key client_private_key wg0.conf /etc/wireguard
Con il file di configurazione in atto, possiamo avviare il servizio:
$ sudo systemctl enable --now wg-quick@wg0
Infine, il [Peer]
sezione relativa al nostro client, deve essere aggiunta al file di configurazione che abbiamo precedentemente creato sul server . aggiungiamo il seguente contenuto:
[Peer] PublicKey = <public key of the client> AllowedIPs = 10.0.0.2/32
A questo punto riavviamo il servizio:
$ sudo systemctl restart wg-quick@wg0
Le informazioni sul peer associato dovrebbero ora essere riportate nell'output del wg
comando:
$ sudo wg interface: wg0 public key: nNx3Zpcv9D2dtgHDsoYGBNr64zG5jTJ4Z4T2sE759V4= private key: (hidden) listening port: 51820 peer: t5pKKg5/9fJKiU0lrNTahv6gvABcmCjQq5gF3BxwiDQ= allowed ips: 10.0.0.2/32
A questo punto, dal sistema "client", dovremmo essere in grado di eseguire il ping del server al 10.0.0.1
indirizzo:
$ ping -c 3 10.0.0.1 PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data. 64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=2.82 ms 64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=38.0 ms 64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=3.02 ms --- 10.0.0.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 2.819/14.613/37.999/16.536 ms
Conclusioni
In questo tutorial abbiamo visto come creare una VPN utilizzando Wireguard sull'ultima versione stabile di Ubuntu:20.04 Focal Fossa. Il software è davvero semplice da installare e configurare, soprattutto se paragonato ad altre soluzioni, come ad esempio OpenVpn.
Abbiamo visto come generare le chiavi pubbliche e private utilizzate per la nostra configurazione e come configurare sia il server che un client in modo che tutto il traffico venga reindirizzato alla VPN. Seguendo le istruzioni fornite, avrai una configurazione funzionante. Per ulteriori informazioni, dai un'occhiata alla pagina del progetto.