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
- 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
- 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
#ufw allow 51820/udp
# firewall-cmd --add-port=51820/udp --permanent
# firewall-cmd --reload
# 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.