Root-режим
На рутованном устройстве демон работает от root, через su, на настоящем интерфейсе ядра tailscale0, с policy routing вокруг него. Слот VPN в Android остаётся свободным для другого приложения. Демон может стартовать при загрузке без приложения, а команда tailscale работает в Termux и root-консоли.
Что нужно
Заголовок раздела «Что нужно»- Root от Magisk, KernelSU или APatch, выданный TailSocks.
- Больше ничего готовить не надо. Правила маршрутизации приложение пишет само, а на устройстве с SELinux в режиме enforcing само добавляет единственное нужное ему правило политики — тогда, когда оно понадобится.
Как включить
Заголовок раздела «Как включить»- Настройки → Режим туннеля → Root. На телевизоре: Настройки → Дополнительно → Root-режим.
- Внимание: Экспериментальный режим — нажмите Понятно, включить.
- Root-менеджер спросит, выдать ли TailSocks root. Без него приложение скажет Root-доступ (su) не предоставлен или недоступен и останется в прежнем режиме.
Если до этого был режим VPN (TUN), VPN выключится, а его место займёт интерфейс ядра.
Всё остальное — в карточке Root-режим и системная служба (ЭКСПЕРИМЕНТАЛЬНО):
- Нативный Linux TUN (tailscale0) — по умолчанию включено: интерфейс ядра. Если выключить, демон работает через
suтолько как прокси, с настройками из Локальных прокси. - Исключенные приложения — приложения, которые не идут через выходной узел. Тот же список, что в режиме VPN.
- Автозапуск Magisk/KernelSU службы (ЭКСПЕРИМЕНТАЛЬНО) — загрузочный скрипт.
- Установить консольную утилиту Tailscale CLI (ЭКСПЕРИМЕНТАЛЬНО) — команда
tailscale. - Игнорировать чужие VPN — по умолчанию включено. Демон помечает свои соединения, чтобы другой VPN их не перехватил. Выключайте, только если этот туннель должен идти внутри того VPN.
- Всё равно занять устройство — по умолчанию выключено. См. рядом с другим VPN.
- Завершать Root-демон при остановке — по умолчанию включено. См. остановку.
Системный DNS через MagicDNS (Настройки → DNS, по умолчанию включено) отправляет DNS всего устройства в MagicDNS. Работает, только пока включено Использовать MagicDNS.
Что идёт через tailnet
Заголовок раздела «Что идёт через tailnet»- Адреса tailnet — от всех приложений, всегда.
- С выходным узлом — всё, что отправляет устройство, кроме Исключенных приложений и локальной сети при включённом Доступ к локальной сети (Настройки → Аккаунт и подключение).
- Запросы имён всех приложений — через MagicDNS, при включённом Системный DNS через MagicDNS.
Root-режим — только клиент: в нём это устройство не может быть выходным узлом или subnet-роутером для других.
Исключённые приложения и DNS
Заголовок раздела «Исключённые приложения и DNS»Исключённое приложение не идёт через выходной узел, но адреса tailnet ему по-прежнему доступны. А вот имена ему всё равно разрешает MagicDNS: обычному приложению Android ищет имена от своего имени, и правило для отдельного приложения этих запросов не видит. Системный резолвер вернётся только тем, кто разрешает имена сам, — встроенному резолверу Chrome, клиенту DoH или DoT, curl в Termux.
Если приложению нужен именно системный резолвер — блокировщику рекламы, приложению частного DNS, — выключите Системный DNS через MagicDNS.
Рядом с другим VPN
Заголовок раздела «Рядом с другим VPN»Root-режим не отбирает устройство у VPN-приложения. Если слот VPN в Android держит другое приложение, TailSocks уступает:
- Адреса tailnet, имена MagicDNS и локальные прокси работают у всех приложений.
- Если тот VPN забрал все приложения, выходной узел и системный DNS выключены, пока он работает. Карточка статуса: Только tailnet — устройство держит другой VPN, а выходной узел показан как неиспользуемый.
- Если часть приложений он оставил вне туннеля, TailSocks ведёт именно их — с выходным узлом и MagicDNS. Карточка статуса: Ведём приложения вне чужого VPN, выходной узел — Выходной узел: частично.
- Всё равно занять устройство забирает маршрут по умолчанию и DNS для всех приложений. Приложения того VPN остаются без туннеля и без его фильтрации, а сам он об этом не узнаёт. По умолчанию выключено и перед включением спрашивает.
Перезапускать ничего не нужно: TailSocks замечает, когда другой VPN запускается, останавливается или меняет свои приложения, и подстраивается.
Что настроить в другом VPN
Заголовок раздела «Что настроить в другом VPN»Ничего из этого не обязательно, но так они уживаются лучше:
- Исключите TailSocks из его туннеля (поприложенный прокси в режиме обхода или его список исключений). Иначе всё, что TailSocks делает помимо самого туннеля, — канал управления, обновления, Admin API — пойдёт через чужой туннель, и сбой там будет выглядеть как сбой здесь.
- Держите его собственные адреса вне диапазонов tailnet,
100.64.0.0/10иfd7a:115c:a1e0::/48: его сервер, его DNS-сервер, подсеть его интерфейса. TailSocks отправляет эти диапазоны в tailnet для всех приложений. - Чтобы tailnet был внутри другого VPN, направьте его исходящий трафик на SOCKS5-прокси (по умолчанию
127.0.0.1:48115, с паролем из Локальных прокси, если вы его задали), а DNS — на127.0.0.1:1053. Всё, что идёт через прокси, следует за tailnet и выходным узлом, что бы ни держал другой VPN.
Третий пункт значит, что прокси-клиент и Root-режим работают вместе: клиент держит устройство и отправляет в TailSocks выбранные вами приложения.
Загрузочный скрипт
Заголовок раздела «Загрузочный скрипт»Автозапуск Magisk/KernelSU службы ставит /data/adb/service.d/tailscaled.sh. Root-менеджер запускает его при каждой загрузке, от root, раньше любых приложений. Он поднимает демона так же, как подняло бы приложение, — тот же аккаунт, прокси, прокси для control plane и параметры демона, которые приложение передаёт ему при каждом запуске Root-режима.
- Обновление приложения само обновляет скрипт.
- Скрипт, записанный другой версией, под переключателем помечен как устаревший (Скрипт устарел). Нажмите Переустановить скрипт.
После перезагрузки
Заголовок раздела «После перезагрузки»Загрузочный скрипт запускает демона и делает tailnet доступным — и всё. Выходной узел, маршруты подсетей для остальных приложений и системный MagicDNS появляются, когда работает приложение: при загрузке ещё ничто не знает, какие приложения исключены, какая здесь локальная сеть и не запустится ли следом другой VPN, а захват всего устройства без этих исключений увёл бы с собой и локальную сеть, и исключённые приложения.
Чтобы всё это было сразу после загрузки, включите Автозапуск при загрузке (Настройки → Работа в фоне и разрешения). Тогда приложение запустится само, если работало до перезагрузки, и разрыв займёт несколько секунд.
Команда tailscale
Заголовок раздела «Команда tailscale»Установить консольную утилиту Tailscale CLI кладёт команду tailscale туда, где её найдёт root-консоль, — в /system/bin/tailscale через модуль Magisk, с копиями в /data/adb/service.d/ и /product/bin/. Она запускает собственный бинарник приложения и говорит с его демоном, так что указывать сокет не нужно:
su -c tailscale statussu -c tailscale ipsu -c tailscale ping my-laptopsu -c tailscale netchecksu -c tailscale versionОбновление приложения обновляет и её.
Остановка
Заголовок раздела «Остановка»Завершать Root-демон при остановке, по умолчанию включено, останавливает root-демона, когда вы нажимаете «Остановить». Останавливается только демон, запущенный для этого приложения, — никогда второй профиль, tailscaled в Termux или чужое приложение.
Если выключить, «Остановить» только отсоединяет приложение: демон работает дальше, а следующий запуск подключится к нему. Ручная остановка окончательна в обоих случаях: ничто не запустит службу снова, пока это не сделаете вы.
Демона, который ещё стартует, когда поднимается приложение, ждут до 15 секунд, а не убивают.
Если что-то не так
Заголовок раздела «Если что-то не так»- Проверить маршрутизацию — Настройки → Диагностика и разработчику → Служебная информация о демоне (ЭКСПЕРИМЕНТАЛЬНО). Все поставленные правила, держит ли устройство другой VPN и что он оставил, и почему выходной узел маршрутизируется или нет. В той же карточке — состояние демона, сокет, файл журнала и загрузочный скрипт.
- Логи → ROOT: каждая root-команда приложения, её ошибки, а после каждого изменения — какие правила встали и почему какие-то нет. TAILSCALE — журнал самого демона.
- Exit node unavailable в логе ROOT: приложение не смогло убедиться, что демон помечает свои соединения, и не включает выходной узел, чтобы не зациклить устройство. Адреса tailnet работают.
- Приложение не достучится до работающего демона: на устройстве с SELinux в режиме enforcing приложение добавляет недостающее правило через
magiskpolicy,ksudилиsupolicy. Получилось ли — скажет лог ROOT. - Исключённое приложение всё равно разрешает имена tailnet: так и должно быть — см. исключённые приложения и DNS.
Из root-консоли:
su -c tail -f /data/data/io.github.bropines.tailscaled/logs/tailscaled.log # журнал демонаsu -c ps -ef | grep tailscaled # работает ли онsu -c ip rule show # правила TailSocks: 100, 190, 200su -c ip route get 8.8.8.8 # tailscale0 с выходным узломДля отчёта об ошибке запустите на устройстве от root tools/root-debug.sh или с компьютера через adb tools/root-debug-session.sh и приложите то, что он запишет, к issue о Root-режиме.
Как всё это устроено, со всеми правилами и таблицами: Root-режим изнутри.