TUN — mihomo
tun: в mihomo — верхнеуровневый блок конфигурации (не запись в listeners:). Схема почти идентична TUN-входящему sing-box (реализация mihomo производна от sing-box) с несколькими добавками, специфичными для mihomo: явный dns-hijack, фильтрация по MAC-адресам, переключатель отбрасывания ICMP и флаги оптимизаций recvmsg_x/sendmsg_x для Darwin.
Верхнеуровневый блок tun:
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
enable | bool | false | true | false | Главный переключатель. При false остальная часть блока игнорируется. |
device | string | (auto) | <interface name> | Имя устройства TUN. |
stack | C.TUNStack | mixed | system | gvisor | mixed | Как в sing-box: выбор стека TCP/IP. |
dns-hijack | []string | [] | [<address>] | Адреса, трафик к которым перехватывается как DNS — исходящий UDP к этим конечным точкам перенаправляется во внутренний DNS-движок. Стандартное значение: `[any:53]` (перехватывать всё). |
auto-route | bool | false | true | false | Автоматически устанавливать маршруты ОС. |
auto-detect-interface | bool | false | true | false | Автоматически определять исходящий интерфейс по умолчанию — используется, чтобы трафик, привязанный к TUN, не заходил в TUN повторно. |
mtu | uint32 | 0 (auto) | <bytes> | MTU устройства. 0 выбирает разумное значение по умолчанию (9000 на большинстве платформ). |
gso | bool | false | true | false | Generic Segmentation Offload (Linux). Повышает пропускную способность, если ядро его поддерживает. |
gso-max-size | uint32 | 65536 | <bytes> | Максимальный размер сегмента при активном GSO. |
inet6-address | []netip.Prefix | [] | <CIDR> | IPv6-адреса, назначаемые устройству. Для IPv4 предназначено верхнеуровневое поле `inet4-address` (сейчас закомментировано в исходниках — см. `config/config.go:283`). |
iproute2-table-index | int | 2022 | <int> | Индекс таблицы iproute2 в Linux. |
iproute2-rule-index | int | 9000 | <int> | Индекс правила iproute2 в Linux. |
auto-redirect | bool | false | true | false | Автоперенаправление через NFTables в Linux (быстрее auto-route на горячих путях). |
auto-redirect-input-mark | uint32 | 0 | <uint32> | fwmark на пакетах, идущих в TUN. |
auto-redirect-output-mark | uint32 | 0 | <uint32> | fwmark на пакетах, покидающих TUN. |
auto-redirect-iproute2-fallback-rule-index | int | 0 | <int> | Резервный индекс правила, когда auto-redirect не может установиться. |
loopback-address | []netip.Addr | [] | <IP> | Адреса, считающиеся loopback. |
strict-route | bool | false | true | false | Блокировать трафик, который иначе обошёл бы TUN (семантика kill switch). |
route-address | []netip.Prefix | [] | <CIDR> | При включённом `auto-route` направлять через TUN только эти CIDR. |
route-address-set | []string | [] | <rule-provider name> | Включение на основе поставщика правил. |
route-exclude-address | []netip.Prefix | [] | <CIDR> | CIDR, которые остаются на интерфейсе по умолчанию. |
route-exclude-address-set | []string | [] | <rule-provider name> | Исключение на основе поставщика правил. |
include-interface | []string | [] | <interface> | Подключаться только к этим интерфейсам. |
exclude-interface | []string | [] | <interface> | Исключить эти интерфейсы. |
include-uid | []uint32 | [] | <uid> | Включение по UID. |
include-uid-range | []string | [] | <from:to> | Включение по диапазону UID. |
exclude-uid | []uint32 | [] | <uid> | Исключение по UID. |
exclude-uid-range | []string | [] | <from:to> | Исключение по диапазону UID. |
exclude-src-port | []uint16 | [] | <port> | Исключение по порту источника. |
exclude-src-port-range | []string | [] | <from:to> | Исключение по диапазону портов источника. |
exclude-dst-port | []uint16 | [] | <port> | Исключение по порту назначения. |
exclude-dst-port-range | []string | [] | <from:to> | Исключение по диапазону портов назначения. |
include-android-user | []int | [] | <user id> | Включение мультипользователей Android. |
include-package | []string | [] | <package name> | Включение по пакету Android. |
exclude-package | []string | [] | <package name> | Исключение по пакету Android. |
include-mac-address | []string | [] | <MAC> | Включение по MAC-адресу (особенность mihomo, в sing-box отсутствует). |
exclude-mac-address | []string | [] | <MAC> | Исключение по MAC-адресу. |
endpoint-independent-nat | bool | false | true | false | Включить endpoint-independent NAT для UDP. Требуется некоторым играм и VoIP-приложениям. |
udp-timeout | int64 | 300 | <seconds> | Тайм-аут простоя UDP в секундах. |
icmp-timeout | int64 | 0 (10s built-in) | <seconds> | Тайм-аут простоя пересылаемых ICMP-сессий, в секундах. 0 оставляет встроенное значение 10 секунд. |
disable-icmp-forwarding | bool | false | true | false | Отбрасывать ICMP-пакеты на уровне TUN (особенность mihomo). |
file-descriptor | int | 0 | <fd> | Использовать заранее открытый файловый дескриптор вместо создания TUN-устройства. Полезно при интеграции с VPN-сервисом, когда ОС передаёт вам fd. |
inet4-route-address | []netip.Prefix | — | — | |
inet6-route-address | []netip.Prefix | — | — | |
inet4-route-exclude-address | []netip.Prefix | — | — | |
inet6-route-exclude-address | []netip.Prefix | — | — | |
recvmsgx | bool | false | true | false | Только Darwin — использовать системный вызов recvmsg_x для пакетной обработки. |
sendmsgx | bool | false | true | false | Только Darwin — использовать sendmsg_x. |
Исходный код: config/config.go:273-327 · зафиксировано на v1.19.29 (e26714a)
Выбор стека
Идентично sing-box:
system— TCP/IP ядра ОС. Самый быстрый, требует поддержки TUN в ядре.gvisor— стек в пользовательском пространстве. Медленнее, но переносим.mixed— gVisor для TCP, системный для UDP. По умолчанию.
Перехват DNS
dns-hijack — идиоматичный для mihomo способ направить DNS-запросы через внутренний резолвер:
tun:
enable: true
dns-hijack:
- any:53 # All UDP/53 traffic
- tcp://any:53 # And TCP/53
- 8.8.8.8:53 # Specific server onlyЭто реализовано на уровне TUN — DNS-пакеты перехватываются до того, как дойдут до правил маршрутизации. Это быстрее, чем поднимать UDP-входящий на 53 порту и прогонять трафик обратно через правила.
Примеры
Прозрачный прокси на десктопе:
tun:
enable: true
device: mihomo-tun
stack: mixed
mtu: 9000
dns-hijack:
- any:53
- tcp://any:53
auto-route: true
auto-detect-interface: true
strict-route: true
route-address:
- 0.0.0.0/1
- 128.0.0.0/1
- ::/1
- 8000::/1
route-exclude-address:
- 192.168.0.0/16
- 10.0.0.0/8Автоперенаправление через NFTables в Linux:
tun:
enable: true
device: utun0
stack: system
dns-hijack: [any:53]
auto-redirect: true
auto-redirect-input-mark: 0x100
auto-redirect-output-mark: 0x200Разделение приложений на Android — проксировать только выбранные приложения:
tun:
enable: true
stack: system
mtu: 9000
dns-hijack: [any:53]
auto-route: true
include-package:
- com.netflix.mediaclient
- com.spotify.music
exclude-package:
- com.google.android.gmsПримечания
inet4-addressзакомментирован в исходниках (config/config.go:283) — mihomo сейчас использует жёстко заданный IPv4-диапазон по умолчанию (198.18.0.1/30). Для IPv6 по-прежнему используется явное полеinet6-address.dns-hijackпринимает несколько специальных форм:any:53совпадает и с TCP, и с UDP на порту 53.- Префиксы
tcp://иudp://сужают область действия. - Просто
IP:port— для конкретных вышестоящих резолверов.
auto-routeиauto-redirectвзаимоисключающие. Выбирайте по своему ядру: на ядрах с NFTables ради производительности предпочтителен auto-redirect.- Флаги
recvmsgx/sendmsgx— оптимизации только для macOS, использующие пакетные варианты системных вызовов. Включайте их на macOS ради пропускной способности. disable-icmp-forwarding— особенность mihomo: полезно, когда есть отдельный путь для ICMP (например, пингер на основе таблицы маршрутизации) и вы не хотите, чтобы TUN захватывал пинги.
Сравнение с другими ядрами
- Xray-core имеет минимальный TUN-входящий. См. TUN — Xray-core.
- sing-box предлагает тот же набор возможностей под
type: "tun"вinbounds[]с именами в snake_case. См. TUN — sing-box.
Исходный код: config/config.go:273-327 · v1.19.29 (e26714a)
