
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