Skip to content

TUN — mihomo

tun: в mihomo — верхнеуровневый блок конфигурации (не запись в listeners:). Схема почти идентична TUN-входящему sing-box (реализация mihomo производна от sing-box) с несколькими добавками, специфичными для mihomo: явный dns-hijack, фильтрация по MAC-адресам, переключатель отбрасывания ICMP и флаги оптимизаций recvmsg_x/sendmsg_x для Darwin.

Верхнеуровневый блок tun:

ПолеТипПо умолчаниюДопустимые значенияОписание
enableboolfalsetrue | falseГлавный переключатель. При false остальная часть блока игнорируется.
devicestring(auto)<interface name>Имя устройства TUN.
stackC.TUNStackmixedsystem | gvisor | mixedКак в sing-box: выбор стека TCP/IP.
dns-hijack[]string[][<address>]Адреса, трафик к которым перехватывается как DNS — исходящий UDP к этим конечным точкам перенаправляется во внутренний DNS-движок. Стандартное значение: `[any:53]` (перехватывать всё).
auto-routeboolfalsetrue | falseАвтоматически устанавливать маршруты ОС.
auto-detect-interfaceboolfalsetrue | falseАвтоматически определять исходящий интерфейс по умолчанию — используется, чтобы трафик, привязанный к TUN, не заходил в TUN повторно.
mtuuint320 (auto)<bytes>MTU устройства. 0 выбирает разумное значение по умолчанию (9000 на большинстве платформ).
gsoboolfalsetrue | falseGeneric Segmentation Offload (Linux). Повышает пропускную способность, если ядро его поддерживает.
gso-max-sizeuint3265536<bytes>Максимальный размер сегмента при активном GSO.
inet6-address[]netip.Prefix[]<CIDR>IPv6-адреса, назначаемые устройству. Для IPv4 предназначено верхнеуровневое поле `inet4-address` (сейчас закомментировано в исходниках — см. `config/config.go:283`).
iproute2-table-indexint2022<int>Индекс таблицы iproute2 в Linux.
iproute2-rule-indexint9000<int>Индекс правила iproute2 в Linux.
auto-redirectboolfalsetrue | falseАвтоперенаправление через NFTables в Linux (быстрее auto-route на горячих путях).
auto-redirect-input-markuint320<uint32>fwmark на пакетах, идущих в TUN.
auto-redirect-output-markuint320<uint32>fwmark на пакетах, покидающих TUN.
auto-redirect-iproute2-fallback-rule-indexint0<int>Резервный индекс правила, когда auto-redirect не может установиться.
loopback-address[]netip.Addr[]<IP>Адреса, считающиеся loopback.
strict-routeboolfalsetrue | 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-natboolfalsetrue | falseВключить endpoint-independent NAT для UDP. Требуется некоторым играм и VoIP-приложениям.
udp-timeoutint64300<seconds>Тайм-аут простоя UDP в секундах.
icmp-timeoutint640 (10s built-in)<seconds>Тайм-аут простоя пересылаемых ICMP-сессий, в секундах. 0 оставляет встроенное значение 10 секунд.
disable-icmp-forwardingboolfalsetrue | falseОтбрасывать ICMP-пакеты на уровне TUN (особенность mihomo).
file-descriptorint0<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
recvmsgxboolfalsetrue | falseТолько Darwin — использовать системный вызов recvmsg_x для пакетной обработки.
sendmsgxboolfalsetrue | 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-запросы через внутренний резолвер:

yaml
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 порту и прогонять трафик обратно через правила.

Примеры

Прозрачный прокси на десктопе:

yaml
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:

yaml
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 — проксировать только выбранные приложения:

yaml
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)

Core Tutorial от Argsment