Перейти к содержимому

Root-режим

На рутованном устройстве демон работает от root, через su, на настоящем интерфейсе ядра tailscale0, с policy routing вокруг него. Слот VPN в Android остаётся свободным для другого приложения. Демон может стартовать при загрузке без приложения, а команда tailscale работает в Termux и root-консоли.

  • Root от Magisk, KernelSU или APatch, выданный TailSocks.
  • Больше ничего готовить не надо. Правила маршрутизации приложение пишет само, а на устройстве с SELinux в режиме enforcing само добавляет единственное нужное ему правило политики — тогда, когда оно понадобится.
  1. Настройки → Режим туннеля → Root. На телевизоре: Настройки → Дополнительно → Root-режим.
  2. Внимание: Экспериментальный режим — нажмите Понятно, включить.
  3. 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 — от всех приложений, всегда.
  • С выходным узлом — всё, что отправляет устройство, кроме Исключенных приложений и локальной сети при включённом Доступ к локальной сети (Настройки → Аккаунт и подключение).
  • Запросы имён всех приложений — через MagicDNS, при включённом Системный DNS через MagicDNS.

Root-режим — только клиент: в нём это устройство не может быть выходным узлом или subnet-роутером для других.

Исключённое приложение не идёт через выходной узел, но адреса tailnet ему по-прежнему доступны. А вот имена ему всё равно разрешает MagicDNS: обычному приложению Android ищет имена от своего имени, и правило для отдельного приложения этих запросов не видит. Системный резолвер вернётся только тем, кто разрешает имена сам, — встроенному резолверу Chrome, клиенту DoH или DoT, curl в Termux.

Если приложению нужен именно системный резолвер — блокировщику рекламы, приложению частного DNS, — выключите Системный DNS через MagicDNS.

Root-режим не отбирает устройство у VPN-приложения. Если слот VPN в Android держит другое приложение, TailSocks уступает:

  • Адреса tailnet, имена MagicDNS и локальные прокси работают у всех приложений.
  • Если тот VPN забрал все приложения, выходной узел и системный DNS выключены, пока он работает. Карточка статуса: Только tailnet — устройство держит другой VPN, а выходной узел показан как неиспользуемый.
  • Если часть приложений он оставил вне туннеля, TailSocks ведёт именно их — с выходным узлом и MagicDNS. Карточка статуса: Ведём приложения вне чужого VPN, выходной узел — Выходной узел: частично.
  • Всё равно занять устройство забирает маршрут по умолчанию и DNS для всех приложений. Приложения того VPN остаются без туннеля и без его фильтрации, а сам он об этом не узнаёт. По умолчанию выключено и перед включением спрашивает.

Перезапускать ничего не нужно: TailSocks замечает, когда другой VPN запускается, останавливается или меняет свои приложения, и подстраивается.

Ничего из этого не обязательно, но так они уживаются лучше:

  1. Исключите TailSocks из его туннеля (поприложенный прокси в режиме обхода или его список исключений). Иначе всё, что TailSocks делает помимо самого туннеля, — канал управления, обновления, Admin API — пойдёт через чужой туннель, и сбой там будет выглядеть как сбой здесь.
  2. Держите его собственные адреса вне диапазонов tailnet, 100.64.0.0/10 и fd7a:115c:a1e0::/48: его сервер, его DNS-сервер, подсеть его интерфейса. TailSocks отправляет эти диапазоны в tailnet для всех приложений.
  3. Чтобы 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 CLI кладёт команду tailscale туда, где её найдёт root-консоль, — в /system/bin/tailscale через модуль Magisk, с копиями в /data/adb/service.d/ и /product/bin/. Она запускает собственный бинарник приложения и говорит с его демоном, так что указывать сокет не нужно:

Окно терминала
su -c tailscale status
su -c tailscale ip
su -c tailscale ping my-laptop
su -c tailscale netcheck
su -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, 200
su -c ip route get 8.8.8.8 # tailscale0 с выходным узлом

Для отчёта об ошибке запустите на устройстве от root tools/root-debug.sh или с компьютера через adb tools/root-debug-session.sh и приложите то, что он запишет, к issue о Root-режиме.

Как всё это устроено, со всеми правилами и таблицами: Root-режим изнутри.