Installazione:
# pkg install wireguard
Generazione delle coppie di chiavi:
$ wg genkey | tee /usr/local/etc/wireguard/server-private.key | wg pubkey > /usr/local/etc/wireguard/server-public.key
$ wg genkey | tee /user/local/etc/wireguard/client-private.key | wg pubkey > /usr/local/etc/wireguard/client-public.key
Configurazione dell’interfaccia lato server, wg0.conf:
# Configurazione server
[Interface]
Address = <IP dell'interfaccia di rete di Wireguard>/24
PrivateKey = <CHIAVE PRIVATA>
ListenPort = <Porta UDP sulla quale ricevere le connessioni VPN>
[Peer]
PublicKey = <CHIAVE PUBBLICA DEL CLIENT>
AllowedIPs = <Indirizzo IP che avrà il client>/32
Configurazione dell’interfaccia lato client: /usr/local/etc/wireguard/client.conf
# Configurazione client
[Interface]
# Chiave privata client
PrivateKey = <qui ci va il contenuto di client-private.key>
Address = <IP che verrà assegnato al client>/32
DNS = <IP del DNS usato sul server VPN oppure altro DNS pubblico>
[Peer]
#WireGuard server public key
PublicKey = <qui ci va il contenuto di server-public.key>
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = <Indirizzo IP pubblico del server VPN>:<porta del server VPN>
PersistentKeepalive = 25
Generazione QR code per configurare il client
$ pkg_add libqrencode
$ qrencode -t ansiutf8 < /usr/local/etc/wireguard/client.conf
Acquisire il QR code con il client wireguard, ad esempio quello per Android
Configurazione del firewall PF in /etc/pf.conf
wireguard_clients="<subnet della VPN>/24"
wanint="em0" # Interfaccia WAN
wg_ports="51845" # Porta della VPN
set skip on lo0
nat on $wanint inet from $wireguard_clients to any -> $wanint
pass in on $wanint proto udp from any to $wanint port $wg_ports
pass in on $wanint proto tcp from any to $wanint port 22 keep state # Accesso SSH dalla VPN
pass out quick
pass in on wg0 from any to any
Abilitare il packet forwarding:
sysctl -w net.inet.ip.forwarding=1
Abilitare il firewall PF per fare una prova:
service pf onestart
Test della VPN:
wq-quick up wg0
Verifica funzionamento lato server. Se la VPN è su e la connessione con il client funziona, l’output di wg show dovrebbe essere simile a questo:
$ wg show
interface: wg0
public key: <deve corrispondere a server-public.key>
private key: (hidden)
listening port: <porta della VPN>
peer: <deve corrispondere a client-public.key>
endpoint: <Indirizzo IP pubblico del client>
allowed ips: <Indirizzo IP del client connesso alla VPN>
latest handshake: 5 minutes, 54 seconds ago
transfer: 15.60 KiB received, 48.21 KiB sent
Verifiche da fare lato client:
- Ping indirizzo IP dell’interfaccia VPN lato server
- Verificare che il client stia uscendo su internet con l’IP pubblico del server VPN (https://ifconfig.co)
- Ping indirizzo IP pubblico qualsiasi, es. 8.8.8.8
- Visualizzare un sito web
Abilitare il firewall PF all’avvio:
sysrc pf_rules="/etc/pf.conf"
sysrc pf_enable=YES
sysrc pflog_enable=YES
Abilitare il packet forwarding all’avvio:
sysrc gateway_enable=YES
Abilitare VPN all’avvio:
sysrc wireguard_enable=YES
sysrc wireguard_interfaces="wg0"
service wireguard start
Bibliografia:
- https://www.cryptsus.com/blog/wireguard-vpn-privacy-server-on-a-vultr-cloud-vps-on-openbsd-6.6-with-full-disk-encryption.html
- https://genneko.github.io/playing-with-bsd/networking/freebsd-wireguard-quicklook/