
Nel panorama della sicurezza informatica moderna, il modello tradizionale basato sul perimetro di rete quello del “dentro si fida, fuori non si fida” ha mostrato tutti i suoi limiti.
Ambienti ibridi lavoro remoto microservizi distribuiti su cloud multipli: il perimetro, semplicemente, non esiste più.
È in questo contesto che nasce il paradigma Zero Trust il cui principio fondamentale è tanto semplice quanto radicale: non fidarsi mai di nessuno per default, verificare sempre tutto.
OpenZiti è una piattaforma open source che porta questo modello dalla teoria alla pratica.
Ogni connessione viene autenticata con un’identità crittografica, ogni accesso è autorizzato da policy esplicite, il traffico è cifrato end-to-end e i servizi restano completamente invisibili a chiunque non sia autorizzato nessuna porta aperta, nessuna superficie di attacco esposta.
Il tutto senza richiedere modifiche al codice delle applicazioni esistenti.
In questa guida vedremo come installare e configurare OpenZiti su Ubuntu Server 26.04 costruendo da zero un overlay network zero trust con Controller, Edge Router e console di amministrazione web.
Che tu voglia proteggere un homelab, esporre servizi interni senza aprire porte sul firewall o semplicemente capire come funziona una rete zero trust nella pratica, questa è la guida da cui partire.
Di seguito uno schema che spiega il funzionamento di OpenZiti
PREREQUISITI
Ubuntu 26.04 LTS (fresh install)
Utente con privilegi sudo
FQDN servertest.lab.prv risolvibile via DNS o /etc/hosts su tutti i client
Porte aperte sul firewall (vedi sezione dedicata)
Controller — il cervello della rete: gestisce identità, policy e certificati
Edge Router — il piano dati che instrada il traffico cifrato
ZAC (Ziti Admin Console) — interfaccia web di amministrazione
Porte richieste:
| Porta | Protocollo | Componente | Descrizione |
| 1280 | TCP | Controller | API Edge + Control Plane |
| 3022 | TCP | Edge Router | Edge Listener |
| 10080 | TCP | Edge Router | Link Listener (fabric) |
| 8443 | TCP | ZAC Console | Interfaccia Web Admin |
FASE 1 – PREPARAZIONE DEL SISTEMA
Aggiornare il sistema con il comando:
|
0 |
sudo apt update && sudo apt upgrade -y |
Installare le dipendenze di base con il comando:
|
0 |
sudo apt install -y curl wget gnupg2 apt-transport-https ca-certificates |
Verifica che l’FQDN sia corretto con il comando:
|
0 |
hostname -f |
Dovremmo visualizzare il seguente output:
|
0 |
servertest.lab.prv |
Se necessario impostare l’FQDN con il comando:
|
0 |
sudo hostnamectl set-hostname servertest.lab.prv |
Assicurarsi che /etc/hosts contenga la riga corretta:
|
0 |
sudo nano /etc/hosts |
Aggiungere (sostituire con l’IP reale del server):
|
0 |
192.168.X.X servertest.lab.prv servertest |
FASE 2 – AGGIUNTA DEL REPOSITORY OPENZITI
Questi comandi configurano il repository APT ufficiale di OpenZiti.
Scaricare e installare la chiave GPG del repository con il comando:
|
0 1 |
curl -sSLf https://get.openziti.io/tun/package-repos.gpg \ | sudo gpg --dearmor --output /usr/share/keyrings/openziti.gpg |
Rendere la chiave leggibile da tutti gli utenti con il comando:
|
0 |
sudo chmod a+r /usr/share/keyrings/openziti.gpg |
Creare il file di repository APT con il comando:
|
0 1 2 |
sudo tee /etc/apt/sources.list.d/openziti-release.list >/dev/null <<EOF deb [signed-by=/usr/share/keyrings/openziti.gpg] https://packages.openziti.org/zitipax-openziti-deb-stable debian main EOF |
Aggiornare la lista dei pacchetti con il comando:
|
0 |
sudo apt update |
NOTA BENE: OpenZiti usa debian come label del repository anche per Ubuntu — è corretto così.
FASE 3 – INSTALLAZIONE E CONFIGURAZIONE DEL CONTROLLER
3.1 INSTALLAZIONE DEL PACCHETTO
Eseguire il comando:
|
0 |
sudo apt install -y openziti-controller |
Il pacchetto installa anche la CLI ziti come dipendenza.
3.2 AVVIARE IL BOOTSTRAP DEL CONTROLLER
Il bootstrap crea automaticamente: PKI, certificati, config file e database.
|
0 |
sudo /opt/openziti/etc/controller/bootstrap.bash |
Lo script pone alcune domande interattive. Rispondere come indicato nella tabella sottostante:
| Domanda | Risposta |
| Are you joining an existing cluster? | N (nuovo cluster, default) |
| Permanent external address | servertest.lab.prv |
| Node name | servertest (default: primo label dell’FQDN) |
| Trust domain | lab.prv (default: label rimanenti) |
| Port | 1280 (default) |
| Admin password | Genera automaticamente OPPURE inserisci una password sicura |
| Install web console? | Y (consigliato) |
| Enable certificate renewal timer? | Y (consigliato) |
Al termine dell’installazione dovremmo vedere il seguente output:
|
0 |
bootstrap completed successfully and will not run again. Adjust /var/lib/private/ziti-controller/config.yml to suit. |
Al termine abilitare il controller con il comando:
|
0 |
sudo systemctl enable --now ziti-controller |
⚠️ IMPORTANTE: Salvare la password admin mostrata a fine bootstrap, ti servirà per accedere!
3.3 VERIFICARE LO STATO DEL CONTROLLER
Controllare che il servizio sia attivo con il comando:
|
0 |
sudo systemctl status ziti-controller |
Se è tutto OK dovremmo visualizzare il seguente output:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
● ziti-controller.service - OpenZiti Controller Loaded: loaded (/usr/lib/systemd/system/ziti-controller.service; enabled; > Drop-In: /etc/systemd/system/ziti-controller.service.d └─override.conf Active: active (running) since Sat 2026-05-16 18:59:45 UTC; 30s ago Invocation: d39fb50a519e44ef9f761f6d5db446e1 Process: 3028 ExecStartPre=/opt/openziti/etc/controller/entrypoint.bash che> Main PID: 3054 (ziti) Tasks: 7 (limit: 6210) Memory: 64.6M (peak: 64.7M) CPU: 922ms CGroup: /system.slice/ziti-controller.service └─3054 /opt/openziti/bin/ziti controller run config.yml -- May 16 18:59:46 servertest.lab.prv ziti[3054]: {"file":"github.com/openziti/zit> May 16 18:59:46 servertest.lab.prv ziti[3054]: {"file":"github.com/openziti/zit> May 16 18:59:46 servertest.lab.prv ziti[3054]: {"file":"github.com/openziti/zit> May 16 18:59:46 servertest.lab.prv ziti[3054]: {"file":"github.com/openziti/zit> May 16 18:59:46 servertest.lab.prv ziti[3054]: {"file":"github.com/openziti/zit> May 16 18:59:46 servertest.lab.prv ziti[3054]: {"file":"github.com/openziti/zit> May 16 18:59:46 servertest.lab.prv ziti[3054]: {"file":"github.com/openziti/cha> May 16 18:59:46 servertest.lab.prv ziti[3054]: {"file":"github.com/openziti/zit> May 16 18:59:46 servertest.lab.prv ziti[3054]: {"file":"github.com/openziti/xwe> lines 1-23 |
Verificare i log con il comando:
|
0 |
sudo journalctl -u ziti-controller -f |
FASE 4 – INSTALLAZIONE E CONFIGURAZIONE DELL’EDGE ROUTER
4.1 INSTALLAZIONE DEL PACCHETTO
Eseguire il comando:
|
0 |
sudo apt install -y openziti-router |
4.2 CREARE IL ROUTER NEL CONTROLLER TRAMITE CLI
Prima fai login con la CLI ziti:
Login al controller (usa la password salvata nel passo 3.2)
|
0 1 2 3 |
ziti edge login servertest.lab.prv:1280 \ --username admin \ --password PASSWORD \ --yes |
Dovremmo visualizzare il seguente output:
|
0 1 2 3 4 5 |
Untrusted certificate authority retrieved from server Verified that server supplied certificates are trusted by server Server supplied 2 certificates Server certificate chain written to /home/rchiatto/.config/ziti/certs/servertest.lab.prv Token: af50d889-9308-49fb-a1e3-6c16d388f7a5 Saving identity 'default' to /home/rchiatto/.config/ziti/ziti-cli.json |
ATTENZIONE: copiare il TOKEN perchè ci verrà chiesto più avanti
Ora creare il router (ottieni il token JWT di enrollment):
Creare l’edge router
|
0 1 2 3 |
ziti edge create edge-router "servertest-router" \ --role-attributes public \ --tunneler-enabled \ --jwt-output-file /tmp/router.jwt |
Dovremmo visualizzare il seguente output:
|
0 1 |
New edge router servertest-router created with id: mKAQ7adB2Q Enrollment expires at 2026-05-16T22:03:55.226Z |
Verificare che il file JWT sia stato creato con il comando:
|
0 |
cat /tmp/router.jwt |
Dovremmo visualizzare un output simile al seguente:
|
0 |
eyJhbGciOiJSUzI1NiIsImtpZCI6IjBlZWJhMmU4MzMiLCJ0eXAiOiJKV1QifQ.eyJpc3MLnBydjoxMjgwIiwic3ViIjoibUtBUTdhZEIyUSIsImF1ZCI6WyIiXSwiZXhwIjoxNzc4OTY5MDM1LCJqdGkiOiI0YzlmZmRlYS1iZWViLTQ3Y2UtYjY0NS0yMjQyYTc4MTlhMDYiLCJlbSI6ImVyb3R0IiwiY3RybHMiOlsidGxzOnNlcnZlcnRlc3QubGFiLnBydjoxMjgwIl19.Bh7bd_oYjC0Y-YtxkmLQZsJ5J-CHi4enI5A-rbQ7c7N6n44EAC2hfFy1f-ve6vVoJA-7bko7A5Yw57llCUy55yiwSMeuh5XTjiy2bdpL3v3A6MqbVA7mCSE5WYHIOcCGuo-fLdy_iZ-r0ZZNjHiI_9_PWJ2_SLUcx45OsNA6gBHtMwEN4yZKPxGYoSesBnAJ__cdqKXx9S_IG8U-wLQQE0eDK8Je21wavj4kZuCm297UUjocg7xk0qkiPQ3TkyJZDWYOM0YjJmKWBexDWzJF-ANG3Zz8A38kiRIAEHYFBM1KTgS8RbjJ6ruK8vwaHtAtnxp-neHNtrP64Xb0D5VDem4k1NV_Lc_X53u004E3jHWYwb1n8IJ72liF4sTtczQllsHmgTj756l07j6r4P8Jlv1uPkL3cMSiOj6ZiUdYROZj76befSgZQ95C2vj5Zj3-0KvQnUcnqCcWO0aMtJYXSPEsOjesukqZkIuY7Ce_796VQbBgSre4bBydpJu4o4-ktz_XmNtP-dvScHNr-32qUpvxanWlG7RfSwM7u1qfzL1vxfbGWwB8xvrt516fYricip7pGcHadxJZfZvc2gYm55lZB8TBLfAX5qAYX1EpS2CfZr_k_av7Z51EiwqDEYr-9ogc4RouaoVTe4PB8f4Xhx5C-Yy6J4e-m9ZHTRnx7Nsrchiatto@vm-srv-test:~$ |
4.3 AVVIARE IL BOOSTRAP DEL ROUTER
Eseguire il comando:
|
0 |
sudo /opt/openziti/etc/router/bootstrap.bash |
Rispondere alle domande come di seguito:
| Domanda | Risposta |
| Address of the controller | servertest.lab.prv |
| Controller port | 1280 (default) |
| DNS name or IP address of this router | localhost |
| Permanent external address | servertest.lab.prv |
| Router Port | 3022 (default) |
| Enrollment token | Incolla il contenuto del file /tmp/router.jwt |
Al termine abilitare il router con il comando:
|
0 |
sudo systemctl enable --now ziti-router |
Quindi eseguire l’enrollment con il JWT con il comando:
|
0 1 2 |
sudo ziti router enroll \ /var/lib/private/ziti-router/config.yml \ --jwt /tmp/router.jwt |
Cambiare il proprietario dei file root:root a nobody:nogroup con il comando:
|
0 1 2 3 4 |
sudo chown nobody:nogroup \ /var/lib/private/ziti-router/router.key \ /var/lib/private/ziti-router/router.cas \ /var/lib/private/ziti-router/router.server.chain.cert \ /var/lib/private/ziti-router/endpoints.yml |
Verificare le ACL con il comando:
|
0 |
sudo ls -la /var/lib/private/ziti-router/ |
Dovremmo visualizzare il seguente output:
|
0 1 2 3 4 5 6 |
drwxr-xr-x 2 nobody nogroup 4096 May 16 19:11 . drwx------ 4 root root 4096 May 16 19:05 .. -rw-r--r-- 1 nobody nogroup 1560 May 16 19:07 config.yml -rw------- 1 nobody nogroup 41 May 16 19:11 endpoints.yml -rw------- 1 nobody nogroup 4250 May 16 19:11 router.cas -rw------- 1 nobody nogroup 3243 May 16 19:11 router.key -rw------- 1 nobody nogroup 4252 May 16 19:11 router.server.chain.cert |
4.4 VERIFICARE LO STATO DEL ROUTER
Controllare che il servizio sia attivo con il comando:
|
0 |
sudo systemctl status ziti-router |
Dovremmo visualizzare il seguente output:
|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
● ziti-router.service - OpenZiti Router Loaded: loaded (/usr/lib/systemd/system/ziti-router.service; enabled; pres> Drop-In: /etc/systemd/system/ziti-router.service.d └─override.conf Active: active (running) since Sat 2026-05-16 19:17:07 UTC; 19ms ago Invocation: ae59ec8bd0e64710b62adac8855aeb8a Process: 6671 ExecStartPre=/opt/openziti/etc/router/entrypoint.bash check c> Main PID: 6680 (ziti) Tasks: 5 (limit: 6210) Memory: 3.2M (peak: 3.2M) CPU: 36ms CGroup: /system.slice/ziti-router.service └─6680 /opt/openziti/bin/ziti router run config.yml --extend May 16 19:17:07 servertest.lab.prv systemd[1]: Starting ziti-router.service - O> May 16 19:17:07 servertest.lab.prv entrypoint.bash[6671]: WARN: set VERBOSE=1 o> May 16 19:17:07 servertest.lab.prv entrypoint.bash[6671]: WARN: see output in '> May 16 19:17:07 servertest.lab.prv systemd[1]: Started ziti-router.service - Op> |
Verificare i log con il comando:
|
0 |
sudo journalctl -u ziti-router -f |
FASE 5 — CONFIGURAZIONE POLICY DI DEFAULT
Dopo l’installazione creare le policy per permettere a identità e servizi di usare il router.
Assicurati di essere loggato
|
0 |
ziti edge login servertest.lab.prv:1280 -u admin -p PASSWORD --yes |
Creare una Edge Router Policy (tutti i client possono usare router con attributo #public)
|
0 1 2 |
ziti edge create edge-router-policy "all-endpoints-all-routers" \ --edge-router-roles '#public' \ --identity-roles '#all' |
Creare una Service Edge Router Policy (tutti i servizi possono usare router #public)
|
0 1 2 |
ziti edge create service-edge-router-policy "all-services-all-routers" \ --edge-router-roles '#public' \ --service-roles '#all' |
FASE 6 – INSTALLAZIONE DELLA CONSOLE WEB (ZAC)
Installare il pacchetto della console con il comando:
|
0 |
sudo apt install -y openziti-console |
Poi bisogna abilitarla nel config del controller quindi aprire il config del controller con il comando:
|
0 |
sudo nano /var/lib/private/ziti-controller/config.yml |
Cercare la sezione web e aggiungere il binding zac.
Dovrebbe già esserci una sezione simile nel caso va aggiunto zac agli apis:
|
0 1 2 3 4 |
yaml apis: - binding: edge-management - binding: edge-client - binding: fabric - binding: zac |
Salvare e poi riavviare il controller con il comando:
|
0 |
sudo systemctl restart ziti-controller |
FASE 7 — ACCESSO ALLA CONSOLE WEB (ZAC)
Aprire il browser e richiamare il seguente link:
https://servertest.lab.prv:1280/zac
Se abbiamo fatto tutto correttamente dovremmo visualizzare una schermata come quella mostrata nell’immagine sovrastante
Inserire le credenziali di accesso
Username: admin
Password: quella impostata/generata al passo 3.2
Cliccare Login
ATTENZIONE: Il certificato è self-signed: accetta l’eccezione nel browser (è normale in ambiente lab).
Dovremmo visualizzare la Ziti Admin Console

0 commenti