Skip to content

Snell — sing-box ​

Snell پروتکل پراکسی سبک Surge است. sing-box هر دو سمت را پیاده‌سازی می‌کند: ورودی snell (سرور) و خروجی snell (کلاینت). این پیاده‌سازی همهٔ قابلیت‌های Snell به‌جز حالت پراکسی QUIC در v5 را پوشش می‌دهد، بنابراین نسخه‌ها در دو سمت متفاوت‌اند — ورودی نسخهٔ 5 یا 6 را ارائه می‌کند و خروجی با نسخهٔ 4 یا 6 کار می‌کند. به هیچ برچسب ساختی نیاز نیست.

ورودی ​

type: "snell" زیر inbounds[]، به‌علاوهٔ فیلدهای معمول شنونده (listen، listen_port و …):

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
versionint(required)5 | 6نسخهٔ Snell که این ورودی ارائه می‌کند. 5 کلاینت‌های v4 و v5 در Surge را می‌پذیرد (حالت پراکسی QUIC در v5 پیاده‌سازی نشده، پس قالب سیمی TCP همان v4 است)؛ 6 کلاینت‌های v6 را می‌پذیرد. نبودن مقدار یا مقدار دیگر هنگام راه‌اندازی خطا می‌دهد.

منبع: option/snell.go:12-17 · ثابت‌شده در v1.14.2 (af6e64c)

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
pskstring(required)<string>کلید پیش‌اشتراکی سرور. نسخهٔ 6 طولی بین 12 تا 255 بایت می‌خواهد.
users[]SnellUser[][SnellUser]حالت چندکاربره را فعال می‌کند: هر کلاینت با userkey خودش احراز هویت می‌شود و psk همچنان کلید سرور است.

منبع: option/snell.go:19-23 · ثابت‌شده در v1.14.2 (af6e64c)

users[] ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
namestring(unset)<string>برچسب اختیاری برای لاگ‌ها.
userkeystring(required)<string>کلید این کاربر. کلاینت‌ها آن را به‌عنوان userkey خروجی می‌فرستند.

منبع: option/snell.go:135-138 · ثابت‌شده در v1.14.2 (af6e64c)

خروجی ​

type: "snell" زیر outbounds[]، به‌علاوهٔ server / server_port و فیلدهای شماره‌گیری:

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
versionint(required)4 | 6نسخهٔ Snell مورد استفاده. 4 با سرورهای v4 و v5 کار می‌کند (v5 بدون حالت پراکسی QUIC در سطح سیم با v4 سازگار است)؛ 6 با سرورهای v6. نبودن مقدار یا مقدار دیگر هنگام راه‌اندازی خطا می‌دهد.

منبع: option/snell.go:70-75 · ثابت‌شده در v1.14.2 (af6e64c)

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
pskstring(required)<string>کلید پیش‌اشتراکی سرور؛ باید با سرور یکی باشد.
userkeystring(unset)<string>کلید کاربر برای سرور چندکاربره. برای سرور تک‌کاربره خالی بگذارید. نسخهٔ 6 کلیدهای بلندتر از 255 بایت را رد می‌کند.
reuseboolfalsetrue | falseاستفادهٔ دوباره از اتصال‌های سرور با فرمان CONNECT در Snell v2 به‌جای باز کردن یک اتصال TCP تازه برای هر درخواست.
networkNetworkList(tcp and udp)tcp | udpشبکه‌هایی که این خروجی رسیدگی می‌کند. UDP درون یک اتصال TCP به سرور حمل می‌شود.

منبع: option/snell.go:77-84 · ثابت‌شده در v1.14.2 (af6e64c)

فیلدهای مخصوص هر نسخه ​

این کلیدها در سطح بالای شیء ورودی یا خروجی و کنار version قرار می‌گیرند. sing-box فقط کلیدهای متعلق به نسخهٔ انتخاب‌شده را می‌خواند؛ کلیدی از نسخهٔ دیگر هنگام راه‌اندازی به‌عنوان فیلد ناشناخته رد می‌شود.

ابهام‌سازی — ورودی نسخهٔ 5 ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
obfs_modestringnonenone | http | tlsفقط نسخهٔ 5. ابهام‌سازی مورد انتظار سرور: هیچ، استتار درخواست HTTP یا استتار رکورد TLS. باید با کلاینت‌ها یکی باشد.

منبع: option/snell.go:131-133 · ثابت‌شده در v1.14.2 (af6e64c)

ابهام‌سازی — خروجی نسخهٔ 4 ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
obfs_modestringnonenone | http | tlsفقط نسخهٔ 4. ابهام‌سازی پیچیده‌شده دور اتصال؛ باید با سرور یکی باشد.
obfs_hoststringbing.com (http) / cloudfront.net (tls)<hostname>فقط نسخهٔ 4. میزبانی که ابهام‌سازی نشان می‌دهد: سرآیند Host در HTTP در حالت http، و نام سرور ClientHello جعلی در حالت tls.

منبع: option/snell.go:140-143 · ثابت‌شده در v1.14.2 (af6e64c)

شکل‌دهی ترافیک — نسخهٔ 6 (هر دو سمت) ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
modestringdefaultdefault | unshaped | unsafe-rawفقط نسخهٔ 6. default ترافیک را با نمایهٔ رکورد و لایه‌گذاری مشتق از PSK شکل می‌دهد؛ unshaped رمزنگاری AEAD را نگه می‌دارد ولی شکل‌دهی را حذف می‌کند؛ unsafe-raw رکوردها را بدون رمزنگاری می‌فرستد. در هر دو سمت یک حالت را به کار ببرید.

منبع: option/snell.go:145-147 · ثابت‌شده در v1.14.2 (af6e64c)

مثال‌ها ​

سرور نسخهٔ 6 با دو کاربر:

json
{
  "inbounds": [
    {
      "type": "snell",
      "tag": "snell-in",
      "listen": "::",
      "listen_port": 8443,
      "version": 6,
      "psk": "<at-least-12-byte-psk>",
      "users": [
        { "name": "alice", "userkey": "<alice-key>" },
        { "name": "bob", "userkey": "<bob-key>" }
      ]
    }
  ]
}

کلاینت نسخهٔ 6 برای همان سرور:

json
{
  "outbounds": [
    {
      "type": "snell",
      "tag": "snell-out",
      "server": "snell.example.com",
      "server_port": 8443,
      "version": 6,
      "psk": "<at-least-12-byte-psk>",
      "userkey": "<alice-key>"
    }
  ]
}

کلاینت نسخهٔ 4 با ابهام‌سازی HTTP (با سرورهای v4 و v5 کار می‌کند):

json
{
  "outbounds": [
    {
      "type": "snell",
      "tag": "snell-v4",
      "server": "snell.example.com",
      "server_port": 8388,
      "version": 4,
      "psk": "<psk>",
      "obfs_mode": "http",
      "obfs_host": "www.bing.com"
    }
  ]
}

نکات ​

  • جفت‌های نسخه عمدی‌اند: بدون حالت پراکسی QUIC در v5، پروتکل سیمی TCP در v5 با v4 یکسان است، پس sing-box یک سرور v5 (که کلاینت‌های v4 و v5 به آن می‌رسند) و یک کلاینت v4 (که به سرورهای v4 و v5 می‌رسد) ارائه می‌کند، اما سرور v4 یا کلاینت v5 ندارد.
  • obfs_mode: "tls" توسط تجزیه‌گر پذیرفته و در کتابخانهٔ Snell پیاده‌سازی شده است، هرچند مرجع گزینه‌های بالادست فقط none و http را فهرست می‌کند.
  • ورودی فقط روی TCP گوش می‌دهد. UDP کلاینت‌ها درون جریان TCP بازپخش می‌شود و خروجی هم همین کار را می‌کند، پس لازم نیست پورت UDP روی سرور باز شود.
  • unsafe-raw لایهٔ رمزنگاری را کاملاً حذف می‌کند. فقط جایی از آن استفاده کنید که مسیر از قبل محافظت شده است (مثلاً درون تونلی دیگر).
  • در حالت چندکاربره psk سطح بالا همچنان لازم است و میان همهٔ کاربران مشترک است؛ هر کاربر با userkey خود شناخته می‌شود.

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

  • mihomo نیز Snell را در هر دو سمت دارد، با کلیدهای kebab-case: خروجی version 1 تا 5 را می‌پذیرد (سرورهای v5 را به شیوهٔ v4 شماره‌گیری می‌کند) و ابهام‌سازی را زیر obfs-opts قرار می‌دهد (http / tls به‌علاوهٔ لایه‌های استتار shadow-tls / restls / jls)؛ ورودی از obfs-opts با http / tls استفاده می‌کند. mihomo نسخهٔ v6 از Snell را ندارد. به Snell — mihomo مراجعه کنید.
  • Xray-core از Snell پشتیبانی نمی‌کند.

منبع: option/snell.go:12-147 · v1.14.2 (af6e64c)

Core Tutorial اثر Argsment