В момент, когда вы включаете TUN, в системе происходят три вещи: появляется сетевой адаптер, переписывается таблица маршрутизации и перехватывается порт 53.
Поймите эти три вещи — и у любой неудобной проблемы с TUN появится направление для разбора.
1. Создание виртуального адаптера
TUN — это вид виртуального сетевого устройства, предоставляемый операционной системой. С точки зрения системы это обычный адаптер, только на другом конце не физический кабель, а программа в пространстве пользователя — здесь это ядро Mihomo.
Реализации по платформам:
| Платформа | Реализация | Нужные привилегии |
|---|---|---|
| Windows | Драйвер wintun | Администратор (установка драйвера плюс системной службы) |
| macOS | Расширение ядра utun | root (привилегированный helper) |
| Linux | /dev/net/tun | CAP_NET_ADMIN |
«Режим службы» в Clash Verge существует именно для того, чтобы не запрашивать повышение прав каждый раз: системная служба ставится однажды и дальше выполняет привилегированные операции сама.
2. Переписывание таблицы маршрутизации
Одного адаптера мало; системе надо сказать отправлять трафик к нему. Это делается изменением маршрутов.
При auto-route: true ядро добавляет маршруты вида:
0.0.0.0/1 → адаптер TUN
128.0.0.0/1 → адаптер TUNПочему два маршрута /1, а не один 0.0.0.0/0?
Потому что сопоставление маршрутов работает по принципу «самый длинный префикс побеждает». Существующий маршрут по умолчанию — 0.0.0.0/0; если бы TUN тоже заявил 0.0.0.0/0, два маршрута равной длины были бы неоднозначны. Разбитые на два /1 они длиннее по префиксу и надёжно перебивают исходный default — при этом сам default остаётся на месте, так что собственный исходящий трафик ядра по-прежнему выходит нормально.
auto-detect-interface: true позволяет ядру самому определить реальный исходящий адаптер (Wi-Fi или Ethernet), чтобы оно следовало за вами при смене сети.
Что делает strict-route
tun:
strict-route: trueЭто добавляет более строгие маршруты и политику брандмауэра, чтобы ничто не проскользнуло мимо TUN. Побочный эффект — выше вероятность конфликта с другим VPN-софтом.
Выключайте, когда нужно сосуществовать с VPN.
Исключение конкретного адаптера
Для сосуществования с корпоративным VPN:
tun:
exclude-interface: ["ppp0", "Cisco AnyConnect"]3. Перехват DNS
tun:
dns-hijack:
- any:53Смысл: любой DNS-запрос на порт 53, какому бы серверу он ни был адресован, перехватывается и обслуживается собственным резолвером ядра.
Почему это необходимо: некоторые программы жёстко прописывают DNS-сервер (например, спрашивают напрямую 8.8.8.8), обходя ваши системные настройки. Без перехвата такие запросы уходят прежним путём, что означает:
- Неточные ответы (возможно, отравленные)
- Потерю информации о домене, из-за чего ядру остаётся сопоставлять правила по одному IP
- Утечку DNS — провайдер видит, какие имена вы запрашивали
4. Стек: gvisor, system или mixed
TUN получает сырые IP-пакеты, поэтому ему нужен стек TCP/IP, чтобы собрать из них соединения. Три реализации:
Ориентиры:
| Ситуация | Выбирайте |
|---|---|
| Не уверены / первая настройка | mixed |
| Странные проблемы с соединениями | gvisor |
| Софт-роутер, нужна пропускная способность | system |
| Проблемы с UDP на macOS | gvisor |
5. MTU и фрагментация
tun:
mtu: 1500MTU — максимальный размер одного пакета. Задайте MTU адаптера TUN больше, чем выдерживает реальный канал, и пакеты начнут фрагментироваться, теряя производительность; задайте слишком мало — упадёт эффективность передачи.
1500 — стандарт Ethernet, менять его обычно не нужно. Но если ваш узел работает поверх канала, уже несущего накладные расходы инкапсуляции (некоторые транзиты, PPPoE-соединение), полезный MTU меньше 1500, и может понадобиться 1400–1450.
6. Полная конфигурация TUN
tun:
enable: true
stack: mixed
device: Mihomo
auto-route: true
auto-detect-interface: true
auto-redirect: false # дополнительное перенаправление на Linux
strict-route: false
mtu: 1500
dns-hijack:
- any:53
- tcp://any:53
# исключить адаптеры, чтобы избежать конфликта с VPN
# exclude-interface: ["ppp0"]
# исключить конкретные приложения (Mihomo)
# exclude-package: ["com.example.app"] # AndroidСопутствующая конфигурация DNS:
dns:
enable: true
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "*.local"
- "+.pool.ntp.org"
- "+.msftconnecttest.com"
- "+.msftncsi.com"
nameserver: [223.5.5.5, https://doh.pub/dns-query]DNS надо настроить одновременно: TUN забрал весь трафик, так что при неверном DNS не разрешается вообще ничего.
Глубинная причина частых проблем
| Симптом | Глубинная причина | Что делать |
|---|---|---|
| После включения TUN всё умирает | Маршруты переписаны, но собственный трафик ядра зацикливается | Убедитесь в auto-detect-interface: true; перезапустите |
| Сеть не восстанавливается после закрытия приложения | Процесс был убит принудительно, маршруты не откатились | Запустите Clash Verge снова и выйдите корректно, либо перезагрузитесь |
| Устройства в LAN недоступны | Нет прямого правила для приватных диапазонов | Добавьте IP-CIDR,192.168.0.0/16,DIRECT,no-resolve |
| Не находится NAS или принтер | Имена mDNS пойманы fake-ip | Добавьте "*.local" и "*.lan" в fake-ip-filter |
| Конфликт с корпоративным VPN | Оба переписывают таблицу маршрутизации | Выключите strict-route, используйте exclude-interface |
| Система сообщает «нет подключения к интернету» | Имя для проверки связности прошло через fake-ip | Добавьте "+.msftconnecttest.com" в фильтр |
| Большие загрузки зависают | Завышенный MTU и потеря фрагментов | Поставьте mtu в 1400 |
| Игры на UDP не подключаются | Узел не поддерживает UDP либо неподходящий стек | Проверьте udp: true у узла, переключите стек на gvisor |
| Высокая загрузка процессора | Весь трафик проходит через стек в пространстве пользователя | Переключите стек на system либо откажитесь от TUN в пользу системного прокси |
Как убедиться, что TUN действительно работает
Посмотрите на адаптер:
# Windows
Get-NetAdapter | Where-Object {$_.InterfaceDescription -like "*wintun*"}# Linux / macOS
ip link show # или ifconfigВы должны увидеть адаптер с именем Mihomo или utunX.
Посмотрите на маршруты:
# Windows
route print -4# Linux
ip route showДолжны быть видны два маршрута /1, указывающие на адаптер TUN.
Проверьте, что трафик действительно идёт через него:
Откройте страницу подключений в Clash Verge и обратитесь в интернет программой, которая точно игнорирует системный прокси, — например, консольным curl без заданных переменных окружения. Появившаяся запись на странице подключений означает, что TUN работает.
Коротко
Три вещи, которые делает TUN:
- Виртуальный адаптер — требует драйвера и привилегий, чем занимается режим службы
- Таблица маршрутизации — два маршрута
/1забирают всё, а IP узлов закреплены за физическим адаптером - Перехват DNS — не даёт жёстко прописанным резолверам обойти ядро
Когда что-то ломается, идите по этим трём слоям: есть ли адаптер → верны ли маршруты → работает ли DNS.
Смотрите также: DNS и fake-ip и раздельное туннелирование на практике.
Смежные документы
Как на самом деле работает fake-ip, чем он отличается от redir-host, как делят работу nameserver и fallback, как не допустить утечки DNS и почему перестают резолвиться внутренние имена.
Чем игровой трафик отличается: почему UDP требует TUN, что на самом деле значит тип NAT, почему потери пакетов вреднее задержки, и чек-лист настроек ради низкой задержки.
Что означает каждый столбец и как им пользоваться: поиск программы, съедающей трафик, причины взрывного роста числа соединений, где узкое место скорости и непрерывный мониторинг через API.