入站

流量怎么进来

在传统的 clash 时代, 只有全局的 port, socks-port, mixed-port. 所有水流都从一大大管子(如7890端口)进来, 想要将它们分开, 就必须设置复杂的规则引擎

clash mihomo 引入 listeners, 实现了源头即分类. 也就是在物理层面(端口级别)就把流量隔离开. 例如: A软件连10001端口, B软件走10002端口, mihomo 甚至不需要看数据包里是什么域名, 只需要看它从哪个门进入, 就能直接把它丢进对应的出站管道

listeners

当你在 listeners 中定义了一个门, mihomo 会向操作系统申请打开这个端口. 随后执行如下步骤:

  1. 协议握手: 按照你设定的类型 (HTTP, SOCKS, 甚至是 Shadowsocks, vmess 等) 接收数据
  2. 特权检查: 检查这个门有没有配置专属的 proxy 或 rule
  3. 分发: 如果有专属出口, 直接放行到目标出站; 如果没有, 再通过主规则引擎去匹配
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

将代理设置为 “落地节点” , 实际请求路线: 内核 香港中转 落地节点