devzone.org.ua/post/zapusk-routera-yggdrasil-bez-root.md
postscriptum 9c2826aed9 add dot
2026-01-31 05:54:49 +02:00

2.9 KiB
Raw Permalink Blame History

Запуск роутера Yggdrasil без root

Якось, на новому сервері Debian, було передвстановлено Yggdrasil з репозиторію. Оскільки сам я збираю роутер з сорсу і створюю для нього самопальний сервіс для root, тоді я випадково повалив собі конект давши права 0400 на файл конфігурації створений від рута.

Поліз розбиратись і помітив, що користувач там yggdrasil:

[Unit]
Description=yggdrasil
Wants=network-online.target
After=network-online.target

[Service]
User=yggdrasil
Group=yggdrasil
ProtectHome=true
ProtectSystem=strict
NoNewPrivileges=true
RuntimeDirectory=yggdrasil
ReadWritePaths=/var/run/yggdrasil /run/yggdrasil
SyslogIdentifier=yggdrasil
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
ExecStartPre=+-/sbin/modprobe tun
ExecStart=/usr/sbin/yggdrasil -useconffile /etc/yggdrasil/yggdrasil.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
TimeoutStopSec=5

[Install]
WantedBy=multi-user.target

По суті, користувач root - потрібен роутерові лише для створення інтерфейсу tun. І як бачимо, надання привілеїв CAP_NET_ADMIN і CAP_NET_BIND_SERVICE - цілком вирішує цю проблему, хоча й не без недоліків.

Для запобігання помилки прав доступу до розташування /var/run, також потрібно змінити стандартну адресу сокета, додавши згідно шляхів systemd теку yggdrasil:

AdminListen: unix:///var/run/yggdrasil/yggdrasil.sock

Думаю зробити те само для Mycelium, бо мене тема пускання від рута давно параноїть і я просто вимикаю роутер, коли ним не користуюсь. UPD: зробив.

P.S. збирання програм від рута - це ще одна дурнувата звичка, через що (ймовірно) я колись вхопив невловимий малварь, який благополучно здох тільки разом зі старим сервером.