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.
- Si installa Wireguard (o OpenVPN) sul server casalingo
- Si fa Port Forwarding sul router: il traffico VPN viene rediretto dal router al server interno che ospita il server VPN
- 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.