ZeroTier One: configurare un controller self-hosted per creare la propria rete virtuale.

Al giorno d’oggi è utile poter riunire tutti i dispositivi che si possiedono sotto un’ unica rete virtuale, in modo da potervi accedere più facilmente e poterli controllare anche a distanza, senza esporli necessariamente al resto del mondo. Esistono vari metodi per crearsi una VPN (Virtual Private Network) e, in linea di massima non sono proprio alla portata di tutti. Qualche giorno fa ci siamo però imbattuti in ZeroTier, una soluzione open-source che permette a chiunque di creare la propria rete virtuale senza avere nessuna competenza specifica, grazie ad una semplicissima procedura guidata e una applicazione che garantisce una connessione totalmente cifrata e autenticata attraverso algoritmi come 256-bit Salsa20 e Poly1305.

Il punto di partenza consiste appunto nel creare la rete virtuale che consentirà ai nostri dispositivi di connettersi tra loro come se fossero connessi alla stessa rete locale (LAN). Per fare questo è possibile utilizzare il controller Central ospitato da ZeroTier sul sito my.zerotier.com, un portale UI basato sul web per la gestione delle reti virtuali. Per registrarsi sarà sufficiente fornire la propria mail e una password e, una volta loggati sarà possibile creare la propria rete virtuale, identificata da un ID univoco a 16 cifre.

L’ultimo passo consiste nell’installare il client di ZeroTier su ogni dispositivo che si desidera collegare alla rete, con l’iscrizione gratuita per utilizzo non commerciale, si possono collegare fino a 100 dispositivi al controller di rete ZeroTier Central. Sono supportati praticamente tutti i sistemi più diffusi, inclusi dispositivi mobili Android e iOs e i firmware di vari NAS come Sinology. Installata l’applicazione, ogni dispositivo sarà a sua volta identificato da un ID di 10 cifre: basterà semplicemente indicare le 16 cifre identificative della propria rete per avviare la configurazione automatica.

Configurare un controller di rete autonomo

Noi l’abbiamo provato e abbiamo voluto spingerci oltre cercando di compiere un primo passo verso una soluzione self-hosted, configurando un nostro controller non esposto pubblicamente. In questo articolo vedremo infatti come configurare il proprio controller di rete autonomo senza dover necessariamente passare dalla registrazione a my.zerotier.com. 

Configurare un controller autonomo è abbastanza semplice: basta installare il software ZeroTier One e seguire le istruzioni di installazione seguenti per installare ztncui su una macchina Linux.

Prerequisiti

  • macchina ubuntu con 1Gb di RAM
  • aprire la porta 9993 se un nodo di destinazione è dietro firewall (non obbligatorio ma diminuisce la latenza)

Installazione

Colleghiamoci alla nostra macchina Linux ed iniziamo l’installazione del client. Le distribuzioni basate su Debian e RPM incluse Debian, Ubuntu, CentOS, RHEL, Fedora e altre sono supportate tramite uno script che aggiunge il repository giusto e installa il pacchetto. Il seguente comando è mostrato anche nella pagina di download di ZeroTier zerotier.com/download.shtml.

curl -s https://install.zerotier.com | sudo bash

A questo punto il client di Zerotier risulterà installato nella nostra macchina, ora aggiungiamo il repository per scaricare Ztncui, ossia quello che sarà il nostro controller.

curl -O https://s3-us-west-1.amazonaws.com/key-networks/deb/ztncui/1/x86_64/ztncui_0.5.8_amd64.deb

Installiamolo con il seguente comando:

sudo apt-get install ./ztncui_0.5.8_amd64.deb

Opzionale: una volta installato ztncui possiamo installare i certificati SSL, di default verranno utilizzati dei certificati self-signed generati automaticamente, ma puoi generare i tuoi compilandoli con le tue informazioni personali utilizzando i seguenti comandi:

sudo -i
cd /opt/key-networks/ztncui/etc/tls
rm -f privkey.pem fullchain.pem
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout privkey.pem -out fullchain.pem
chown ztncui.ztncui *.pem
chmod 600 privkey.pem

Limitiamo l’accesso alla porta 3443 sull’interfaccia di rete pubblica al nostro indirizzo IP (almeno fino a quando non viene impostata la password dell’amministratore).

sudo sh -c "echo 'HTTPS_PORT = 3443'> /opt/key-networks/ztncui/.env"

Avendo già un certificato e una chiave privata, dovresti essere in grado di accedere a ztncui su HTTPS sulla porta specificata da HTTPS_PORT.

A questo punto possiamo utilizzare il nostro controller, connettiamoci tramite HTTPS sulla porta 3443 tramite web browser, https: //<indirizzoIPmacchina>: 3443

Accedi come utente admin con password password .

Successivamente è possibile creare ulteriori utenti tramite il menu User>Create User inserendo username, password e specificando se la password sarà da modificare al primo login.

Una volta fatto ciò, i nuovi utenti appariranno nell’elenco (è consigliato eliminare l’account admin creato di default tramite l’apposita icona).

Dal menu Network è possibile creare la rete che ci permetterà di collegare tutti i device remoti. Clicchiamo su Add Network e scegliamo un nome per la nostra rete.

Torniamo nella Home dove è possibile individuare l’ID a 16 cifre della rete virtuale appena creata. Cliccando su List all networks on this controller sarà possibile configurare la nostra rete.

Clicchiamo su easy setup.

Abbiamo la possibilità di assegnare o generare automaticamente una classe di IP per la rete virtuale e impostare l’intervallo degli indirizzi che verranno usati dai dispositivi che aggiungeremo.

Una volta confermato torniamo alla pagina precedente; cliccando su details potremo avere maggiori informazioni sulla rete appena creata.

Cliccando invece su members potremo consultare la lista dei dispositivi aggiunti. Ovviamente la lista risulterà vuota.

Possiamo però aggiungere il nostro stesso controller digitando sul nostro terminale il comando:

sudo zerotier-cli join [networkID]

Dove [networkID] è il codice da 16 cifre che identifica la nostra rete. Potrai verificare lo stato della connessione con il comando:

sudo zerotier-cli status

In questa fase un errore tipo “ACCESS_DENIED” è normale, poiché il client deve essere abilitato. Rechiamoci dunque nella sezione Network>Members del nostro controller, verrà mostrato l’ID del dispositivo appena aggiunto al quale possiamo assegnare un nome in modo da riconoscerlo più facilmente. Abilitando il flag autorizzeremo il dispositivo ad entrare a far parte della nostra rete, possiamo infatti notare che gli è stato assegnato automaticamente un IP appartenente al pool impostato in precedenza (volendo è possibile modificarlo).

Per aggiungere invece gli altri dispositivi possiamo scaricare il client sempre dalla pagina di Download di ZeroTier. Sarà possibile selezionare l’icona corrispondente al sistema operativo del dispositivo che desideriamo aggiungere alla rete.

Se ad esempio selezioniamo Windows scaricheremo il pacchetto .msi da installare direttamente sulla macchina. Possiamo collegare anche dispositivi mobili attraverso l’app Zerotier One disponibile sia sul Play Store che sull’Apple Store. Il procedimento sarà analogo a quello spiegato in precedenza: installare il client, fare il join alla rete identificata dalle 16 cifre e abilitare dalla dashboard del nostro controller i dispositivi aggiunti. Nell’immagine successiva verranno mostrati i diversi client che noi abbiamo aggiunto durante la nostra prova.

Da questo momento in poi i nostri dispositivi saranno raggiungibili anche a distanza, da qualsiasi destinazione utilizzando gli IP assegnati.

Instradamento tra ZeroTier e reti fisiche

Il fatto di dover utilizzare degli indirizzi ip diversi da quelli della LAN dell’uffico per identificare i nostri dispositivi aziendali non ci entusiasmava, sarebbe stato più comodo collegarsi alle macchine senza dover ricordare tutti gli ip virtuali assegnati dalla rete ZeroTier. Così, guardando tra la documentazione abbiamo trovato un modo per farlo.

I passaggi da eseguire sono i seguenti:

  1. Installare ZeroTier su una macchina Linux che fungerà da gateway
  2. Aggiungere un nuovo route sul nostro controller ZeroTier
  3. Abilitare IP forwarding
  4. Configurare iptables

Questa è una tabella riassuntiva contenente i parametri di esempio che ci serviranno per la configurazione, da sostituire con la vostra configurazione.

InfoESEMPIOVariabile
Network ID ZeroTier865e7201263ef8e07$NETWORK_ID
Nome interfaccia ZeroTierzt7nnig26$ZT_IFACE
Physical Interface Nameeth0$PHY_IFACE
Subnet di ZeroTier10.100.10.0/24 
Subnet Fisica Ufficio (Target)192.168.1.0/24$PHY_SUB
ZeroTier Indirizzo IP del Gateway84.100.10.100$ZT_ADDR
1.Installare ZeroTier su una macchina Linux che fungerà da gateway

All’interno della rete LAN sarà necessario configurare un macchina Ubuntu, installare il client di ZeroTier e aggiungere la macchina alla rete virtuale abilitandola in modo che ottenga un IP, come mostrato in precedenza.
Nel nostro caso il controller stesso è parte della rete fisica quindi utilizzeremo quella stessa macchina come “router”.

2.Aggiungere un percorso gestito alla rete ZeroTier sul nostro controller

In questo passaggio aggiungeremo un’altra route per qualsiasi device connesso all rete di ZeroTier. Rechiamoci in Network>details come mostrato in precedenza e in seguito clicchiamo su routes.

Nella pagina verrà mostrato l’attuale route esistente, creato di default in fase di creazione rete virtuale. Ne aggiungeremo uno nuovo impostando come target la classe di IP che identifica la nostra rete fisica aziendale e come gateway l’indirizzo IP virtuale della macchina linux. E’ consigliato configurare la classe del target con una subnet leggermente più grande della subnet fisica effettiva, in modo che i dispositivi che si trovano sia sulla rete fisica che su quella virtuale di ZeroTier preferiscano comunque la connessione fisica. Nel nostro esempio la nostra lan interna è 192.168.1.0/24 quindi imposteremo 192.168.1.0/23 invece di /24 (un numero più piccolo è una sottorete più grande in questa notazione) mentre l’IP virtuale del gateway, nonché del nostro controller, è 84.100.10.100.

Clicchiamo su submit e la nuova route verrà aggiunta all’elenco.

3.Abilitare IP forwarding

A questo punto colleghiamoci al terminale Linux e modifichiamo il file /etc/sysctl.conf utilizzando il comando

sudo vi /etc/sysctl.conf

e scommentiamo la riga relativa a net.ipv4.ip_forward cancellando #. Salviamo e chiudiamo il file premendo Esc e digitando :wq! seguiti dal tasto invio di conferma.

Il forwarding verrà abilitato al successivo riavvio della macchina, per abilitarlo subito digitare il comando:

sudo sysctl -w net.ipv4.ip_forward=1
4.Configurare iptables

Sempre dalla shell di Ubuntu assegnamo due variabili che ci renderanno più facili i successivi comandi. I valori assegnati corrispondono alle 2 interfacce di rete della macchina, per visualizzarle digitare ifconfig tramite shell; otterrete qualcosa di simile a eth0 e ztnnig26. Impostiamo le variabili con il seguente comando:

PHY_IFACE=eth0; ZT_IFACE=zt7nnig26

Aggiungiamo le regole a ip tables:

sudo iptables -t nat -A POSTROUTING -o $PHY_IFACE -j MASQUERADE
sudo iptables -A FORWARD -i $PHY_IFACE -o $ZT_IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i $ZT_IFACE -o $PHY_IFACE -j ACCEPT

Salviamo le regole anche per il prossimo avvio

sudo apt install iptables-persistent
sudo bash -c iptables-save > /etc/iptables/rules.v4

Test!

Ora non resta che testare la configurazione;

  • Collega il pc ad un’altra rete (diversa dalla LAN appena aggiunta)
  • Aggiungilo alla rete di zerotier e abilita l’autorizzazione
  • Prova ad accedere a qualche macchina della rete LAN che hai aggiunto in precedenza utilizzando l’IP della rete fisica

Conclusioni

Ovviamente ZeroTier offre molto di più di quanto descritto in questo articolo, basta consultare il manuale per rendersi conto delle sue potenzialità. Diciamo che, dopo aver letto il manuale, abbiamo deciso di provare a ottenere una soluzione self-hosted decidendo di presentare questo interessante prodotto attraverso una veloce guida. Abbiamo avuto ottime impressioni anche relative alla velocità di connessione, paragonabile a quella della nostra VPN point to site che utilizziamo abitualmente.
Ovviamente quanto mostrato in questo articolo è solo un primo passo per avere un’infrastruttura del tutto indipendente. Al momento per stabilire le connessioni tra i diversi peer vengono comunque utilizzati i 4 root server di zerotier dislocati in diverse aree geografiche. La versione attuale di zerotier permetterebbe la creazione dei propri root server ma questa funzionalità è ancora considerata in qualche modo sperimentale, quindi abbiamo deciso di fermarci qui per il momento visto l’imminente arrivo della versione 2.0. Dunque non ci resta che attendere l’arrivo della nuova versione per scoprire se ci saranno interessanti novità.

N.B. Per situazioni più critical, dove ad esempio sono in gioco dati riservati o apparecchiature particolari conviene puntare su soluzioni VPN gestite interamente in-house piuttosto che software di terze parti, se hai bisogno di conoscere la soluzione migliore per te contattaci pure!

Link utili

https://www.zerotier.com/manual/

https://zerotier.atlassian.net/wiki/spaces/SD/overview

https://www.zerotier.com/2019/09/24/zerotier-2-0-status/

https://key-networks.com/ztncui/