Skip to content

Snell — mihomo

Snell پروتکل پراکسی سبک‌وزنِ Surge است. mihomo هم یک خروجی Snell (برای اتصال به یک سرور Snell) و هم، به‌تازگی، یک شنوندهٔ ورودی Snell (برای عمل‌کردن به‌عنوان یک سرور) را پیاده‌سازی می‌کند. هر دو سمت از لایهٔ مبهم‌سازی simple-obfs با حالت‌های http یا tls پشتیبانی می‌کنند؛ obfs-opts.mode خروجی علاوه بر آن لایه‌های پوشش TLS یعنی shadow-tls، restls و jls را می‌پذیرد که همتاهای ورودی آن‌ها بلوک‌های اختصاصی شنوندهٔ shadow-tls / res-tls / jls-config هستند.

خروجی

ورودی زیر proxies: با type: snell. این BasicOption (فیلدهای مشترک خروجی) را در خود جای می‌دهد.

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
namestring(required)<string>نام یکتای پراکسی.
serverstring(required)<host>نام میزبان یا IP سرور بالادست.
portint(required)<port>پورت سرور بالادست.
pskstring(required)<string>کلید پیش‌مشترک (گذرواژه).
udpboolfalsetrue | falseفعال‌سازی بازپخش UDP (در Snell نسخهٔ ۲ به بعد).
versionint11 | 2 | 3 | 4 | 5نسخهٔ پروتکل Snell. سرورهای v5 با کلاینت‌های v4 سازگاری عقب‌رو دارند، پس mihomo آن‌ها را به‌صورت v4 شماره‌گیری می‌کند.
reuseboolfalsetrue | falseاستفادهٔ مجدد از اتصالات زیرین.
obfs-optsmap[string]any(disabled){ mode, ... }گزینه‌های مبهم‌سازی. `mode` گزینهٔ `http` / `tls` (simple-obfs، با `host`) یا `shadow-tls` / `restls` / `jls` را انتخاب می‌کند؛ کلیدهای باقی‌مانده از طرح افزونهٔ متناظر Shadowsocks پیروی می‌کنند.
client-fingerprintstring(global)chrome | firefox | safari | ios | edge | random | randomizedاثرانگشت client-hello مبتنی بر uTLS که حالت‌های obfs `shadow-tls` / `restls` / `jls` استفاده می‌کنند.

منبع: adapter/outbound/snell.go:32-43 · ثابت‌شده در v1.19.29 (e26714a)

ورودی

ورودی زیر listeners: با type: snell. این BaseOption را در خود جای می‌دهد (listen، port).

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
pskstring(required)<string>کلید پیش‌مشترک (گذرواژه).
versionint41 | 2 | 3 | 4 | 5نسخهٔ پروتکل Snell.
udpboolfalsetrue | falseفعال‌سازی بازپخش UDP (در Snell نسخهٔ ۲ به بعد).
obfs-optsSnellObfsOption(disabled)SnellObfsOptionگزینه‌های simple-obfs (`{ mode, host }`).
shadow-tlsShadowTLS(disabled)ShadowTLSبلوک پوشش Shadow-TLS سمت سرور (`{ enable, version, password, users, handshake, ... }`).
res-tlsResTLS(disabled)ResTLSبلوک پوشش Restls سمت سرور (`{ enable, dest, password, ... }`)؛ کلاینت‌های احراز هویت‌نشده به `dest` بازپخش می‌شوند.
jls-configJLSConfig(disabled)JLSConfigبلوک پوشش JLS سمت سرور (`{ enable, users, sni, dest, ... }`)؛ کلاینت‌های احراز هویت‌نشده به `dest` بازپخش می‌شوند.

منبع: listener/inbound/snell.go:13-22 · ثابت‌شده در v1.19.29 (e26714a)

obfs-opts

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
modestring(unset)http | tlsحالت مبهم‌سازی.
hoststring(unset)<host>هدر host مبهم‌سازی.

منبع: listener/inbound/snell.go:28-31 · ثابت‌شده در v1.19.29 (e26714a)

مثال‌ها

خروجی — Snell ساده:

yaml
proxies:
  - name: snell-srv
    type: snell
    server: example.com
    port: 44046
    psk: <pre-shared-key>
    version: 3
    udp: true

خروجی — Snell با مبهم‌سازی HTTP:

yaml
proxies:
  - name: snell-obfs
    type: snell
    server: example.com
    port: 44046
    psk: <pre-shared-key>
    version: 3
    obfs-opts:
      mode: http
      host: bing.com

ورودی زیر listeners:

yaml
listeners:
  - name: snell-in
    type: snell
    listen: 0.0.0.0
    port: 44046
    psk: <pre-shared-key>
    version: 3
    udp: true
    obfs-opts:
      mode: tls
      host: bing.com

نکات

  • psk راز مشترک است؛ خروجی و ورودی باید از همان مقدار استفاده کنند.
  • بازپخش UDP به Snell نسخهٔ ۲ یا جدیدتر نیاز دارد — فعال‌کردن udp روی یک همتای نسخهٔ ۱ رد می‌شود.
  • reuse (فقط خروجی) از اتصال زیرین مجدداً استفاده می‌کند. این برای Snell نسخهٔ ۲ به‌طور ضمنی اعمال می‌شود؛ برای نسخهٔ ۴ از طریق این فیلد انتخابی است.
  • obfs-opts.mode لایهٔ مبهم‌سازی را انتخاب می‌کند: http جریان را در یک درخواست HTTP جعلی می‌پیچد، tls آن را در یک رکورد TLS جعلی می‌پیچد (host هدر host مبهم‌سازی را تنظیم می‌کند)، و shadow-tls / restls / jls دست‌دهی پوشش TLS متناظر را اجرا می‌کنند — کلیدهای باقی‌ماندهٔ obfs-opts سپس از همان طرح بلوک plugin-opts متناظر Shadowsocks پیروی می‌کنند (به Shadowsocks مراجعه کنید). برای نبودِ مبهم‌سازی، obfs-opts را تنظیم‌نشده بگذارید. هر دو سمت باید بر سر حالت و تنظیمات آن توافق کنند.
  • client-fingerprint خروجی فقط برای حالت‌های obfs shadow-tls / restls / jls اهمیت دارد، جایی که client-hello مبتنی بر uTLS تقلیدشده در طول دست‌دهی پوشش را انتخاب می‌کند.
  • ورودی در obfs-opts فقط http / tls را می‌پذیرد؛ لایه‌های پوشش TLS آن به‌جای این از طریق بلوک‌های اختصاصی shadow-tls / res-tls / jls-config پیکربندی می‌شوند که دوبه‌دو ناسازگارند.

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

  • Snell مخصوص Surge است. نه Xray-core و نه sing-box از آن پشتیبانی می‌کنند — در هیچ‌یک از این دو هسته خروجی یا ورودی معادلی وجود ندارد.

منبع: adapter/outbound/snell.go:32-43 · v1.19.29 (e26714a)

Core Tutorial اثر Argsment