Tunnel — mihomo
mihomo предлагает два равнозначных способа объявить статический проброс порта: верхнеуровневый блок tunnels: (легаси, поддерживает компактную строковую форму) или запись в listeners: с type: tunnel.
Форма слушателя
Запись в listeners: с type: tunnel. Встраивает BaseOption (listen, port).
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
network | []string | (required) | tcp | udp | Принимаемые транспорты. Передайте оба как `[tcp, udp]`, чтобы открыть один и тот же форвардер на обоих. |
target | string | (required) | <host:port> | Назначение перенаправляемых соединений. |
Исходный код: listener/inbound/tunnel.go:13-17 · зафиксировано на v1.19.29 (e26714a)
Верхнеуровневый блок tunnels:
Верхнеуровневая форма компактна и появилась раньше единой модели listeners. Каждая запись — либо объект, либо компактная строка:
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
network | []string | (required) | tcp | udp | Принимаемые транспорты. Объектная форма принимает список. |
address | string | (required) | <host:port> | Адрес прослушивания. |
target | string | (required) | <host:port> | Назначение. |
proxy | string | (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:
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"Объектная форма — то же самое с разнесёнными по ключам значениями:
tunnels:
- network: [tcp, udp]
address: 127.0.0.1:5353
target: 1.1.1.1:53
proxy: VPNПримеры
DNS-форвардер в форме слушателя:
listeners:
- name: dns-fwd
type: tunnel
listen: 0.0.0.0
port: 5353
network: [tcp, udp]
target: 1.1.1.1:53Верхнеуровневая форма: проброс HTTP на внутренний хост через именованный прокси:
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)
