Sudoku — mihomo
Sudoku 是 mihomo 原生的混淆代理协议。它承载一个经 AEAD 加密的记录流, 其字节被映射到数独网格式查找表上,因此其线路特征可偏向可打印 ASCII 或高熵噪声。在此之上,它还提供可选的 HTTP(S) 伪装、随机记录填充、流 多路复用以及 UDP-over-TCP。mihomo 将其同时实现为出站(客户端)与 入站(监听器)。
出站
位于 proxies: 下、type: sudoku 的条目。内嵌 BasicOption(通用 出站字段,如 tfo、mptcp、interface-name、routing-mark、 ip-version、dialer-proxy)。
| 字段 | 类型 | 默认值 | 允许值 | 描述 |
|---|---|---|---|---|
name | string | (required) | <string> | 唯一的代理名称。 |
server | string | (required) | <host> | 服务器主机名或 IP。 |
port | int | (required) | 1-65535 | 服务器端口。 |
key | string | (required) | <string> | 预共享密钥。必须与服务器一致;AEAD 种子与混淆表均由它派生。 |
aead-method | string | chacha20-poly1305 | <aead cipher> | 保护记录层的 AEAD 加密套件。 |
padding-min | *int | 10 | <int> | 为记录添加的随机填充的下界(字节)。 |
padding-max | *int | 30 | <int> | 为记录添加的随机填充的上界(字节)。 |
table-type | string | prefer_entropy | prefer_ascii | prefer_entropy | up_ascii_down_entropy | up_entropy_down_ascii | 混淆字节表的取向。方向性形式允许上行与下行使用不同的表。 |
enable-pure-downlink | *bool | true | true | false | 在服务器到客户端方向使用更轻量的纯下行帧。 |
http-mask | *bool | true | true | false | 将连接包裹在 HTTP(S) 隧道中,使其看起来像普通 Web 流量。默认启用。 |
http-mask-mode | string | legacy | legacy | stream | poll | auto | ws | HTTP 伪装传输。legacy 为经典升级;stream / poll / auto 使用真实的 HTTP 请求/响应隧道;ws 为 WebSocket 隧道。 |
http-mask-tls | bool | false | true | false | 将 HTTP 隧道包裹在 TLS 中。仅适用于 stream / poll / auto 模式。 |
http-mask-host | string | (unset) | <domain[:port]> | 在伪装隧道上发送的 Host / SNI 覆盖值。 |
path-root | string | (unset) | <path> | HTTP 隧道端点的第一级路径前缀。 |
http-mask-multiplex | string | off | off | auto | on | 隧道复用。auto 复用 h1/h2 隧道;on 开启单条多路复用隧道承载多个目标。 |
httpmask | *SudokuHTTPMaskOptions | (unset) | <object> | 结构化的 HTTP 伪装块;其键覆盖上面扁平的 http-mask-* 字段。 |
custom-table | string | (unset) | <layout> | 自定义字节布局模式(如 xpxvvpvv),代替内置表。 |
custom-tables | []string | (unset) | [<layout>] | 自定义字节布局模式的轮换。非空时覆盖 custom-table。 |
源码: adapter/outbound/sudoku.go:30-50 · 锚定版本 v1.19.27 (5184081)
httpmask
对扁平 http-mask-* 字段的结构化替代。存在时,其键优先。
| 字段 | 类型 | 默认值 | 允许值 | 描述 |
|---|---|---|---|---|
disable | bool | false | true | false | 为此代理禁用 HTTP 伪装。 |
mode | string | legacy | legacy | stream | poll | auto | ws | HTTP 伪装传输(与 http-mask-mode 取值相同)。 |
tls | bool | false | true | false | 将隧道包裹在 TLS 中(仅 stream / poll / auto)。 |
host | string | (unset) | <domain[:port]> | Host / SNI 覆盖值。 |
path-root | string | (unset) | <path> | 隧道端点的第一级路径前缀。 |
multiplex | string | off | off | auto | on | 隧道复用(与 http-mask-multiplex 取值相同)。 |
源码: adapter/outbound/sudoku.go:52-59 · 锚定版本 v1.19.27 (5184081)
入站
位于 listeners: 下、type: sudoku 的条目。内嵌 BaseOption(通用 监听器字段:name、listen、port 等)。
| 字段 | 类型 | 默认值 | 允许值 | 描述 |
|---|---|---|---|---|
key | string | (required) | <string> | 预共享密钥。客户端必须出示相同的值。 |
aead-method | string | chacha20-poly1305 | <aead cipher> | 保护记录层的 AEAD 加密套件。 |
padding-min | *int | 10 | <int> | 随机记录填充的下界(字节)。 |
padding-max | *int | 30 | <int> | 随机记录填充的上界(字节)。 |
table-type | string | prefer_entropy | prefer_ascii | prefer_entropy | up_ascii_down_entropy | up_entropy_down_ascii | 混淆字节表的取向;必须与客户端兼容。 |
handshake-timeout | *int | 5 | <seconds> | 完成握手所允许的最长时间,超时则断开连接。 |
enable-pure-downlink | *bool | true | true | false | 在服务器到客户端方向使用更轻量的纯下行帧。 |
custom-table | string | (unset) | <layout> | 自定义字节布局模式(如 xpxvvpvv)。 |
custom-tables | []string | (unset) | [<layout>] | 自定义字节布局模式的轮换。非空时覆盖 custom-table。 |
disable-http-mask | bool | false | true | false | 关闭监听器上的 HTTP 伪装层。 |
http-mask-mode | string | legacy | legacy | stream | poll | auto | 从客户端接受的 HTTP 伪装传输。 |
path-root | string | (unset) | <path> | HTTP 隧道端点的第一级路径前缀。 |
fallback | string | (unset) | <host:port> | 将未通过 Sudoku 握手的连接转发到何处——指向诱饵站点以作伪装。 |
httpmask | *SudokuHTTPMaskOptions | (unset) | <object> | 结构化的 HTTP 伪装块;其键覆盖 disable-http-mask / http-mask-mode / path-root。 |
mux-option | MuxOption | (unset) | <object> | 多路复用设置(mihomo 扩展,非标准 Sudoku 协议的一部分)。 |
源码: listener/inbound/sudoku.go:14-33 · 锚定版本 v1.19.27 (5184081)
httpmask
| 字段 | 类型 | 默认值 | 允许值 | 描述 |
|---|---|---|---|---|
disable | bool | false | true | false | 关闭监听器上的 HTTP 伪装。 |
mode | string | legacy | legacy | stream | poll | auto | HTTP 伪装传输(与 http-mask-mode 取值相同)。 |
path-root | string | (unset) | <path> | 隧道端点的第一级路径前缀。 |
源码: listener/inbound/sudoku.go:35-39 · 锚定版本 v1.19.27 (5184081)
示例
最简客户端出站:
proxies:
- name: sudoku-out
type: sudoku
server: example.com
port: 443
key: "your-pre-shared-key"经 TLS 的 HTTP 伪装,并复用多路复用隧道:
proxies:
- name: sudoku-tls
type: sudoku
server: example.com
port: 443
key: "your-pre-shared-key"
http-mask-mode: stream
http-mask-tls: true
http-mask-host: www.example.com
path-root: /assets
http-mask-multiplex: auto方向性表与更宽的填充:
proxies:
- name: sudoku-tuned
type: sudoku
server: 192.0.2.10
port: 8443
key: "your-pre-shared-key"
table-type: up_ascii_down_entropy
padding-min: 16
padding-max: 64带伪装回退的服务端监听器:
listeners:
- name: sudoku-in
type: sudoku
listen: 0.0.0.0
port: 443
key: "your-pre-shared-key"
http-mask-mode: stream
fallback: 127.0.0.1:8080说明
key为必填,且两端必须一致——AEAD 种子与混淆表均由它派生。table-type选择记录字节的塑形方式:prefer_ascii偏向可打印文本,prefer_entropy(默认)偏向随机噪声,而up_*_down_*形式对每个方向 应用不同的表。http-mask(默认开启)包裹流量使其类似 HTTP(S)。http-mask-tls仅对stream/poll/auto模式有意义;ws运行 WebSocket 隧道 (仅客户端)。http-mask-multiplex: on在单条多路复用隧道上承载多个目标;auto在可能时复用已有的 h1/h2 隧道。custom-table/custom-tables是字节布局的高级旋钮;custom-tables轮换多个模式,设置后覆盖custom-table。- Sudoku 经由 UDP-over-TCP 中继 UDP,因此无需单独的传输即可用于基于 UDP 的流量。
- 在监听器上,
fallback将未通过 Sudoku 握手的连接转发到另一地址—— 通常是诱饵 Web 服务器,使探测看到一个无害站点。
跨内核说明
- Sudoku 仅 mihomo 支持。sing-box 与 Xray-core 均未实现它; 若需在那里实现类似伪装,请使用它们各自的混淆传输(如 Shadowsocks 插件)。
源码: adapter/outbound/sudoku.go:30-50 · v1.19.27 (5184081)
源码: listener/inbound/sudoku.go:14-33 · v1.19.27 (5184081)
