Accedere ai propri server LAN e bypass CG-NAT. Wireguard VPN site-to-site + VPS tunnel

L'obbiettivo di questo post è accedere ai propri servizi di smart home (es. Home Assistant), NAS, telecamere di sicurezza, tramite Wireguard VPN.. all'interno della propria rete domestica (LAN).

Questa operazione con una connessione internet ADSL è abbastanza semplice, avendo un ip pubblico dinamico.

  1. Si installa Wireguard (o OpenVPN) sul server casalingo
  2. Si fa Port Forwarding sul router: il traffico VPN viene rediretto dal router al server interno che ospita il server VPN
  3. Tramite un servizio di FREE DNS (es. casamia.no-ip.org ) si ha un puntatore al proprio IP di casa che nel tempo potrebbe cambiare

Cosa fare invece se usiamo una connessione 4G o Fibra e il nostro ISP ci da un IP sotto NAT?

Ovvero il nostro IP pubblico su internet è condiviso con altre persone e non il nostro router non è direttamente raggiungibile da internet?

Opzione 1: Managed, in breve i nostri computer LAN si collegano via tunnel al server di Tailscale VPN e noi ci accediamo da internet tramite questo servizio VPN managed (non gestito da noi, ma gratuito per utilizzo base)

Opzione 2: Selfhosted, dobbiamo avere un server VPS (quindi con indirizzo pubblico su internet) e far collegare i computer LAN interessati a questo server Wireguard

Configurazione Wireguard site-to-site minima

  • home-server: computer interno che ospita servizi LAN (es. web app)
  • wireguard-vps-server: computer pubblico VPS
  • client mobile: il nostro smartphone Android, che si trova su internet (Download app)

Installazione di Wireguard su Linux Debian 11

Questi passaggi valgono per home-server e wireguard-vps-server dopo esservi collegati via SSH.

# Solo per Debian 10
echo 'deb http://ftp.debian.org/debian buster-backports main' | sudo tee /etc/apt/sources.list.d/buster-backports.list

sudo apt update  
sudo apt install wireguard-tools  

Abilitazione ip forward e firewall

Solo su wireguard-vps-server

sudo sysctl -w net.ipv4.ip_forward=1  

Opzionale, se presente un firewall abilitare l'accesso sulla porta del VPN server.

sudo ufw allow 51820/udp  

Generazione delle chiavi pubbliche private per Wireguard

Il seguente comando genera le chiavi asimmetriche necessarie per i vari peer Wireguard, potete eseguirlo dove ritenete più opportuno, dovete solo ricordarvi di copiare le chiavi al posto giusto nei rispettivi file di configurazione

wg genkey | tee privatekey | wg pubkey > publickey && cat privatekey publickey

0PqYhc/Nu4sqnSXJ8N+ViPV3Q3N3x4vBNcvEDDdGiUY=  
Hm8mUC5x1n0TSNM0qxydeqgDOrfBI1BlpXaWgCcbQCo=  

Nell'output d'esempio della coppia, la prima è una chiave privata e la seconda è una chiave pubblica.

File di configurazione client/server di Wireguard

# Configurazione per esempio di wireguard-vps-server, il computer con IP pubblico raggiungibile
# /etc/wireguard/wg-server.conf
[Interface]
Address = 10.0.0.1  
ListenPort = 51820  
PrivateKey = <chiave privata di wireguard-vps-server>  
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE  
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
# peer1 / home-server
PublicKey = <chiave pubblica di home-server>  
AllowedIPs = 10.0.0.2/32

[Peer]
# peer2 / client-mobile
PublicKey = <chiave privata di client-mobile>  
AllowedIPs = 10.0.0.3/32  
# Configurazione per esempio di home-server o altro computer in lan
# /etc/wireguard/wg-peer.conf
[Interface]
Address = 10.0.0.2  
PrivateKey = <chiave privata di home-server>  
ListenPort = 51820  
# Local DNS or DNS
DNS = 1.1.1.1

[Peer]
PublicKey = <chiave pubblica di wireguard-vps-server>  
Endpoint = wireguard-vps-server.com:51820  
# Classe di IP della rete VPN
AllowedIPs = 10.0.0.0/24  
# Per i peer dietro CG-NAT che devono contattare il VPN server
PersistentKeepalive = 30  

Abilitare Wireguard in modo persistente

Da eseguire nei rispettivi computer, per abilitare all'avvio e immediatamente wireguard

sudo systemctl enable --now wg-quick@wg-peer

sudo systemctl enable --now wg-quick@wg-server  

Test della configurazione Wireguard site-to-site

Il seguente comando eseguito su wireguard-vps-server vi da la visibuilità di tutti i nodi connessi. Potete anche eseguilo sui peer per verificare che siete conenssi ai server

sudo wg show  
interface: wg-server  
  public key: <chiave pubblica wireguard-vps-server>
  private key: (hidden)
  listening port: 51820

peer: <chiave pubblica peer>  
  endpoint: ip:62131
  allowed ips: 10.0.0.4/32
  latest handshake: 18 seconds ago
  transfer: 38.99 MiB received, 3.17 MiB sent

peer: <chiave pubblica peer>  
  endpoint: ip:62104
  allowed ips: 10.0.0.2/32
  latest handshake: 1 minute, 36 seconds ago
  transfer: 182.74 MiB received, 6.35 MiB sent

Se i vari nodi si vedono possiamo procedere con il ping e/o vedere se un eventuale web service è attivo.

In questo esempio partiamo dal peer con ip 10.0.0.2 e verifichiamo che il web service su 10.0.0.4:6666 risponde con dei dati.

$ ip addr show wg-peer
1332: wg-peer: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000  
    link/none 
    inet 10.0.0.2/32 scope global wg-peer
       valid_lft forever preferred_lft forever

$ ping 10.0.0.4
PING 10.0.0.4 (10.0.0.4) 56(84) bytes of data.  
64 bytes from 10.0.0.4: icmp_seq=1 ttl=63 time=117 ms  
64 bytes from 10.0.0.4: icmp_seq=2 ttl=63 time=103 ms  
^C


$ curl -I http://10.0.0.4:6666
HTTP/1.1 200 OK  
Date: Wed, 06 Apr 2022 09:12:20 GMT  
Content-Length: 0  
Etag: "da39a3ee5e6b4b0d3255bfef95601890afd80709"  
Content-Type: text/html; charset=UTF-8  
Server: motionEye/0.42

Se sei interessato al tema del selfhosting, di come farti il cloud in casa, su Techonsapevole Academy altri video di approfondimento.