入站
流量怎么进来
在传统的 clash 时代, 只有全局的 port, socks-port, mixed-port. 所有水流都从一大大管子(如7890端口)进来, 想要将它们分开, 就必须设置复杂的规则引擎
clash mihomo 引入 listeners, 实现了源头即分类. 也就是在物理层面(端口级别)就把流量隔离开. 例如: A软件连10001端口, B软件走10002端口, mihomo 甚至不需要看数据包里是什么域名, 只需要看它从哪个门进入, 就能直接把它丢进对应的出站管道
listeners
当你在 listeners 中定义了一个门, mihomo 会向操作系统申请打开这个端口. 随后执行如下步骤:
- 协议握手: 按照你设定的类型 (HTTP, SOCKS, 甚至是 Shadowsocks, vmess 等) 接收数据
- 特权检查: 检查这个门有没有配置专属的 proxy 或 rule
- 分发: 如果有专属出口, 直接放行到目标出站; 如果没有, 再通过主规则引擎去匹配
listeners:
- name: "专属AI通道" # 给这个门起个名字
type: mixed # 接收 HTTP 和 SOCKS 混合协议
port: 10001 # 在本地开 10001 端口
proxy: "US-Node-1" # 核心特权:从这进来的数据,直接走名为 "US-Node-1" 的出站节点,无视所有规则!
- name: "spider" # 专门给爬虫用
type: http # 接收 HTTP 协议
port: 10002 # 在本地开 10002 端口
listen: 0.0.0.0 # 允许局域网连接
users:
- username: username1 # 代理验证, 后续可再配置用户名分流
password: password1
- name: "局域网SS服务端" # 高级玩法:Mihomo化身为服务端!
type: shadowsocks # 这个门使用 SS 协议加密接收数据
port: 10003
listen: 0.0.0.0 # 允许局域网其他设备连接
password: "123" # 设定密码
cipher: "aes-128-gcm"-
适用:
- 强绑定分流 (端口 = 节点): 如测试人员、爬虫程序或多账号运营者, 需要给不同浏览器分配不同国家的固定IP, 直接给每个浏览器配置一个专属 listener 端口
- 局域网代理服务器: 可以将 type 设置为 shadowsocks, vmess, vless 等, 这意味着你的 mihomo 变成了一个真正的代理服务器, 接管其他电脑的流量, 并进行翻墙
-
不适用
- 如果你只是一个普通用户, 所有软件都听系统代理, 或者你已经开了 tun 模式, 并且你只依靠 域名规则 来决定走哪个节点, 则不需要 listeners
出站
流量最后怎么出去
- 阶段一: 为了防止单个代理服务器宕机, 可以在配置文件中添加若干个 proxies (节点), 手动选择一个使用
- 阶段二: 随着 “机场” (节点贩卖商) 的出现, proxy-provider (代理提供者) 诞生了, 通过一个订阅链接, 自动拉取云端的节点
- 阶段三: 为了软件自己决定, proxy-group (代理组) 诞生了. 它引入算法, 例如 “组内哪个节点延迟低就用谁”
proxies (代理节点)
proxies:
- name: "http节点"
type: http
server: server
port: 443
# username: username
# password: password
# tls: true # https
# skip-cert-verify: true
# sni: custom.com
# headers:
- name: "socks节点"
type: socks5
server: server
port: 443
# username: username
# password: password
# tls: true
# skip-cert-verify: true
# udp: true
# ip-version: ipv6
- name: "vless节点1"
type: vless
server: 38.47.100.49
port: 47267
network: ws
uuid: 57c65db5-532b-4149-986c-a8dd38119b5f
encryption: none- 内置代理节点
- DIRECT: 直连
- REJECT: 拒绝, 拦截数据出站
- REJECT-DROP: 拒绝, 静默抛弃请求
- PASS: 绕过, 会使匹配规则时跳过此规则
prxoy-providers (代理提供者)
可同时引入多家机场的节点
proxy-providers:
provider1: # 名称, 不要重名
type: http # provider类型, 可选 http/file/inline
url: "http://test.com" # 订阅链接, type=http 时必须配置
path: ./proxy_providers/provider1.yaml # 文件路径
interval: 3600 # 更新provider的时间, 单位:秒
proxy: DIRECT # 通过指定代理下载/更新
size-limit: 0 # 限制下载文件的大小, 默认0不限制, 单位: 字节
header: # 自定义http请求头
User-Agent:
- "mihomo/1.18.3"
Authorization:
- 'token 1231231'
health-check: # 健康检查
enable: true
url: https://www.gstatic.com/generate_204
interval: 300
timeout: 5000
lazy: true # 默认 true, 不使用该provider时不测试
expected-status: 204 # 期望状态
override: # 覆盖节点内容
udp: true # 是否允许 udp 通过代理, 默认 false
udp-over-tcp: false
down: "50 Mbps" # 速率控制
up: "10 Mbps"
skip-cert-verify: true
dialer-proxy: proxy # 配置链式代理
additional-prefix: "provider1 prefix |" # 为节点名称添加固定前缀
additional-suffix: "| provider1 suffix" # 为节点名称添加固定后缀
proxy-name: # 对节点名称进行替换
- pattern: "IPLC-(.*?)倍"
target: "iplc x $1"
filter: "(?i)港|hk|hongkong|hong kong" # 通过正则筛选节点
exclude-filter: "xxx" # 排除节点
exclude-type: "ss|http" # 通过 type 排除节点
payload: # 仅 type=inline 生效, 定义 proxies
- name: "ss1"
type: ss
server: server
port: 443
cipher: chacha20-ietf-poly1305
password: "password"
proxy-groups (代理组)
proxy-groups:
- name: "香港" # 组名
type: select # 组类型, select 手动选择
proxies: # 引入 proxies / 其他代理组
- DIRECT
- ss
use: # 引入 proxy-providers
- provider1
- provider1
# 健康检查地址
# 只会测试 proxies 中节点, 不检查 use 引入的
url: 'https://www.gstatic.com/generate_204'
interval: 300
lazy: true
timeout: 5000
max-failed-times: 5
expected-status: 200/302/400-503 # 健康检查期望的http响应码
disable-udp: true # 禁用该组的 udp
include-all: false # 引入所有 proxies 和 proxy-providers
include-all-proxies: false # 引入所有 proxies
include-all-providers: false # 引入所有 provider
filter: "(?i)港|hk|hongkong|hong kong" # 筛选节点
exclude-filter: "美|日" # 排除节点
exclude-type: "Shadowsocks|Http" # 排除节点类型
hidden: true # 在api返回hidden状态, 以隐藏该策略组的展示(需前端适配)
icon: xxx- 预置代理组: GLOBAL (默认填充所有代理组和代理节点)
type
select: 通过客户端/api 手动选择使用的节点url-test: 自动测速, 根据健康检查结果自动选择延迟最低节点fallback: 故障转移, 若失败则按顺序自动切换到列表下一个节点load-balance: 负载均衡
strategy
负载均衡策略
round-robin: 将会把所有的请求分配给策略组内不同的代理节点consistent-hashing: 将相同的 目标地址 的请求分配给策略组内的同一个代理节点sticky-sessions: 将相同的 来源地址 和 目标地址 的请求分配给策略组内的同一个代理节点,缓存 10 分钟过期
dialer-proxy (链式代理)
proxies:
- name: "美国落地节点"
dialer-proxy: 香港中转
...
proxy-groups:
- name: 香港中转
type: url-test
include-all: true
filter: "(?i)港|hk|hongkong|hong kong"
url: 'https://www.gstatic.com/generate_204'
interval: 300
lazy: true
timeout: 5000
max-failed-times: 5
expected-status: 204将代理设置为 “落地节点” , 实际请求路线: 内核 → 香港中转 → 落地节点