Configurazione di un server VPN su FreeBSD 12.1 con Wireguard

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: