ZeroTier

ZeroTier — это программное обеспечение с открытым исходным кодом, предназначенное для создания виртуальных частных сетей (VPN) на основе концепции «сети как услуги» (Network as a Service). Оно позволяет объединять устройства, находящиеся в разных физических сетях и географических локациях, в одну логическую сеть, как если бы они были подключены к одному локальному коммутатору. Это особенно полезно для удалённой работы, распределённых команд, IoT-устройств или гибридных облачных инфраструктур, где требуется безопасное и прозрачное сетевое взаимодействие.
Архитектура ZeroTier основана на децентрализованной модели с использованием глобальной распределённой системы управления, называемой планетой (Planet). Планета — это набор публичных корневых серверов (roots), которые обеспечивают начальное обнаружение узлов и маршрутизацию между ними. Каждая сеть в ZeroTier идентифицируется 64-битным идентификатором и управляется через веб-интерфейс или API. Администратор может настраивать правила доступа, IP-адресацию, маршруты и другие параметры, не требуя сложной настройки на каждом клиенте.
Когда устройство (нода) подключается к сети ZeroTier, оно получает виртуальный сетевой интерфейс с собственным MAC- и IP-адресом. Весь трафик между узлами шифруется с использованием современных криптографических протоколов (на основе Curve25519, Salsa20 и Poly1305), что обеспечивает высокий уровень безопасности. ZeroTier использует технологию peer-to-peer (P2P): как только узлы обнаруживают друг друга через корневые серверы, они стремятся установить прямое соединение, минуя центральные серверы, что снижает задержки и нагрузку на инфраструктуру.
Если прямое P2P-соединение невозможно (например, из-за NAT или файрволов), ZeroTier автоматически переключается на ретрансляцию трафика через промежуточные реле-серверы (relays), обеспечивая работоспособность сети в любых условиях. При этом вся логика маршрутизации и авторизации остаётся прозрачной для пользователя — достаточно установить клиент и присоединиться к нужной сети по её идентификатору.
ZeroTier поддерживает все основные операционные системы — Windows, macOS, Linux, Android, iOS, а также может работать на маршрутизаторах и встраиваемых устройствах. Это делает его универсальным решением для создания защищённых и масштабируемых сетей без необходимости в сложной настройке традиционных VPN-серверов или специализированного оборудования.
Важно отметить, что, несмотря на использование централизованных компонентов (планеты и реле), ZeroTier сохраняет контроль за сетью в руках её владельца: администратор полностью управляет политиками доступа, а трафик между доверенными узлами остаётся зашифрованным и не подвержен вмешательству со стороны третьих лиц, включая саму компанию ZeroTier. Это сочетание простоты, безопасности и гибкости делает ZeroTier популярным выбором как для частных пользователей, так и для корпоративных сред.
TIP
Ссылка на последнюю версю пакета для Альт Линукс https://git.altlinux.org/tasks/337183/build/100/x86_64/rpms/zerotier-one-1.12.2-alt1.x86_64.rpm
Сейчас последняя версия это 1.16.0, а для альта - 1.12.2, так как он был удалён из репозитория https://packages.altlinux.org/ru/sisyphus/srpms/zerotier-one/
Вот графический интерфейс контроллера: https://github.com/key-networks/ztncui
Вот графический интерфейс клиента: https://github.com/zerotier/DesktopUI
Дублирую ссылки на мои пакеты
ZeroTier-One: zerotier-one-1.16.0-alt1.x86_64.rpm
ZeroTier-One NonFree: zerotier-one-1.16.0-alt1.nf.x86_64.rpm
ZeroTier Desktop UI: zerotier-desktop-ui-1.8.3-alt1.x86_64.rpm
ZTNCUI: ztncui-0.8.14-alt1.x86_64.rpm
Пишите, если будут ошибки)
Ниже описаны мои потуги по сборке последней версии ZeroTierOne для Альт Линукс П11 (версия 1.16.0 на момент написания статьи), а также пакетов DesktopUI и ztncui.
Сборка rpm-пакета ZeroTier-One
- Устновка необходимых пакетов (скорее всего тут перечислены не все)
apt-get install rpmdevtools rpm-build gcc-c++ git-core gem-ronn-ng gem-ronn ronn libstdc++-devel libminiupnpc-devel rust rust-cargo udev-rules clang libssl-devel libminiupnpc-devel- Не знаю почему, но я не использовал
GEAR, так что собирал чисто с помощьюrpmbuild. Подготавливаем дерево каталогов для сборки:
rpmdev-setuptree- Просто куда-нибудь клонируем два репозитория: один с исходниками и готовой спекой для 1.12.2 версии, и второй - последняя версия от разработчиков:
git clone http://git.altlinux.org/gears/z/zerotier-one.gitgit clone https://github.com/zerotier/ZeroTierOne.git- Переходим в директорию с 1.12.2 версией и начинаем шаманить:
cd zerotier-one- Редактируем спеку, меняем только версию (можно ещё changelog написать, если охота):
Version: 1.16.0WARNING
Для некоммерческого использования: в строку 58 добавляем параметр ZT_NONFREE=1:
%make_build ZT_USE_MINIUPNPC=1 ZT_NONFREE=1 oneПри добавлении данного параметра должна произойти Non Free сборка, содержащая контролер, ранее же этот контроллер шёл в поставке свободно, теперь только так (подробнее об этом ниже).
- Копируем спеку в директорию сборки:
cp zerotier-one.spec ~/RPM/SPECS/- Создаем директорию:
mkdir -p zerotier-one-development-1.16.0- Копируем какие-то растовские файлы:
cp -R zerotier-one/zeroidc zerotier-one-development-1.16.0/- Проваливаемся в скопированные файлы:
cd zerotier-one-development-1.16.0/zeroidc- Генерируем директорию
vendor:
cargo vendor- Переносим сгенерированную директорию:
mv ./vendor ../Должна получиться следующая структура:
zerotier-one-development-1.16.0/
├── vendor
└── zeroidc- Поднимаемся на уровень выше:
cd ..- Архивируем директорию и сразу переносим её в нашу сборочницу:
tar cvf ~/RPM/SOURCES/zerotier-one-development-1.16.0.tar zerotier-one-development-1.16.0- Теперь работаем с исходниками.
cd ..- После клонирования должна быть директория
ZeroTierOne. Переименовываем её:
mv ZeroTierOne zerotier-one-1.16.0- Архивируем директорию и сразу переносим её в нашу сборочницу:
tar cvf ~/RPM/SOURCES/zerotier-one-1.16.0.tar zerotier-one-1.16.0- Если всё сделано правильно и я нигде не ошибся при описании, то можно проводить сборку пакета:
rpmbuild -ba ~/RPM/SPECS/zerotier-one.spec- По завершению сборки должен появиться пакет
~/RPM/RPMS/x86_64/zerotier-one-1.16.0-alt1.x86_64.rpm, который можно попробовать установить:
apt-get install ~/RPM/RPMS/x86_64/zerotier-one-1.16.0-alt1.x86_64.rpm- Проверьте его статус после установки (он не должен быть запущен) и действуйте дальше сами):
systemctl status zerotie-oneWARNING
Эта инструкция далеко не истина в последней инстанции. Собирал по наитию, как ёжик в тумане. А устанавливал этот пакет я вообще поверх уже установленной версии 1.12.2, и вот что плохое у меня случилось:
- После обновления, ztncui, не смотря на то, что увидел zerotier, выдает ошибку HTTPError: Response code 404 (Not Found), но при этом ZeroTier version 1.16.0 он определяет. Вот за это всё-таки обидно.
P.S. по пункту 2:
Открыл я тут ZeroTier Release Notes 2025-08-21 -- Version 1.16.0 и вот что тут написано: The network controller (`controller/`) is now under a commercial source-available license. Default binary builds no longer contain the controller.
То есть, он теперь идёт отдельно и не поставляется вместе с клиентом, который я собирал. Ну, теперь хотя бы понятно, почему вебморда контроллера не работает как надо)
Но при этом у меня продолжила спокойно работать сеть, созданная на сайте zerotier.com, панель управления увидила, что у меня последняя версия.
P.S.2 по пункту 2:
Контроллер по-прежнему существует в основном репозитории ZeroTierOne, но теперь находится в подкаталоге: ZeroTierOne/nonfree/controller/
Для некоммерческого использования: можно попробовать собрать из исходников с ZT_NONFREE=1.
make ZT_NONFREE=1DANGER
В принципе, я считаю, что шалость удалась. Вот сама собранная rpm`ка (без контроллера) если кому надо: zerotier-one-1.16.0-alt1.x86_64.rpm
Также, собрал Non Free версию: zerotier-one-1.16.0-alt1.nf.x86_64.rpm
Desktop UI
Соберём и сделаем автозапуск графического интерфейса, который будет висеть в трее. С помощью него можно подключаться к сетям и чёт там настраивать.
WARNING
Была попытка сборка именно релиза 1.8.3, а не текущего состояния main ветки (6 октября 2025 года). Там у меня проблема с зависимостями, а именно tauri-libappindicator-sys требует именно appindicator3 которого в Альте нет и ради которого делается патч (при сборке пакета).
TIP
Кстати, в репозитории уже несколько лет висит Pull Request на тоже самое, что мы тут патчим: https://github.com/zerotier/DesktopUI/pull/57
WARNING
Для работы этого трея нужно, чтобы хотя бы единожды у пользователя, который запускает сервис, были права на sudo, потом их можно отключить. Иначе Вы увидите ошибку sudo (я тестил на чистой машине)
Сборка руками из исходников
- Устанавливаем необходимые пакеты:
apt-get install meson ninja-build libgtk+3-devel pkg-config libayatana-appindicator3-devel- Клонируем репозиторий:
git clone https://github.com/zerotier/DesktopUI.gitTIP
Кстати, без изменений этой инструкции, по состоянию на 6 октября 2025 года, можно собрать ветку 1.16.0 из этого же репозитория:
git clone -b 1.16.0 https://github.com/zerotier/DesktopUI.git- Переходим в корень склонированного репозитория. Дальше я никуда перемещаться не буду. Все пути будут описаны от этой точки.
cd DesktopUI- Редактируем файл
tray/Makefileстроки 24 и 25:
TRAY_CFLAGS := $(OPT_FLAGS) -DTRAY_APPINDICATOR=1 $(shell pkg-config --cflags appindicator3-0.1) -std=c99
TRAY_LDFLAGS := $(shell pkg-config --libs appindicator3-0.1)Необходимо заменить appindicator3-0.1 на ayatana-appindicator3-0.1.
- Редактируем файл
tray/tray.hстроку 34
#include <libappindicator/app-indicator.h>Необходимо заменить libappindicator/app-indicator.h на libayatana-appindicator/app-indicator.h
- Редактируем файл
build.rsстроку 17:
println!("cargo:rustc-link-lib=dylib=appindicator3");Необходимо заменить appindicator3 на ayatana-appindicator3.
- Начинаем процесс сборки:
make- Далее будет настраивать автозапуск. Переносим собранный бинарный файл:
mv ./target/debug/zerotier_desktop_ui /usr/local/bin/- Будем создавать пользовательский юнит systemd. Создаём директорию для юнитов (если её нет):
mkdir -p ~/.config/systemd/user- Создаём файл юнита:
nano ~/.config/systemd/user/zerotier-desktop-ui.service- Вставляем следующее содержимое:
[Unit]
Description=ZeroTier Desktop UI
After=graphical-session.target
PartOf=graphical-session.target
[Service]
Type=simple
ExecStart=/usr/local/bin/zerotier_desktop_ui
Restart=on-failure
RestartSec=5
Environment=DISPLAY=:0
Environment=XDG_RUNTIME_DIR=/run/user/%U
[Install]
WantedBy=default.target- Перезагрузка конфигурации systemd для пользователя:
systemctl --user daemon-reload- Включение автозапуска:
systemctl --user enable zerotier-desktop-ui.service- Запустк сервиса:
systemctl --user start zerotier-desktop-ui.serviceСобираем rpm-пакет
- Клонируем репозиторий:
git clone https://github.com/zerotier/DesktopUI.gitTIP
Кстати, без изменений этой инструкции, по состоянию на 6 октября 2025 года, можно собрать ветку 1.16.0 из этого же репозитория:
git clone -b 1.16.0 https://github.com/zerotier/DesktopUI.git- Переименуйте директорию
DesktopUIвDesktopUI-1.8.3:
mv DesktopUI DesktopUI-1.8.3- Создаём файл
zerotier-desktop-ui.spec
Name: zerotier-desktop-ui
Version: 1.8.3
Release: alt1
Summary: ZeroTier Desktop UI — system tray application for managing ZeroTier networks
Group: Applications/Internet
License: MPL-2.0
URL: https://github.com/zerotier/DesktopUI
# Build dependencies
BuildRequires: meson
BuildRequires: ninja-build
BuildRequires: pkgconfig(gtk+-3.0)
BuildRequires: pkgconfig(ayatana-appindicator3-0.1)
BuildRequires: rust
# Runtime dependencies
Requires: zerotier-one
# Патчи для совместимости с Ayatana AppIndicator
Patch0: use-ayatana-appindicator.patch
Source0: %{name}-%{version}.tar
%description
ZeroTier Desktop UI is a system tray application that allows you to manage ZeroTier networks
from your desktop environment. This RPM builds the UI with Ayatana AppIndicator support.
%prep
%setup -q -n DesktopUI-%{version}
# Применяем патч для замены appindicator → ayatana-appindicator
%patch0 -p1
%build
# Сборка через make (внутри Makefile вызывается cargo и meson)
make %{?_smp_mflags}
%install
# Очистка
rm -rf %{buildroot}
# Установка бинарника
install -Dm755 target/debug/zerotier_desktop_ui \
%{buildroot}%{_bindir}/zerotier_desktop_ui
# Установка systemd user unit
install -Dm644 packaging/systemd/zerotier-desktop-ui.service \
%{buildroot}%{_userunitdir}/zerotier-desktop-ui.service
%files
%{_bindir}/zerotier_desktop_ui
%{_userunitdir}/zerotier-desktop-ui.service
%changelog
* Mon Oct 06 2025 Nikita Bystrov bystrovno@basealt.ru - 1.8.3-alt1
- Initial RPM package for ZeroTier Desktop UI with Ayatana AppIndicator support- Вам понадобится создать патч, который автоматизирует изменения, описанные в шагах 4–6 инструкции по ручной сборке:
- Распакуйте исходники релиза во временную директорию (или скопируйте директорию
DesktopUI-1.8.3)
tar -xzf DesktopUI-1.8.3.tar.gz /tmp/DesktopUI-1.8.3Или
cp DesktopUI-1.8.3/ /tmp/DesktopUI-1.8.3- Перейдите в данную директорию
cd /tmp/DesktopUI-1.8.3- Сохраните исходное состояние исходных файлов.
git initgit add .git commit -m "original"- Внесите нужные изменения вручную:
tray/Makefile: Найдите строки с appindicator3-0.1 и замените на ayatana-appindicator3-0.1:
sed -i 's/appindicator3-0.1/ayatana-appindicator3-0.1/g' tray/Makefiletray/tray.h: Замените заголовок:
sed -i 's|libappindicator/app-indicator.h|libayatana-appindicator/app-indicator.h|' tray/tray.hbuild.rs: Замените имя библиотеки:
sed -i 's/appindicator3/ayatana-appindicator3/' build.rs- Сгенерируйте новый патч
git diff > ~/RPM/SOURCES/use-ayatana-appindicator.patch- Проверьте патч
cd /tmp/DesktopUI-1.8.3git reset --hard # или удалите измененияpatch -p1 < ~/RPM/SOURCES/use-ayatana-appindicator.patchЕсли нет ошибок — патч готов.
Должен получиться следующий патч use-ayatana-appindicator.patch:
diff --git a/build.rs b/build.rs
index a332a99..e6edaab 100644
--- a/build.rs
+++ b/build.rs
@@ -14,6 +14,6 @@ fn main() {
println!("cargo:rustc-link-lib=dylib=gdk-3");
println!("cargo:rustc-link-lib=dylib=gobject-2.0");
println!("cargo:rustc-link-lib=dylib=glib-2.0");
- println!("cargo:rustc-link-lib=dylib=appindicator3");
+ println!("cargo:rustc-link-lib=dylib=ayatana-appindicator3");
}
}
diff --git a/tray/Makefile b/tray/Makefile
index 2111412..2b6ed01 100644
--- a/tray/Makefile
+++ b/tray/Makefile
@@ -21,8 +21,8 @@ else ifeq ($(shell uname -s),Linux)
else
OPT_FLAGS := -Og
endif
- TRAY_CFLAGS := $(OPT_FLAGS) -DTRAY_APPINDICATOR=1 $(shell pkg-config --cflags appindicator3-0.1) -std=c99
- TRAY_LDFLAGS := $(shell pkg-config --libs appindicator3-0.1)
+ TRAY_CFLAGS := $(OPT_FLAGS) -DTRAY_APPINDICATOR=1 $(shell pkg-config --cflags ayatana-appindicator3-0.1) -std=c99
+ TRAY_LDFLAGS := $(shell pkg-config --libs ayatana-appindicator3-0.1)
else ifeq ($(shell uname -s),Darwin)
RM=rm -f
LIB_NAME=libzt_desktop_tray.a
diff --git a/tray/tray.h b/tray/tray.h
index fe18fea..0ed4ffc 100644
--- a/tray/tray.h
+++ b/tray/tray.h
@@ -31,7 +31,7 @@ void tray_update(struct tray *tray);
#if defined(TRAY_APPINDICATOR)
#include <gtk/gtk.h>
-#include <libappindicator/app-indicator.h>
+#include <libayatana-appindicator/app-indicator.h>
#define TRAY_APPINDICATOR_ID "tray-id"- Создайте папку
DesktopUI-1.8.3/packaging/systemd/в корне исходников (не/tmp!) и поместите туда файлDesktopUI-1.8.3/packaging/systemd/zerotier-desktop-ui.service:
[Unit]
Description=ZeroTier Desktop UI
After=graphical-session.target
PartOf=graphical-session.target
[Service]
Type=simple
ExecStart=/usr/bin/zerotier_desktop_ui
Restart=on-failure
RestartSec=5
Environment=DISPLAY=:0
Environment=XDG_RUNTIME_DIR=/run/user/%U
[Install]
WantedBy=default.target- Установите зависимости:
apt-get install rpm-build meson ninja-build gtk3-devel libayatana-appindicator3-devel rust cargo- Подготовьте сборочницу, перенеся все подготовленные файлы:
cp zerotier-desktop-ui.spec ~/RPM/SPECS/cp use-ayatana-appindicator.patch ~/RPM/SOURCES/tar cvf ~/RPM/SOURCES/zerotier-desktop-ui-1.8.3.tar DesktopUI-1.8.3/- Соберите:
rpmbuild -ba ~/RPM/SPECS/zerotier-desktop-ui.specDANGER
В принципе, я считаю, что шалость2 удалась. Вот сама собранная rpmка (из ветки 1.16.0) если кому надо: zerotier-desktop-ui-1.8.3-alt1.x86_64.rpm (Вероятнее всего пакет вообще не установится без уже установленного zerotier-one и будет кричать, что пакет битый, так как apt не сможет сам удовлетворить зависимость)
Так, обнаружена проблемка, что это програ требует права sudo у твоего пользователя.
После установки пакета необходимо включить сервис:
systemctl --user enable --now zerotier-desktop-ui.serviceztncui
DANGER
Вот собранный пакет: ztncui-0.8.14-alt1.x86_64.rpm Так, ну вроде пакет рабочий, я исправил права доступа, теперь вроде как всё нормально
Данный пакет:
- Устанавливает приложение в
/opt/ztncui - Управляет службой через systemd (
ztncui.service)
- Убедитесь, что установлены необходимые пакеты для сборки и создано дерево сборки:
apt-get install rpm-build git nodejs npm gcc-c++ make- Также установите
node-gypглобально:
npm install -g node-gyp- Клонирование репозитория:
cd /tmpgit clone https://github.com/key-networks/ztncui.git- Создаём архив исходников (имя должно соответствовать версии)
tar -czf ~/RPM/SOURCES/ztncui-0.8.14.tar.gz ztncui- Создайте файл
~/RPM/SPECS/ztncui.specсо следующим содержимым:
Name: ztncui
Version: 0.8.14
Release: alt1
Summary: ZeroTier Network Controller Web UI
License: GPL-3.0-or-later
Group: Applications/Internet
AutoReqProv: no
URL: https://github.com/key-networks/ztncui
Source0: %{name}-%{version}.tar.gz
# Зависимости
Requires: nodejs >= 14
Requires: npm
Requires: zerotier-one
BuildRequires: npm
BuildRequires: gcc-c++
BuildRequires: make
%description
ztncui is a web-based user interface for managing a standalone ZeroTier network controller.
%prep
%setup -q -n %{name}
%build
cd src
npm install --production
%install
rm -rf %{buildroot}
# Основная установка в /opt
install -d %{buildroot}/opt/%{name}
cp -r . %{buildroot}/opt/%{name}/
# Удаляем .git и ненужные файлы
rm -rf %{buildroot}/opt/%{name}/.git*
# Создаём конфигурационный каталог
install -d %{buildroot}/etc/%{name}
install -d %{buildroot}/var/lib/%{name}
# Systemd unit
install -d %{buildroot}%{_unitdir}
cat > %{buildroot}%{_unitdir}/%{name}.service << 'EOF'
[Unit]
Description=ZeroTier Network Controller UI
After=network.target zerotier-one.service
[Service]
Type=simple
User=zerotier-one
Group=zerotier-one
WorkingDirectory=/opt/ztncui/src
EnvironmentFile=-/opt/ztncui/src/.env
ExecStart=/usr/bin/npm start
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
%post
# Копируем passwd, если не существует
if [ ! -f /opt/ztncui/src/etc/passwd ]; then
cp -v /opt/ztncui/src/etc/default.passwd /opt/ztncui/src/etc/passwd
chown zerotier-one:zerotier-one /opt/ztncui/src/etc/passwd
chmod 600 /opt/ztncui/src/etc/passwd
fi
# Создаём .env, если не существует
if [ ! -f /opt/ztncui/src/.env ]; then
ZT_TOKEN=$(cat /var/lib/zerotier-one/authtoken.secret 2>/dev/null || echo "YOUR_TOKEN_HERE")
cat > /opt/ztncui/src/.env << EOF
ZT_TOKEN=$ZT_TOKEN
NODE_ENV=production
EOF
chown zerotier-one:zerotier-one /opt/ztncui/src/.env
chmod 600 /opt/ztncui/src/.env
fi
# Перезагружаем systemd, чтобы увидеть новый unit
systemctl daemon-reload || :
%files
%attr(755, zerotier-one, zerotier-one) /opt/%{name}
%dir %attr(755, zerotier-one, zerotier-one) /etc/%{name}
%{_unitdir}/%{name}.service
%dir %attr(755, zerotier-one, zerotier-one) /var/lib/%{name}
%changelog
* Tue Oct 07 2025 Nikita Bystrov bystrovno@basealt.ru - 0.8.14-alt1
- Initial RPM package for ALT Linux- Сборка RPM:
rpmbuild -ba ~/RPM/SPECS/ztncui.spec- Если всё прошло успешно, RPM-пакет будет в:
ls -l ~/RPM/RPMS/x86_64/ztncui-0.8.14-alt1.x86_64.rpm- Установка и запуск:
apt-get install ~/RPM/RPMS/ztncui-0.8.14-alt1.x86_64.rpmУбедитесь, что ZeroTier запущен
systemctl enable --now zerotier-oneЗапустите ztncui
systemctl enable --now ztncuiПроверьте статус
systemctl status ztncuiДоступ к веб-интерфейсу:
По умолчанию:
- HTTP на
http://localhost:3000
Также в файл /opt/ztncui/src/.env можно добавить следующее:
HTTP_ALL_INTERFACES=yesПриложение можно заставить прослушивать все интерфейсы для HTTP-запросов, установивHTTP_ALL_INTERFACESв.envфайл.HTTPS_PORT=3443HTTPS_HOST=12.34.56.78Приложение можно заставить прослушивать на определенном интерфейсе HTTPS-запросов, указавHTTPS_HOST (имя хоста или IP-адрес интерфейса)в.envфайл. ЕслиHTTPS_HOSTне указан, но указаноHTTPS_PORT, то приложение будет прослушивать запросы HTTPS на всех интерфейсах.
Важные замечания:
authtoken.secret: Пакет пытается автоматически прочитать токен из /var/lib/zerotier-one/authtoken.secret. Убедитесь, что zerotier-one установлен и запущен до установки ztncui (Нужно, чтобы zerotier-one был собран вместе с контроллером, иначе, очевидно, работать не будет) (Вероятнее всего пакет вообще не установится без уже установленного zerotier-one и будет кричать, что пакет битый, так как apt не сможет сам удовлетворить зависимость).
