Skip to content

Tunnel — mihomo

mihomo предлагает два равнозначных способа объявить статический проброс порта: верхнеуровневый блок tunnels: (легаси, поддерживает компактную строковую форму) или запись в listeners: с type: tunnel.

Форма слушателя

Запись в listeners: с type: tunnel. Встраивает BaseOption (listen, port).

ПолеТипПо умолчаниюДопустимые значенияОписание
network[]string(required)tcp | udpПринимаемые транспорты. Передайте оба как `[tcp, udp]`, чтобы открыть один и тот же форвардер на обоих.
targetstring(required)<host:port>Назначение перенаправляемых соединений.

Исходный код: listener/inbound/tunnel.go:13-17 · зафиксировано на v1.19.29 (e26714a)

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

Верхнеуровневая форма компактна и появилась раньше единой модели listeners. Каждая запись — либо объект, либо компактная строка:

ПолеТипПо умолчаниюДопустимые значенияОписание
network[]string(required)tcp | udpПринимаемые транспорты. Объектная форма принимает список.
addressstring(required)<host:port>Адрес прослушивания.
targetstring(required)<host:port>Назначение.
proxystring(routing default)<proxy or group name>Принудительно направлять трафик этого туннеля через указанный по имени прокси или группу. Обходит список правил.

Исходный код: listener/config/tunnel.go:11-16 · зафиксировано на v1.19.29 (e26714a)

Компактная строковая форма — network,address,target[,proxy], где network — это tcp, udp или tcp/udp:

yaml
tunnels:
  - tcp,127.0.0.1:5353,1.1.1.1:53        # TCP only
  - udp,127.0.0.1:5353,1.1.1.1:53        # UDP only
  - tcp/udp,127.0.0.1:5353,1.1.1.1:53    # both
  - tcp,0.0.0.0:8080,10.0.0.10:80,VPN    # forced through proxy "VPN"

Объектная форма — то же самое с разнесёнными по ключам значениями:

yaml
tunnels:
  - network: [tcp, udp]
    address: 127.0.0.1:5353
    target: 1.1.1.1:53
    proxy: VPN

Примеры

DNS-форвардер в форме слушателя:

yaml
listeners:
  - name: dns-fwd
    type: tunnel
    listen: 0.0.0.0
    port: 5353
    network: [tcp, udp]
    target: 1.1.1.1:53

Верхнеуровневая форма: проброс HTTP на внутренний хост через именованный прокси:

yaml
proxies:
  - name: VPN
    type: trojan
    server: vpn.example.com
    port: 443
    password: <password>

tunnels:
  - network: [tcp]
    address: 0.0.0.0:8080
    target: 10.0.0.10:80
    proxy: VPN

Примечания

  • В компактной строковой форме address и target при разборе валидируются как литералы host:port (listener/config/tunnel.go:53-58). Отсутствующий порт даёт понятную ошибку.
  • Неизвестные значения в network молча пропускаются с предупреждением при запуске (listener/inbound/tunnel.go:97-100). Принимаются только tcp и udp.
  • Поле proxy обходит список правил — трафик туннеля идёт через названный прокси независимо от mode и любых совпадающих записей rules:. Используйте его, когда нужен фиксированный маршрут, не зависящий от обычной маршрутизации.
  • Форма слушателя и форма tunnels: могут сосуществовать в одной конфигурации — они независимы.

Сравнение с другими ядрами

  • Xray-core использует протокол dokodemo-door с полем portMap для проброса нескольких портов в одном входящем. См. Dokodemo — Xray-core.
  • sing-box не имеет отдельного типа туннеля — используйте входящее Direct с override_address и override_port.

Исходный код: listener/inbound/tunnel.go:13-17 · v1.19.29 (e26714a)

Core Tutorial от Argsment