WireGuard, come creare un server VPN a casa o in azienda

Rispondi
Avatar utente
beatrice
co-admin
co-admin
Messaggi: 81
Iscritto il: lun mar 23, 2020 10:58 pm
Reactions score: 0
Contatta:
mag 2020 03 11:35

WireGuard, come creare un server VPN a casa o in azienda

Messaggio da beatrice

WireGuard è un protocollo e un programma opensource per approntare e gestire connessioni VPN. Il vantaggio di WireGuard, è che chiunque può configurare un server VPN in pochi minuti, indipendentemente dal dispositivo e dal sistema operativo utilizzati. Come si può verificare a questo indirizzo sono molteplici le piattaforme supportate da WireGuard.
Ciò significa, ad esempio, che è possibile trasformare agevolmente un Raspberry Pi in un server VPN compatto, silenzioso e sempre attivo.

WireGuard basa il suo funzionamento su appena 4.000 righe di codice contro le 120.000 di OpenVPN e l'algoritmo crittografico utilizzato contribuisce a migliorare significativamente le performance.
Il principale sviluppatore di WireGuard, Jason Donenfeld, ha infatti realizzato la sua API crittografica Zinc non apprezzando particolarmente il sottosistema crittografico integrato in Linux. Donenfeld, nonostante le ritrosie iniziali di una parte della comunità, sembra aver avuto ragione: Linus Torvalds ha infatti pubblicamente appoggiato l'idea tanto che a questo punto è altamente probabile che WireGuard possa divenire il nuovo standard adottato a livello di kernel Linux.

Supponendo di installare e configurare il server VPN WireGuard su Debian (i passaggi sono simili per l'installazione su Raspberry Pi), basti pensare che il software si installa in pochi semplici passaggi effettuabili da riga di comando.

In primis basta aggiornare l'installazione di Debian con i comandi che seguono da finestra del terminale:

su -
apt-get update
apt-get dist-upgrade

Successivamente basterà digitare ciò che segue per configurare il repository in cui si trova attualmente WireGuard e avviare l'installazione del programma:

echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable.list
printf 'Package: *\nPin: release a=unstable\nPin-Priority: 90\n' > /etc/apt/preferences.d/limit-unstable
apt update
apt install wireguard

Immagine

Se venisse installato un nuovo kernel, bisognerà assicurarsi di riavviare la macchina o il dispositivo successivamente all'installazione altrimenti il caricamento di WireGuard non andrà a buon fine.
WireGuard non fa ancora parte delle normali versioni di Debian quindi con il primo comando visto in precedenza si potrà aggiungere una ulteriore sorgente per l'installazione dei pacchetti. Il nome "unstable" indica già che WireGuard è destinato ad essere inserito nelle future versioni di Debian.

Il secondo comando visto in precedenza permette di istruire Debian così da installare i pacchetti dalla sorgente unstable solo se non disponibili nel ramo "stable".

Per automatizzare l'installazione di WireGuard sulle principali distribuzioni Linux, è possibile usare in alternativa questo script.

I passaggi seguenti consistono nel configurare l'intervallo di indirizzi IP utilizzati dalla VPN di WireGuard e assegnati ai dispositivi client di volta in volta connessi. Si può fare modificando il file di configurazione per l'interfaccia virtuale wg0 usata da WireGuard:

nano /etc/wireguard/wg0.conf

All'interno del file si potrà ad esempio inserire quanto segue premendo poi CTRL+O quindi CTRL+X:

[Interface]
Address = 10.66.66.1/24,fd42:42:42::1/64
ListenPort = 1194

Immagine

A questo punto si può generare la chiave privata che sarà utilizzata durante lo scambio dei dati tra client e server (e viceversa) durante l'utilizzo del tunnel crittografato:

wg genkey

La chiave così generata andrà copiata nel file di configurazione wg0.conf. Si otterrà quindi un file dal contenuto simile:

[Interface]
Address = 10.66.66.1/24,fd42:42:42::1/64
ListenPort = 1194
PrivateKey = incollare_chiave_privata

Alla riga di comando digitare quindi ls /sys/class/net per scoprire il nome dell'interfaccia di rete principale usata da Debian (nel nostro caso, enp0s3).

Aprire di nuovo il file di configurazione con il comando nano /etc/wireguard/wg0.conf e aggiungere:

PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o enp0s3 -j MASQUERADE

Al posto di enp0s3 sostituire eventualmente il nome corretto dell'interfaccia di rete.

Tutto qui. A questo punto, per avviare il server VPN di WireGuard basterà digitare il comando wg-quick up wg0.

Immagine

Per fare in modo che WireGuard si avvii al boot del dispositivo o della macchina, è sufficiente usare i seguenti due comandi:

systemctl start wg-quick@wg0
systemctl enable wg-quick@wg0

Lo stato del server WireGuard può essere verificato in qualunque momento digitando wg show o semplicemente wg.

Configurare WireGuard sui dispositivi client

Abbiamo già detto che WireGuard può essere installato su tantissimi dispositivi diversi, anche sugli smartphone Android e iOS (vedere questa pagina).

Supponiamo di volerci collegare a distanza al server WireGuard da un terminale Android, con la possibilità di navigare dall'IP pubblico della VPN e di accedere in sicurezza ai dispositivi connessi alla LAN.

Per procedere si dovrà innanzi tutto scaricare il client Android di WireGuard e installarlo sul dispositivo mobile.

Lato server bisognerà creare una configurazione per il dispositivo client:

1) Copiare la chiave pubblica del server digitando il comando wg show (Public key)
2) Generare una chiave privata per il client Android da configurare usando il comando wg genkey. Copiare anche tale chiave.
3) Creare un file di configurazione per il client Android: nano client.conf
4) Incollare nel file client.conf quanto segue:

[Interface]
PrivateKey = incollare_la_chiave_privata_generata_al_punto_2
Address = 10.66.66.2/24,fd42:42:42::2/64
[Peer]
PublicKey = incollare_la_chiave_pubblica_del_server
AllowedIPs = 10.66.66.1/32,fd42:42:42::1/128
Endpoint = incollare_IP_pubblico_del_server:1194

5) Salvare il file premendo CTRL+O quindi CTRL+X.

6) Installare il modulo per la generazione di codici QR a partire da file di testo:

apt install -y qrencode
qrencode -t ansiutf8 < client.conf

Immagine

7) Nell'app Android di WireGuard, toccare l'icona "+" in basso a destra, scegliere Create from QR code e inquadrare il codice QR generato su Debian. Verrà automaticamente configurato il profilo di connessione al server VPN.

Immagine

8) Lato server, digitare di nuovo nano /etc/wireguard/wg0.conf e aggiungere quanto segue:

[Peer]
PublicKey = incollare_IP_pubblico_visualizzato_sul_client_Android
AllowedIPs = 10.66.66.2/32,fd42:42:42::2/128

[color=#666666]9) A questo punto, modificando la configurazione di WireGuard lato client (icona raffigurante una piccola matita) e indicando 0.0.0.0/0, ::/0 nel campo Allowed IPs (sezione Peer) si potrà accedere a tutte le risorse condivise nella rete locale, attraverso il server VPN e navigare con l'IP pubblico del server remoto.[/color]

[color=#666666]Immagine[/color]

Costruisci una rete privata virtuale con Wireguard su fedora

Immagine


Wireguard è una nuova VPN progettata in sostituzione di IPSec e OpenVPN. Il suo obiettivo di progettazione è quello di essere semplice e sicuro e sfrutta le tecnologie più recenti come il Noise Protocol Framework . Alcuni considerano la facilità di configurazione di Wireguard simile a OpenSSH. Questo articolo mostra come distribuirlo e utilizzarlo.

È attualmente in fase di sviluppo attivo, quindi potrebbe non essere il migliore per le macchine di produzione. Tuttavia, Wireguard è in fase di studio per essere incluso nel kernel Linux. Il design è stato formalmente verificato , * e dimostrato di essere sicuro contro una serie di minacce.

Quando si distribuisce Wireguard, mantenere il sistema Fedora Linux aggiornato alla versione più recente, poiché Wireguard non ha una cadenza di rilascio stabile.

Imposta il fuso orario

Per controllare e impostare il fuso orario, visualizzare innanzitutto le informazioni sull'ora corrente:

timedatectl

Quindi, se necessario, impostare il fuso orario corretto, ad esempio Europa / Londra.

timedatectl set-timezone Europe / London

Si noti che l'orologio in tempo reale (RTC) del sistema potrebbe continuare a essere impostato su UTC o su un altro fuso orario.

Installa Wireguard

Per installare, abilitare il repository COPR per il progetto e quindi installare con dnf , usando sudo :

$ sudo dnf copr abilita jdoss / wireguard
$ sudo dnf installa wireguard-dkms wireguard-tools

Una volta installati, diventano disponibili due nuovi comandi, insieme al supporto per systemd:

  • wg : configurazione delle interfacce wireguard

  • wg-quick Visualizza i tunnel VPN

Creare la directory di configurazione per Wireguard e applicare un'umask di 077. Un'umask di 077 consente l'autorizzazione di lettura, scrittura ed esecuzione per il proprietario del file (root), ma vieta l'autorizzazione di lettura, scrittura ed esecuzione per tutti gli altri.

mkdir / etc / wireguard
cd / etc / wireguard
umask 077

Genera coppie chiave

Generare la chiave privata, quindi derivarne la chiave pubblica.

$ wg genkey> / etc / wireguard / privkey
$ wg pubkey </ etc / wireguard / privkey> / etc / wireguard / publickey

In alternativa, questo può essere fatto in una volta sola:

wg genkey | tee / etc / wireguard / privatekey | wg pubkey> / etc / wireguard / publickey

C'è un generatore di indirizzi vanity , che potrebbe essere di interesse per alcuni. Puoi anche generare una chiave precondivisa per fornire un livello di protezione quantistica:

wg genpsk> psk

Questo sarà lo stesso valore sia per il server che per il client, quindi è necessario eseguire il comando una sola volta.

Configurare il server e il client Wireguard

Sia il client che il server hanno un'opzione [Interfaccia] per specificare l'indirizzo IP assegnato all'interfaccia, insieme alle chiavi private.

Ogni peer (server e client) ha una sezione [Peer] contenente i rispettivi PublicKey , insieme a PresharedKey . Inoltre, questo blocco può elencare gli indirizzi IP consentiti che possono utilizzare il tunnel.

server

Una regola firewall viene aggiunta quando viene visualizzata l'interfaccia, insieme all'abilitazione del mascheramento. Assicurarsi di annotare l' intervallo di indirizzi / 24 IPv4 in Interface, che differisce dal client. Modificare il file /etc/wireguard/wg0.conf come segue, utilizzando l'indirizzo IP per il proprio server per Indirizzo e l'indirizzo IP del client in AllowIPs .

[Interfaccia]
Indirizzo = 192.168.2.1/24, fd00: 7 :: 1/48
PrivateKey = <SERVER_PRIVATE_KEY>
PostUp = firewall-cmd --zone = public --add-port 51820 / udp && firewall-cmd --zone = public --add-masquerade
PostDown = firewall-cmd --zone = public --remove-port 51820 / udp && firewall-cmd --zone = public --remove-masquerade
ListenPort = 51820

[Peer]
PublicKey = <CLIENT_PUBLIC_KEY>
PresharedKey = LpI + UivLx1ZqbzjyRaWR2rWN20tbBsOroNdNnjKLMQ =
IP consentiti = 192.168.2.2/32, fd00: 7 :: 2/48

Consentire l'inoltro di pacchetti IP aggiungendo quanto segue a /etc/sysctl.conf :

net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

Carica le nuove impostazioni:

$ sysctl -p

L'inoltro verrà conservato dopo il riavvio.

Cliente

Il client è molto simile alla configurazione del server, ma ha una voce aggiuntiva opzionale di PersistentKeepalive impostata su 30 secondi. Questo per evitare che NAT causi problemi e, a seconda della configurazione, potrebbe non essere necessario. L'impostazione di DPI consentiti su 0.0.0.0/0 inoltra tutto il traffico sul tunnel. Modificare il file /etc/wireguard/wg0.conf del client come segue, utilizzando l'indirizzo IP del client per Indirizzo e l'indirizzo IP del server sull'Endpoint .

[Interfaccia]
Indirizzo = 192.168.2.2/32, fd00: 7 :: 2/48
PrivateKey = <CLIENT_PRIVATE_KEY>

[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
PresharedKey = LpI + UivLx1ZqbzjyRaWR2rWN20tbBsOroNdNnjWKLM =
IP consentiti = 0.0.0.0/0, :: / 0

Endpoint = <SERVER_IP>: 51820
PersistentKeepalive = 30

Test Wireguard

Avvia e controlla lo stato del tunnel sia sul server che sul client:

$ systemctl start wg-quick @ wg0
$ systemctl status wg-quick @ wg0

Per verificare le connessioni, provare quanto segue:

ping google.com
ping6 ipv6.google.com

Quindi controlla gli indirizzi IP esterni:
dig + short myip.opendns.com @ resolver1.opendns.com
dig + short -6 myip.opendns.com aaaa @ resolver1.ipv6-sandbox.opendns.com


Rispondi