Torino ITA)
+39 01119115797
info@netpic.it

WIREGUARD: nuova VPN su Linux

WIREGUARD: nuova VPN su Linux

Una nuova VPN per Linux

WireGuard è un software gratuito per la creazione di reti virtuali private (VPN). Ne abbiamo parlato in diversi altri articoli, utilizzando una VPN, possiamo attivare un tunnel virtuale tra due dispositivi e la connessione di rete attraversa il tunnel come se i dispositivi fossero collegati direttamente tra loro. Inoltre i dati che passano nel tunnel possono venire cifrati, proteggendo di fatto le connessioni.. Aziende pubbliche e private utilizzano da tempo le VPN poiché permettono di gestire l’accesso a determinate risorse della rete dall’esterno e consentire agli utenti al di fuori dell’azienda, ad esempio sin smart working di continua re a lavorare come se fossero all’interno della rete aziendale.

WireGuard è sia un’applicazione  che un protocollo di rete per la creazione di tunnel VPN criptati. Il software è distribuito con licenza GPLv2 ed è disponibile su diversepiattaforme. E’ scritto nei linguaggi “C” e “Go” e funziona con Windows, MacOS, BSD, iOS e Android.

Dal 2020, WireGuard ha subito un nuovo step ed è stato integrato direttamente nel kernel Linux. Vista l’estrema diffusione di Linux, soprattutto in ambiente server, Wireguard si trova a disposizione un network di miliardi di host a cui potersi collegare in modo sicuro. Il suo utilizzo su larga scala è dovuto anche alla leggerezza del software  ed alle poche risorse hardware richieste..

Ma come funziona Wireguard?

WireGuard è un protocollo VPN peer-to-peer decentralizzato,  in pratica non ha bisogno di utilizzare un server, infatti, permette di aprire un tunnel direttamente tra due dispositivi. Possiamo dire che un “server” WireGuard è semplicemente un host su cui sono memorizzate le configurazioni di connessione per diversi dispositivi.

Il procedimento per stabilire una connessione con WireGuard è simile al protocollo (SSH),: con WireGuard gli utenti definiti “peers”, creano chiavi pubbliche che scambiano tra loro e usano per autenticarsi a vicenda e crittografare i pacchetti scambiati.

Installazione e utilizzo di WireGuard (server VPN)

Per installare WireGuard sul nostro sistema Ubuntu Linux possiamo usare questi comandi:

Per Ubuntu a partire dalla versione 19.10

# apt install wireguard

Per le versioni Ubuntu precedenti alla 19.10

# add-apt-repository ppa:wireguard/wireguard
# apt-get update sudo apt-get install wireguard

Generiamo le chiavi per il server

# umask 077
# wg genkey | tee server_private_key | wg pubkey > server_public_key

Abilitiamo il routing attraverso il server VPN

#Enable IPv4 Forwarding
net.ipv4.ip_forward=1
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -p

Configuriamo l’interfaccia del server

# nano /etc/wireguard/wg0.conf
[Interface]
Address = 10.1.1.2/32
SaveConfig = true
ListenPort = 35263
FwMark = 0xca6c
PrivateKey = uAQVaKOlJk05T4sKkQEZ6X+EYDgKVyqqbjx421j6e04=

[Peer]
PublicKey = CaL/uj8WtR41VKP9cdhFQq97O+ExOmZHADcBrUy/xWw=
AllowedIPs = 10.1.1.0/24, 192.168.1.0/24
Endpoint = X.Y.Z.K:51820
PersistentKeepalive = 25
Attenzione!!
  • L’Endpoint è l’indirizzo IP del nodo WireGuard remoto a cui vogliamo connetterci
  • La Privatekey resta sul dispositivo su cui è stata creata, mentre al Publickey va scambiata.

Generiamo le chiavi per il client

# umask 077
# wg genkey | tee client_private_key | wg pubkey > client_public_key
Attenzione!!
  • L’Endpoint è l’indirizzo IP del nodo WireGuard remoto a cui vogliamo connetterci
  • La Privatekey resta sul dispositivo su cui è stata creata, mentre al Publickey va scambiata.

Configuriamo l’interfaccia del client

# nano /etc/wireguard/wg0.conf
[Interface]
Address = 10.1.1.1/24
SaveConfig = true
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens36 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens36 -j MASQUERADE
ListenPort = 51820
FwMark = 0xca6c
PrivateKey = +OZrX/SZpIIyx8lRIDn5BX5VmGwnHMwZGR11LctvAVI=

[Peer]
PublicKey = RfRvlNw/VH2UONpvoaF5CcFeyJn+K5ZAWGXk9jLD0FA=
AllowedIPs = 10.1.1.2/32, 192.168.2.0/24
Endpoint = X.Y.Z.K:35263

Avviamo WireGuard su entrambi i dispositivi

# chown -v root:root /etc/wireguard/wg0.conf
# chmod -v 600 /etc/wireguard/wg0.conf
# wg-quick up wg0
# systemctl enable wg-quick@wg0.service
# ifcondfig wg0

wg0: flags=209<UP,POINTOPOINT,RUNNING,NOARP> mtu 1420
inet 10.1.1.2 netmask 255.255.255.255 destination 10.200.200.2
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 1000 (UNSPEC)
RX packets 1722042 bytes 758518560 (758.5 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1161085 bytes 94546176 (94.5 MB)
TX errors 0 dropped 73 overruns 0 carrier 0 collisions 0

Configuriamo il firewall 

# iptables -A INPUT -p udp -m udp --dport 51820 -j ACCEPT
# iptables -A OUTPUT -p udp -m udp --sport 51820 -j ACCEPT
oppure
#ufw allow 51820/udp
oppure
# firewall-cmd --add-port=51820/udp --permanent
# firewall-cmd --reload
Per visualizzare lo stato dell’interfaccia:
# wg show
interface: wg0
public key: CaL/uj8WtR41VKP9cdhFQq97O+ExOmZHADcBrUy/xWw=
private key: (hidden)
listening port: 51820
fwmark: 0xca6c

peer: RfRvlNw/VH2UONpvoaF5CcFeyJn+K5ZAWGXk9jLD0FA=
endpoint: x.Y.Z.K:35263
allowed ips: 10.1.1.2/32
latest handshake: 1 minute, 36 seconds ago
transfer: 85.83 MiB received, 719.29 MiB sent

Testiamo il tunnel

Per prima cosa proviamo a mandare un ping al nodo remoto del tunnel

# ping 10.1.1.1
PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.
64 bytes from 10.1.1.1: icmp_seq=1 ttl=64 time=15.3 ms
64 bytes from 10.1.1.1: icmp_seq=2 ttl=64 time=14.6 ms
64 bytes from 10.1.1.1: icmp_seq=3 ttl=64 time=14.9 ms
^C
--- 10.1.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms

Se tutto è stato configurato correttamente, ivi comprese le regole di abilitazione del routing ed il firewalling potremo raggiungere anche gli host alle spalle del nodo vpn remoto, che nel nostro caso è la rete 192.168.1.0/24

# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=63 time=14.3 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=63 time=14.6 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=63 time=15.2 ms

Installazione di WireGuard su Windows

Esiste un client per diversi sistemi operativi, perchè uno degli obiettivi di WireGuard è quello di essere multipiattaforma

Si può scaricare dalla pagina del sito ufficiale e installare sul proprio sistema. Sul sistema troveremo un’icona nella status bar, per la prima configurazione scegliamo la voce “Add  empty tunnel” che automaticamente genera la coppia private/public_key

Una volta configurato e scambiate le chiavi possiamo attivarlo cliccando sulla voce “Attiva”

Se tutto è stato configurato correttamente il tunnel si attiverà e potremo scambiare dati dal sistema Windows a quello Linux.

Ripetiamo lo stesso test fatto prima per verificare che il tuinnel si sia correttamente instaurato.

# ping 10.1.1.1
PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.
64 bytes from 10.1.1.1: icmp_seq=1 ttl=64 time=15.3 ms
64 bytes from 10.1.1.1: icmp_seq=2 ttl=64 time=14.6 ms
64 bytes from 10.1.1.1: icmp_seq=3 ttl=64 time=14.9 ms
^C
--- 10.1.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms

E’ possibile usare con grande soddisfazione WireGuard in reti con molti peer e su dispositivi diversi, funziona molto bene con la App dedicata su Android e su MacOS.