Skip to content

Sudoku — mihomo

Sudoku 是 mihomo 原生的混淆代理协议。它承载一个经 AEAD 加密的记录流, 其字节被映射到数独网格式查找表上,因此其线路特征可偏向可打印 ASCII 或高熵噪声。在此之上,它还提供可选的 HTTP(S) 伪装、随机记录填充、流 多路复用以及 UDP-over-TCP。mihomo 将其同时实现为出站(客户端)与 入站(监听器)。

出站

位于 proxies: 下、type: sudoku 的条目。内嵌 BasicOption(通用 出站字段,如 tfomptcpinterface-namerouting-markip-versiondialer-proxy)。

字段类型默认值允许值描述
namestring(required)<string>唯一的代理名称。
serverstring(required)<host>服务器主机名或 IP。
portint(required)1-65535服务器端口。
keystring(required)<string>预共享密钥。必须与服务器一致;AEAD 种子与混淆表均由它派生。
aead-methodstringchacha20-poly1305<aead cipher>保护记录层的 AEAD 加密套件。
padding-min*int10<int>为记录添加的随机填充的下界(字节)。
padding-max*int30<int>为记录添加的随机填充的上界(字节)。
table-typestringprefer_entropyprefer_ascii | prefer_entropy | up_ascii_down_entropy | up_entropy_down_ascii混淆字节表的取向。方向性形式允许上行与下行使用不同的表。
enable-pure-downlink*booltruetrue | false在服务器到客户端方向使用更轻量的纯下行帧。
http-mask*booltruetrue | false将连接包裹在 HTTP(S) 隧道中,使其看起来像普通 Web 流量。默认启用。
http-mask-modestringlegacylegacy | stream | poll | auto | wsHTTP 伪装传输。legacy 为经典升级;stream / poll / auto 使用真实的 HTTP 请求/响应隧道;ws 为 WebSocket 隧道。
http-mask-tlsboolfalsetrue | false将 HTTP 隧道包裹在 TLS 中。仅适用于 stream / poll / auto 模式。
http-mask-hoststring(unset)<domain[:port]>在伪装隧道上发送的 Host / SNI 覆盖值。
path-rootstring(unset)<path>HTTP 隧道端点的第一级路径前缀。
http-mask-multiplexstringoffoff | auto | on隧道复用。auto 复用 h1/h2 隧道;on 开启单条多路复用隧道承载多个目标。
httpmask*SudokuHTTPMaskOptions(unset)<object>结构化的 HTTP 伪装块;其键覆盖上面扁平的 http-mask-* 字段。
custom-tablestring(unset)<layout>自定义字节布局模式(如 xpxvvpvv),代替内置表。
custom-tables[]string(unset)[<layout>]自定义字节布局模式的轮换。非空时覆盖 custom-table。

源码: adapter/outbound/sudoku.go:30-50 · 锚定版本 v1.19.27 (5184081)

httpmask

对扁平 http-mask-* 字段的结构化替代。存在时,其键优先。

字段类型默认值允许值描述
disableboolfalsetrue | false为此代理禁用 HTTP 伪装。
modestringlegacylegacy | stream | poll | auto | wsHTTP 伪装传输(与 http-mask-mode 取值相同)。
tlsboolfalsetrue | false将隧道包裹在 TLS 中(仅 stream / poll / auto)。
hoststring(unset)<domain[:port]>Host / SNI 覆盖值。
path-rootstring(unset)<path>隧道端点的第一级路径前缀。
multiplexstringoffoff | auto | on隧道复用(与 http-mask-multiplex 取值相同)。

源码: adapter/outbound/sudoku.go:52-59 · 锚定版本 v1.19.27 (5184081)

入站

位于 listeners: 下、type: sudoku 的条目。内嵌 BaseOption(通用 监听器字段:namelistenport 等)。

字段类型默认值允许值描述
keystring(required)<string>预共享密钥。客户端必须出示相同的值。
aead-methodstringchacha20-poly1305<aead cipher>保护记录层的 AEAD 加密套件。
padding-min*int10<int>随机记录填充的下界(字节)。
padding-max*int30<int>随机记录填充的上界(字节)。
table-typestringprefer_entropyprefer_ascii | prefer_entropy | up_ascii_down_entropy | up_entropy_down_ascii混淆字节表的取向;必须与客户端兼容。
handshake-timeout*int5<seconds>完成握手所允许的最长时间,超时则断开连接。
enable-pure-downlink*booltruetrue | false在服务器到客户端方向使用更轻量的纯下行帧。
custom-tablestring(unset)<layout>自定义字节布局模式(如 xpxvvpvv)。
custom-tables[]string(unset)[<layout>]自定义字节布局模式的轮换。非空时覆盖 custom-table。
disable-http-maskboolfalsetrue | false关闭监听器上的 HTTP 伪装层。
http-mask-modestringlegacylegacy | stream | poll | auto从客户端接受的 HTTP 伪装传输。
path-rootstring(unset)<path>HTTP 隧道端点的第一级路径前缀。
fallbackstring(unset)<host:port>将未通过 Sudoku 握手的连接转发到何处——指向诱饵站点以作伪装。
httpmask*SudokuHTTPMaskOptions(unset)<object>结构化的 HTTP 伪装块;其键覆盖 disable-http-mask / http-mask-mode / path-root。
mux-optionMuxOption(unset)<object>多路复用设置(mihomo 扩展,非标准 Sudoku 协议的一部分)。

源码: listener/inbound/sudoku.go:14-33 · 锚定版本 v1.19.27 (5184081)

httpmask

字段类型默认值允许值描述
disableboolfalsetrue | false关闭监听器上的 HTTP 伪装。
modestringlegacylegacy | stream | poll | autoHTTP 伪装传输(与 http-mask-mode 取值相同)。
path-rootstring(unset)<path>隧道端点的第一级路径前缀。

源码: listener/inbound/sudoku.go:35-39 · 锚定版本 v1.19.27 (5184081)

示例

最简客户端出站:

yaml
proxies:
  - name: sudoku-out
    type: sudoku
    server: example.com
    port: 443
    key: "your-pre-shared-key"

经 TLS 的 HTTP 伪装,并复用多路复用隧道:

yaml
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

方向性表与更宽的填充:

yaml
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

带伪装回退的服务端监听器:

yaml
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-boxXray-core 均未实现它; 若需在那里实现类似伪装,请使用它们各自的混淆传输(如 Shadowsocks 插件)。

源码: adapter/outbound/sudoku.go:30-50 · v1.19.27 (5184081)

源码: listener/inbound/sudoku.go:14-33 · v1.19.27 (5184081)

由 Argsment 出品的 Core Tutorial