Nel post precedente a questo avevo accennato al fatto che sarò a Oslo per qualche mese, anzi, ormai è già passato il primo.
In particolare avevo descritto la soluzione che avevo ideato per il networking qui, i problemi riscontrati e la soluzione tampone che avevo dovuto adottare.
Usare la Raspberry ha il vantaggio principale che gestisco completamente l’hardware di rete e che posso anche eseguire tutti i servizi che mi servono, uno su tutti OpenVPN, che uso per avere sempre un collegamento con casa e le varie cose che ho lì, per esempio il NAS, oppure per avere un indirizzo IP italiano, che mi viene richiesto per certi servizi.
Tuttavia c’erano anche diversi lati negativi: l’adattatore ethernet-USB sempre occupato e quindi l’impossibilità di usarlo con un computer che è privo di porta ethernet, ma soprattutto la scheda wireless della Raspberry non è nata per fare l’access point e infatti non riveste questo ruolo molto bene.
Quindi, quando ieri ad un mercatino delle pulci ho trovato un D-Link DIR-615, non ho resistito e l’ho comprato. Visto che i venditori non erano sicuri che funzionasse e che volevano disfarsi di più oggetti possibili perché stavano per chiudere, per 20NOK (circa 2€), mi sono portato a casa questo router e uno ZyXEL NBG6503. In particolare, il primo è compatibile con OpenWRT ed è il motivo principale per cui volevo comprarlo.
L’installazione di OpenWRT in questa revisione, la H2, è parecchio semplice: basta avviarlo tenendo reset premuto. Anziché accendersi normalmente, si avvierà in recovery (riconoscibile dal LED di alimentazione giallo, anziché verde). A quel punto basta caricare l’immagine di OpenWRT tramite un browser alla pagina 192.168.0.1
. Per poterlo fare il computer deve essere collegato a una porta LAN e avere indirizzo IP nella rete 192.168.0.0/24
.
Purtroppo, però, questo dispositivo rientra nella categoria dei 32MB di RAM e 4MB di flash. Il problema principale sono appunto i 4MB di flash, che praticamente non permettono di installare nulla. Il mio consiglio è quindi quello di scaricare l’image builder (trovate l’ultima versione dalla stessa pagina dove si scarica l’immagine di OpenWRT) anziché l’immagine vera e propria e rifare l’immagine. Per poter eseguire questa operazione serve un sistema Linux, eventualmente anche live.
La mia idea è stata quella di rimuovere completamente il supporto a PPP, visto che la mia WAN usa direttamente Ethernet. Quindi il comando che ho dato è stato questo:
make image PROFILE="dir-615-h1" PACKAGES="-ppp -ppp-mod-pppoe -luci-proto-ppp -kmod-ppp -kmod-pppoe -kmod-pppox uhttp luci-mod-admin-full luci-app-firewall -luci-theme-bootstrap luci-theme-openwrt"
Notate che sto usando il tema di LuCI OpenWRT anziché Bootstrap. Non fa risparmiare molto (poco più di 1,5KB), l’ho fatto più per nostalgia dei vecchi tempi 😊 . E non vi dico la felicità di quando ho visto che la versione 18.06.01 di OpenWRT ha di nuovo il vecchio logo ASCII di OpenWRT anziché quello di LEDE, anche se manca la ricetta per un cocktail.
Tornando all’argomento principale, anche un’immagine personalizzata come questa, ha pochissimo spazio per poter installare pacchetti. La mia immagine, che è leggermente diversa perché mi ero dimenticato uhttp
e la gestione del firewall tramite LuCI (luci-app-firewall
), ha a mala pena 456KB per l’overlay, che sono insufficienti ad installare OpenVPN. Così, siccome comunque lo volevo provare da parecchio tempo, ho provato WireGuard.
WireGuard è un’applicazione VPN creata da Jason Donenfeld, conosciuto anche come ZX2C4, autore anche di password store, un’utility ispirata dalla filosofia UNIX per la gestione delle password.
WireGuard si vanta di essere semplice da configurare e usare, veloce, ma allo stesso tempo sicura. In particolare su Linux gira come modulo del kernel, quindi effettivamente può avere prestazioni migliori di concorrenti e può girare bene anche sui dispositivi embedded. Invece per altre piattaforme esiste un port in Go.
Comunque, viste le qualità positive, il progetto OpenWRT ha deciso di integrarlo tra i suoi pacchetti. La configurazione effettivamente è semplice, anche se io ho avuto diversi problemi che ho risolto riavviando completamente il networking. È una cosa che non ho fatto molto a cuor leggero, visto che ogni volta che si modifica il network si rischia di chiudersi fuori dal router, cosa che a più di 1500km di distanza non è proprio piacevole, però poi ha funzionato.
In particolare, su OpenWRT bisogna installare i pacchetti kmod-wireguard
e wireguard-tools
, se poi avete abbastanza spazio, potete installare anche luci-proto-wireguard
e gestire il tutto tramite LuCI, altrimenti bisogna modificare manualmente il /etc/config/network
, riportando queste righe:
config interface 'wg0' option proto 'wireguard' option private_key 'chiave generata con wg genkey' option listen_port '51820' # Uno o più indirizzi IP per il router, da associare alla VPN, utili per fare debugging list addresses '10.70.60.2/32' config wireguard_wg0 # Una sezione di queste per ogni possibile client option public_key 'la chiave pubblica dell'altro router, che viene fuori sul comando wg' option route_allowed_ips '1' option endpoint_host 'l'indirizzo dell'altro router' # Basta che sia in uno solo dei peer option persistent_keepalive 25 # Opzionale, se aprite la porta nel firewall option preshared_key 'opzionalmente, una psk generata con wg genpsk per maggiore sicurezza' list allowed_ips '10.70.60.1/32' # L'indirizzo IP dell'altro router list allowed_ips '10.20.0.0/24' # La rete associata all'altro router
La cosa bella è che la configurazione è simmetrica, ovvero nell’altro router basta riportare la stessa identica configurazione, cambiando solamente le chiavi e gli indirizzi IP. L’importante è che per ogni coppia di peer, almeno uno abbia l’endpoint.
Ho misurato le prestazioni tramite iperf, eseguito non sui router, ma su altri PC a loro collegati. In pratica riesco a usare completamente le velocità di internet che mi vengono offerte, quindi 20Mbps in un lato e 10Mbps nell’altro. OpenVPN non riusciva, perché era limitato dalla CPU del TD-W8970.
In realtà il segreto di questa configurazione è la direttiva route_allowed_ips
: sui sistemi Linux normali non c’è una simile opzione, quindi i vari indirizzi IP e route devono essere configurati manualmente, per esempio da linea di comando con ip
, oppure con network manager. Eventualmente per quest’ultimo esistono anche dei plugin che consentono di gestire completamente wireguard, però non li ho provati. Questo rende WireGuard estremamente più semplice, però forse richiede qualche competenza in più richiesta rispetto a quelle richieste, per esempio, da OpenVPN. Invece il resto della configurazione delle chiavi normalmente viene effettuata tramite un file di configurazione da passare al comando wg
che ha un formato simile ai .ini.
Comunque sono pienamente soddisfatto di questa nuova configurazione. L’unico problema che ho riscontrato finora è che WireGuard potrebbe non funzionare correttamente con i DDNS, perché l’indirizzo in realtà viene risolto in fase di configurazione e dopo viene memorizzato solo l’indirizzo IP. Per risolvere questo problema esistono degli script shell, che però non ho ancora provato e/o integrato in OpenWRT.