Skip to content

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) را درون خود جای می‌دهد.

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
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) تا مانند ترافیک عادی وب به نظر برسد. به‌طور پیش‌فرض فعال است.
http-mask-modestringlegacylegacy | stream | poll | auto | wsترابرد استتار HTTP. مقدار 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 | wsترابرد استتار HTTP (همان مقادیر 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 (فیلدهای مشترک شنونده: name، listen، port، …) را درون خود جای می‌دهد.

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
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 | autoترابرد استتار HTTP (همان مقادیر 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"

استتار HTTP روی TLS، با بازاستفاده از چندسوسازی:

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

شنوندهٔ سمت سرور با یک fallback استتار:

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 ناموفق‌اند به نشانی دیگری هدایت می‌کند — معمولاً یک سرور وب فریب، تا کاوشگرها یک سایت بی‌خطر ببینند.

نکات بین‌هسته‌ای

  • 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)

Core Tutorial اثر Argsment