GNU/Linux >> Linux Esercitazione >  >> Ubuntu

Come creare una VPN su Ubuntu 20.04 usando Wireguard

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

Wireguard VPN su Ubuntu 20.04

Requisiti e convenzioni software utilizzati

Requisiti software e convenzioni della riga di comando Linux
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.


Ubuntu
  1. Come creare uno stack LAMP basato su una finestra mobile utilizzando la finestra mobile su Ubuntu 20.04

  2. Come configurare WireGuard VPN su Ubuntu 18.04

  3. Come configurare WireGuard VPN su Ubuntu 20.04

  4. Come configurare WireGuard VPN su Ubuntu (una guida passo passo)

  5. Come creare array RAID usando MDADM su Ubuntu

Come creare ed eseguire un programma C usando Ubuntu 20.04 LTS

Come configurare una VPN su Ubuntu

Come creare USB avviabile usando Ventoy su Ubuntu 21

Come creare un collegamento a una cartella in Ubuntu 18.04 utilizzando Gui?

Come configurare WireGuard VPN su Debian 11

Come configurare WireGuard VPN su Linux