TUN нужны три вещи, и нехватка любой всё останавливает
Ядру надо создать виртуальный адаптер, переписать таблицу маршрутизации так, чтобы маршрут по умолчанию вёл на него, и иметь права на оба действия. Нет чего-то одного — переключатель не удержится. Прежде чем что-то переустанавливать, откройте страницу логов и вернитесь к моменту нажатия: строки про TUN скажут, отказано ли в правах, не открылось ли устройство или маршрут так и не был прописан. Эта одна строка определяет всё дальнейшее.
- Виртуальный адаптер. В Windows за него отвечает драйвер Wintun, в macOS и Linux — системные устройства utun и tun.
- Таблица маршрутизации. Маршрут по умолчанию должен переехать на виртуальный адаптер, а это во всех распространённых системах привилегированная операция.
- Права. Администратор, root или заранее установленная клиентом фоновая служба.
Windows: драйвер, повышение прав и режим службы
- Файла драйвера нет. Клиенты обычно кладут dll от Wintun рядом с исполняемым файлом, и адаптер не создастся, если антивирус отправил её в карантин или архив распаковался не полностью. Распакуйте заново целиком и добавьте папку клиента в исключения антивируса.
- Запущено без повышения прав. Прямой способ — правый клик и «Запуск от имени администратора». Если делать так каждый раз надоело, ставьте режим службы.
- Уже работает другой VPN-клиент. Корпоративный VPN, игровой ускоритель, ещё один прокси — кто первым забрал маршрут по умолчанию, тот и прав. Закрывайте их полностью: свернуть в трей не считается.
- Hyper-V, WSL2 и Docker Desktop добавляют свои виртуальные адаптеры, и таблица маршрутов становится заметно сложнее. TUN поднимается, но маршрут по умолчанию не забирает — со стороны это выглядит как «включено, а интернета нет».
Режим службы (в разных клиентах его называют Service Mode или системной службой) стоит отдельного абзаца. Он ставит постоянную системную службу, которая и работает с адаптером и маршрутами, так что самому клиенту повышение прав больше не нужно. В Clash Verge Rev для неё есть отдельная кнопка установки в настройках; после этого TUN поднимается и при обычном двойном клике. При установке один раз выскочит UAC — вот от него никуда.
macOS: чаще всего застревают на выдаче разрешения
- При первом включении TUN система просит пароль, чтобы разрешить фоновый помощник. Нажали «Отменить» — окно нередко больше не появляется, и переключатель продолжает сбрасываться. Закройте и снова откройте клиент или найдите пункт, который переустанавливает помощник, чтобы вопрос задали заново.
- В системных настройках, в списке объектов входа и фоновых расширений, запись клиента может оказаться выключенной. С выключенной записью помощник не стартует.
- Устройство utun занято. Корпоративные VPN и такие инструменты, как Tailscale, создают собственные интерфейсы utun. Сначала отключите их, потом пробуйте.
Linux: права и /dev/net/tun
- Сначала проверьте, есть ли устройство tun вообще. В урезанных ядрах и контейнерах его часто нет, и модуль tun приходится загружать вручную.
- Бинарник, запущенный обычным пользователем, не имеет прав управлять сетью. Либо используйте режим службы вашего клиента, либо выдайте бинарнику CAP_NET_ADMIN.
- После каждого обновления ядра выдавайте capability заново. Перезапись файла её стирает, и поломка возвращается как будто с нуля.
ls -l /dev/net/tun
sudo modprobe tun
sudo setcap cap_net_admin,cap_net_raw+ep /path/to/mihomo
Поднялся, а трафик не идёт
route print 0.0.0.0
netstat -rn
ip route show
Три команды — для Windows, macOS и Linux соответственно; смотрите, куда сейчас ведёт маршрут по умолчанию. Всё ещё на физический адаптер — значит auto-route не сработал или кто-то вернул маршрут обратно. Ведёт на виртуальный, а связи нет — переносите подозрение на DNS и брандмауэр: TUN должен перехватывать запросы на порт 53, а системный или антивирусный брандмауэр, заблокировавший виртуальный адаптер, пропускает трафик внутрь и не выпускает наружу. Есть и ещё один случай: системный прокси и TUN включены одновременно. Одни клиенты сами разрывают петлю, другие нет, поэтому на время диагностики оставьте что-то одно.