OpenZiti: установка и настройка Zero Trust (ZTNA) на своём сервере

OpenZiti: Zero Trust доступ без открытых портов Docker

Реклама. ООО «ТАЙМВЭБ.КЛАУД», ИНН 7810945525.

Timeweb

OpenZiti — бесплатная платформа Zero Trust Network Access (ZTNA) с открытым исходным кодом под лицензией Apache 2.0. Её развивает компания NetFoundry. OpenZiti открывает доступ не ко всей сети, как VPN, а только к конкретным сервисам — и только тем пользователям и устройствам, которым это разрешено политиками. Сервису при этом не нужен ни один открытый входящий порт.

Статья обновлена в сентябре 2026 года для OpenZiti 2.0: установка контроллера и роутера из официальных пакетов, консоль ZAC, первый сервис без открытых портов, доступ к домашней сети вместо VPN, диагностика и сравнение с WireGuard, Tailscale и NetBird. Старая инструкция с демо-стендом в Docker Compose устарела.

Что такое OpenZiti

OpenZiti — это оверлейная сеть поверх обычного интернета. Все участники подключаются к ней исходящими соединениями, поэтому серверу не нужен белый IP и проброс портов, если рядом есть туннелер. Сеть состоит из нескольких частей:

  • контроллер — «мозг» сети: хранит identity, сервисы и политики, выдаёт сертификаты и решает, кто куда может подключиться;
  • роутеры (edge routers) — передают зашифрованный трафик между клиентами и сервисами; хотя бы один роутер должен быть доступен из интернета;
  • identity — удостоверение пользователя, устройства или сервера на основе сертификата x509; выдаётся через одноразовый JWT-токен;
  • туннелеры — клиенты Ziti Desktop Edge для Windows и macOS, Ziti Mobile Edge для Android и iOS и ziti-edge-tunnel для Linux; они перехватывают трафик приложений и отправляют его в оверлейную сеть;
  • SDK — библиотеки для Go, C, Java и Kotlin, Swift, C#, Python и Node.js, чтобы встроить Zero Trust прямо в приложение без туннелера.
Схема OpenZiti: клиент, роутер Ziti на VPS, контроллер и туннелер в домашней сети
Схема сети OpenZiti: клиент и туннелер подключаются к роутеру на VPS, порты дома не открыты

Что такое Zero Trust Network Access (ZTNA)

Zero Trust Network Access (ZTNA) — модель безопасности «никому не доверяй, всё проверяй». В классической сети устройство, попавшее внутрь периметра через VPN или локальную сеть, получает доступ почти ко всему. В модели ZTNA доверенной сети нет вообще: каждое подключение к каждому сервису проходит аутентификацию и проверку политик, где бы ни находился пользователь.

Главный практический плюс ZTNA — сервисы перестают быть видимыми из интернета. Сканер портов не найдёт ни панель управления, ни SSH, ни домашний NAS, потому что на них нет открытых портов. Украденный пароль тоже не поможет: без identity с сертификатом и разрешающей политики до сервиса не достучаться.

OpenZiti или VPN: в чём разница

  • Доступ к сервисам, а не к сети. VPN соединяет устройство с целой подсетью, OpenZiti — только с теми сервисами, которые разрешены политикой.
  • Нет входящих портов. VPN-серверу нужен открытый порт, а сервисы за Ziti доступны без проброса портов: туннелер сам подключается к роутеру.
  • Identity вместо общего ключа. У каждого устройства свой сертификат, его можно отозвать, не трогая остальных.
  • Свои DNS-имена. Сервису можно дать имя вроде nas.ziti — туннелер сам разрешит его и направит трафик в сеть.
  • Только TCP и UDP. ICMP в оверлее не передаётся, поэтому ping до сервиса не работает — проверяйте доступ через curl или браузер.

Если нужен просто быстрый туннель между своими серверами, WireGuard проще. OpenZiti выигрывает там, где важно точно разграничить, кто к чему имеет доступ, и спрятать сервисы из интернета.

Что понадобится для установки OpenZiti

  • VPS с белым IP-адресом на Ubuntu 24.04 или 26.04, Debian 12 или 13 — официальные пакеты есть для семейств Debian и Red Hat. Для личной сети хватит самого простого тарифа;
  • доменное имя для контроллера, например ziti.example.com, с A-записью на IP сервера. Скрипт установки требует постоянный адрес: он попадает в сертификаты, и менять его потом сложно;
  • открытые порты 1280/tcp для контроллера и 3022/tcp для роутера;
  • устройство в домашней сети для туннелера — мини-ПК, Raspberry Pi или любой Linux-сервер, если хотите открыть доступ к домашним сервисам.

Перед установкой подготовьте сервер по памятке по безопасности VPS: обновления, вход по SSH-ключу, UFW и Fail2ban.

Установка контроллера OpenZiti

Официальный скрипт подключает репозиторий проекта и ставит утилиту ziti. Затем установите пакет контроллера — запускайте команду в обычной SSH-сессии, чтобы скрипт настройки мог задать вопросы:

curl -sS https://get.openziti.io/install.bash | sudo bash -s openziti
sudo apt-get install openziti-controller

На AlmaLinux и Rocky Linux вместо apt-get используйте dnf install openziti-controller. Если настройка не запустилась сама, выполните скрипт вручную:

sudo /opt/openziti/etc/controller/bootstrap.bash

Скрипт спросит:

  • Are you joining an existing cluster? — N, создаём новую сеть. В OpenZiti 2.0 контроллер всегда работает в режиме кластера, даже если он один;
  • Permanent external address — DNS-имя контроллера, например ziti.example.com;
  • Node name и Trust domain — можно оставить значения по умолчанию;
  • Port — 1280;
  • Admin password — пусть скрипт сгенерирует случайный пароль, сохраните его;
  • Console — да, чтобы включить веб-консоль ZAC;
  • Certificate renewal timer — да, сертификаты будут продлеваться автоматически раз в месяц.

После успешной настройки служба ziti-controller запускается сама, а скрипт выводит готовую команду ziti edge login. Откройте порт и проверьте, что контроллер слушает его:

sudo ufw allow 1280/tcp
sudo ss -tlnp | grep ziti

Веб-консоль OpenZiti (ZAC)

Консоль администратора Ziti Admin Console (ZAC) ставится отдельным пакетом и работает на том же порту, что и контроллер:

sudo apt-get install openziti-console

Откройте https://ziti.example.com:1280/zac/ и войдите как admin с паролем из установки. Браузер предупредит о сертификате — контроллер использует собственный центр сертификации. Чтобы убрать предупреждение, выпустите сертификат Let’s Encrypt и укажите его в параметре alt_server_certs файла /var/lib/ziti-controller/config.yml — подробности в документации по консоли.

Всё, что описано ниже через командную строку, можно сделать и в консоли: разделы Identities, Services, Service Policies и Routers. Командами быстрее и проще повторить.

Установка роутера OpenZiti

Роутер можно поставить на тот же VPS. Сначала войдите в контроллер и создайте роутер — команда сохранит токен регистрации в файл. Ключ -t включает на роутере встроенный туннелер:

ziti edge login ziti.example.com:1280 -u admin -p 'ваш_пароль'
ziti edge create edge-router vps-router -t -o /tmp/vps-router.jwt

Установите пакет роутера и запустите настройку:

sudo apt-get install openziti-router
sudo /opt/openziti/etc/router/bootstrap.bash

Скрипт спросит постоянный внешний адрес роутера (DNS-имя или IP сервера), порт — по умолчанию 3022 — и токен регистрации: укажите путь /tmp/vps-router.jwt. Адрес контроллера роутер возьмёт из токена. Откройте порт и проверьте, что роутер в сети — в колонке ONLINE должно быть true:

sudo ufw allow 3022/tcp
ziti edge list edge-routers

Осталось разрешить identity и сервисам работать через роутеры. Для личной сети проще всего разрешить всё всем — точный доступ всё равно задают сервисные политики:

ziti edge create edge-router-policy all-routers-all-identities \
  --edge-router-roles '#all' --identity-roles '#all'
ziti edge create service-edge-router-policy all-routers-all-services \
  --edge-router-roles '#all' --service-roles '#all'

Первый сервис OpenZiti: доступ к домашнему NAS без открытых портов

Задача: открыть с ноутбука веб-интерфейс NAS по адресу 192.168.1.10:5000 в домашней сети, не пробрасывая порты на домашнем роутере и даже без белого IP. Так же публикуются Home Assistant, SSH, веб-интерфейс Proxmox или любой другой TCP-сервис.

Создайте две identity: laptop для ноутбука с атрибутом clients и home-gw для домашнего туннелера с атрибутом home-hosts. Атрибуты позволяют писать политики для групп, а не для каждого устройства:

ziti edge create identity laptop -a clients -o laptop.jwt
ziti edge create identity home-gw -a home-hosts -o home-gw.jwt

Теперь опишите сервис. Конфиг intercept.v1 говорит клиенту, какой адрес перехватывать (nas.ziti:5000), а host.v1 — куда туннелер отправит трафик в домашней сети:

ziti edge create config nas.intercept intercept.v1 \
  '{"protocols":["tcp"],"addresses":["nas.ziti"],"portRanges":[{"low":5000,"high":5000}]}'
ziti edge create config nas.host host.v1 \
  '{"protocol":"tcp","address":"192.168.1.10","port":5000}'
ziti edge create service nas --configs nas.intercept,nas.host -a home-services

И две политики: Dial разрешает клиентам подключаться к сервисам с атрибутом home-services, а Bind разрешает домашнему туннелеру их обслуживать:

ziti edge create service-policy home-dial Dial \
  --service-roles '#home-services' --identity-roles '#clients'
ziti edge create service-policy home-bind Bind \
  --service-roles '#home-services' --identity-roles '#home-hosts'
Политики OpenZiti: identity с атрибутами, политики Dial и Bind и сервисы
Политики OpenZiti связывают группы identity с группами сервисов через атрибуты

Туннелер в домашней сети

Скопируйте файл home-gw.jwt на домашний Linux-сервер или Raspberry Pi, поставьте ziti-edge-tunnel и добавьте identity:

curl -sS https://get.openziti.io/install.bash | sudo bash -s ziti-edge-tunnel
sudo systemctl enable --now ziti-edge-tunnel.service
sudo ziti-edge-tunnel add --jwt "$(< home-gw.jwt)" --identity home-gw

Туннелеру нужны только исходящие подключения к портам 1280 и 3022 вашего VPS — на домашнем роутере ничего открывать не нужно. Пакеты есть для x86_64 и arm64, подробности — в документации по туннелеру для Linux. Токен JWT одноразовый: после регистрации он больше не нужен, а для нового устройства создайте новую identity.

Подключение клиентов: Windows, macOS, Android, iOS, Linux

  • Windows — установите Ziti Desktop Edge, нажмите добавление identity и выберите файл laptop.jwt;
  • macOS — Ziti Desktop Edge из App Store, identity добавляется так же;
  • Android и iOS — приложение Ziti Mobile Edge из Google Play или App Store: добавьте identity из JWT-файла или по QR-коду, который показывает консоль ZAC на странице identity;
  • Linux — тот же ziti-edge-tunnel, что и дома.

После регистрации откройте в браузере http://nas.ziti:5000. Если страница загрузилась — сервис работает через Ziti, а из интернета NAS по-прежнему не виден.

OpenZiti как альтернатива VPN: доступ ко всей домашней сети

Если сервисов много, не обязательно описывать каждый. Можно сделать один сервис на всю подсеть — получится аналог VPN, но только для домашней сети, остальной трафик пойдёт напрямую:

ziti edge create config lan.intercept intercept.v1 \
  '{"protocols":["tcp","udp"],"addresses":["192.168.1.0/24"],"portRanges":[{"low":1,"high":65535}]}'
ziti edge create config lan.host host.v1 \
  '{"forwardProtocol":true,"allowedProtocols":["tcp","udp"],"forwardAddress":true,"allowedAddresses":["192.168.1.0/24"],"forwardPort":true,"allowedPortRanges":[{"low":1,"high":65535}]}'
ziti edge create service home-lan --configs lan.intercept,lan.host -a home-services

Конфиг host.v1 с параметрами forwardAddress и forwardPort передаёт трафик ровно на тот адрес и порт, к которому обращался клиент, но только внутри разрешённой подсети. Сервис получает атрибут home-services, поэтому созданные раньше политики Dial и Bind уже на него действуют.

  • Если сеть, где вы находитесь, тоже использует 192.168.1.0/24, адреса будут конфликтовать. Для домашней сети лучше выбрать редкую подсеть, например 192.168.77.0/24;
  • ping до домашних устройств не пройдёт — в оверлее передаются только TCP и UDP;
  • точечные сервисы вроде nas.ziti безопаснее: подсеть открывает клиенту всё, что в ней есть. Давайте доступ к подсети только своим устройствам.

Если нужен только доступ к Home Assistant, есть вариант проще — CloudPub для внешнего доступа без белого IP.

Проверка и диагностика OpenZiti

Команда policy-advisor показывает, какие сервисы доступны identity и через какие роутеры, а list terminators — кто сейчас обслуживает сервис. Если терминаторов нет, домашний туннелер не подключён:

ziti edge policy-advisor identities laptop -q
ziti edge list terminators 'service.name="nas"'
journalctl -u ziti-controller.service -n 50
journalctl -u ziti-router.service -n 50

Частые проблемы:

  • Сервис не виден в клиенте — нет политики Dial для identity или не созданы политики роутеров из раздела про установку роутера;
  • Сервис виден, но не открывается — нет политики Bind, туннелер офлайн или в host.v1 указан неверный адрес или порт;
  • Роутер или клиент не подключается — закрыты порты 1280 или 3022 на VPS, либо DNS-имя контроллера не указывает на сервер;
  • Регистрация не проходит — токен JWT уже использован или истёк: создайте identity заново;
  • ping не отвечает — это нормально, ICMP через OpenZiti не передаётся.

Безопасность OpenZiti: MFA, отзыв доступа и резервные копии

Двухфакторная аутентификация

Сертификат identity хранится на устройстве, поэтому при краже ноутбука или телефона его стоит дополнить вторым фактором. В OpenZiti это делает проверка состояния (posture check) типа MFA — её подключают к политике Dial:

ziti edge create posture-check mfa mfa-check -a mfa
ziti edge update service-policy home-dial --posture-check-roles '#mfa'

После этого сервисы откроются только тем, кто включил MFA в свойствах identity в Ziti Desktop Edge или Ziti Mobile Edge и отсканировал QR-код приложением-аутентификатором, например Aegis или 2FAS. Другие типы проверок — версия ОС, запущенный процесс, домен Windows — описаны в документации по posture checks.

Отзыв доступа

Если устройство потеряно, удалите его identity — доступ пропадёт сразу, а активные соединения будут закрыты. Остальные устройства продолжат работать, менять общий ключ, как в VPN, не нужно:

ziti edge delete identity phone

Резервная копия и обновление

Всё состояние контроллера — PKI, конфигурация и база данных — лежит в /var/lib/ziti-controller. Потеря этого каталога означает, что придётся заново регистрировать все роутеры и устройства, поэтому храните копию вне сервера:

sudo systemctl stop ziti-controller
sudo tar czf /root/ziti-controller-$(date +%F).tar.gz -C /var/lib ziti-controller
sudo systemctl start ziti-controller

Пакеты OpenZiti обновляются вместе с системой. Обновляйте сначала контроллер, затем роутеры и туннелеры:

sudo apt update && sudo apt upgrade

Так же можно спрятать от интернета и другие сервисы на своём сервере — например, Nextcloud или Matrix Synapse для своей семьи или команды.

Быстрый тест OpenZiti в Docker

Чтобы просто посмотреть на Ziti, можно запустить контроллер и роутер в одном контейнере. Разработчики называют такой вариант quickstart и рекомендуют его для обучения, а не для постоянной работы:

mkdir ziti && cd ziti
wget -O compose.yml https://get.openziti.io/dock/all-in-one/compose.yml
docker compose up -d

Контроллер будет доступен на порту 1280, роутер — на 3022, консоль ZAC — по адресу https://localhost:1280/zac/, логин admin, пароль по умолчанию — admin. Чтобы задать свой, перед запуском создайте рядом с compose.yml файл .env со строкой ZITI_PWD=ваш_пароль. Демо-стенд с «синей» и «красной» сетями из старой версии статьи по-прежнему описан в документации, но для реального использования ставьте пакеты, как описано выше.

OpenZiti и другие решения: WireGuard, Tailscale, NetBird

Коротко о том, чем OpenZiti отличается от популярных альтернатив:

РешениеМодель доступаСвой серверПорты на стороне сервисаКому подойдёт
OpenZitiк отдельным сервисам по политикамда, всё open sourceне нужнытем, кому нужен настоящий Zero Trust и SDK для приложений
WireGuardVPN-туннель к сетиданужен UDP-порт хотя бы на одной сторонебыстрый и простой VPN между своими узлами
Tailscalemesh-сеть на WireGuard с ACLнет, координация в облаке Tailscaleобычно не нужныбыстрый старт без своего сервера
Headscaleсвой сервер координации для клиентов Tailscaleданужен порт на сервере Headscaleсеть как в Tailscale, но под своим контролем
NetBirdmesh-сеть на WireGuard с политиками и SSOда или облакообычно не нужныmesh-сеть с удобной веб-панелью
Cloudflare Zero TrustZTNA как облачный сервиснетне нужныкомандам, которым удобен готовый облачный сервис

OpenZiti сложнее в первой настройке, чем Tailscale или NetBird, зато полностью работает на ваших серверах, не открывает сервисам ни одного порта и позволяет встроить Zero Trust прямо в собственное приложение через SDK.

Частые вопросы про OpenZiti

OpenZiti бесплатный?

Да. OpenZiti распространяется с открытым исходным кодом под лицензией Apache 2.0, ограничений на число пользователей и устройств нет. Компания NetFoundry продаёт на его основе облачный сервис и коммерческую поддержку.

Чем OpenZiti отличается от VPN?

VPN подключает устройство ко всей сети, а OpenZiti — только к разрешённым сервисам. У каждого устройства своя identity с сертификатом, а сервисам не нужны открытые входящие порты.

Нужен ли белый IP для OpenZiti?

Белый IP нужен только серверу с контроллером и роутером, например недорогому VPS. Домашним серверам и клиентам белый IP не нужен: туннелеры сами подключаются к роутеру исходящими соединениями.

Какие порты нужны OpenZiti?

По умолчанию контроллер использует порт 1280/tcp, а роутер — 3022/tcp. Консоль ZAC работает на порту контроллера по адресу /zac/.

Какие клиенты есть у OpenZiti?

Ziti Desktop Edge для Windows и macOS, Ziti Mobile Edge для Android и iOS и ziti-edge-tunnel для Linux. Кроме того, есть SDK для встраивания в собственные приложения.

Почему через OpenZiti не работает ping?

OpenZiti передаёт только TCP и UDP, протокол ICMP в сеть не попадает. Проверяйте доступ к сервисам через curl, браузер или SSH.

Можно ли включить двухфакторную аутентификацию в OpenZiti?

Да. Создайте posture check типа MFA и подключите его к политике Dial. Пользователь включает MFA в клиенте Ziti и подтверждает вход кодом из приложения-аутентификатора.

Как отозвать доступ у потерянного устройства?

Удалите его identity командой ziti edge delete identity или в консоли ZAC. Доступ пропадёт сразу, активные соединения закроются, а остальные устройства продолжат работать.

Рубрики: Docker Безопасность Веб-приложения
Подписаться на новые статьи (RSS)

Без почты и трекеров — только лента обновлений.

Также есть английская лента

Оцените статью
Добавить комментарий