概述
dialer-proxy 是 mihomo 内置于每个代理节点上的参数
当节点配置了此参数时,该节点的底层网络连接会通过指定的另一个代理建立,而不是直接从本机发出。
节点 A (dialer-proxy → 节点 B) ↓节点 A 的底层连接:本地 → 节点 B 服务端 → 节点 A 服务端 → 目标在这个过程中:
- 目标网站看到的来源 IP 是节点 A 服务端的 IP
- 本地网络运营商只能看到你在连接节点 B,不知道节点 A 和目标的存在
- 节点 B 的服务端知道自己转发了流量到节点 A,但不知道最终访问的是什么目标
dialer-proxy 值
值可以为任意已定义的代理节点名称或策略组名称。
proxies: - name: "落地节点" dialer-proxy: 拨号策略组 # ... 其他参数
- name: "前置节点" # ...
proxy-groups: - name: 拨号策略组 type: select proxies: - 前置节点当 dialer-proxy 指向策略组时,内核会在每次建立连接时根据该策略组的选中的节点进行拨号,同时允许在运行时通过切换策略组中的节点来更换前置链路。
限制
不允许在策略组上设置 dialer-proxy
if _, ok := config["dialer-proxy"]; ok { log.Errorln("The group [%s] with dialer-proxy configuration is not allowed, ...")}dialer-proxy 只能写在代理节点上,策略组上写此字段会报错且不生效。
禁止循环引用
return fmt.Errorf("proxy [%s] has circular dialer-proxy dependency", name)如果 dialer-proxy 引用了自身,或引用的链路上存在环,启动时会报错并退出,允许链式嵌套,但不可成环。
不支持 relay 类型(已移除)
return nil, fmt.Errorf("%w: The group [%s] with relay type was removed, please using dialer-proxy instead", ...)过往的 relay 策略组类型已被移除,应统一使用 dialer-proxy 实现链式代理。
适用场景
通过订阅节点中转自建节点
当自建 VPS 的 IP 被封禁(或被限速)且不想更换 IP 时,可通过已有的机场订阅节点作为前置,中转流量到自建节点落地:
proxy-providers: airport: type: http url: "https://example.com/sub"
proxy-groups: - name: 拨号组 type: select use: [airport]
proxies: - name: "落地节点" type: ss server: <YOUR_VPS_IP> port: 443 cipher: chacha20-ietf-poly1305 password: <YOUR_PASSWORD> dialer-proxy: 拨号组
rules: - MATCH,落地节点流量路径为:
本地 → 订阅节点(前置)→ 自建 VPS 落地 → 目标网站TIP前置节点本质上是在为落地节点建立 TCP 隧道,因此落地节点应选择不依赖 UDP 的协议(SS/VMess/VLESS over TCP 等)。
若落地节点使用 hy2/tuic/wireguard 等纯 UDP 协议,或带有 REALITY/shadowtls 等 TLS 伪装层,前置节点(订阅节点)很可能无法正确转发这些连接。
落地节点推荐使用
ss + chacha20-ietf-poly1305或vmess + tcp。
总控模式切换
个人玩法,不泛用
当同时维护自建直连、链式代理、机场订阅三种模式时,可借助 proxy-providers 的 override 机制,对同一份节点文件分别产生”直连”和”链式”两组配置:
proxy-providers: # 机场订阅 airport: type: http url: "https://example.com/sub"
# 自建节点(原始) mine: type: file path: ./proxy_provider/mine.yaml
# 自建节点(加了 dialer-proxy,用于链式模式) mine-land: type: file path: ./proxy_provider/mine.yaml override: dialer-proxy: 链式前置
proxy-groups: # 总开关 - name: PROXY type: select proxies: [机场节点, 链式代理, 自建直连]
- name: 机场节点 type: select use: [airport]
- name: 链式前置 type: select use: [airport]
- name: 链式代理 type: select use: [mine-land] # 引用加了 override 的文件
- name: 自建直连 type: select use: [mine] # 引用原始文件(无 dialer-proxy)
rules: - DOMAIN-SUFFIX,google.com,PROXY - MATCH,PROXYoverride 会对 provider 中所有节点批量添加 dialer-proxy 字段(代码位置 adapter/provider/override.go:58-59)。同一份 mine.yaml 文件被引用两次,一次保持原样(自建直连),一次批量添加拨号配置(链式模式)。
flowchart LR U[客户端流量] P[PROXY 总开关]
A[机场节点] L[链式代理<br/>mine-land] M[自建直连<br/>mine]
D[链式前置] AS[机场服务端] LS[落地服务端] MS[自建服务端] T[目标网站]
U --> P P --> A P --> L P --> M
A --> AS --> T M --> MS --> T L --> D --> AS --> LS --> T