Snell — sing-box
Snell پروتکل پراکسی سبک Surge است. sing-box هر دو سمت را پیادهسازی میکند: ورودی snell (سرور) و خروجی snell (کلاینت). این پیادهسازی همهٔ قابلیتهای Snell بهجز حالت پراکسی QUIC در v5 را پوشش میدهد، بنابراین نسخهها در دو سمت متفاوتاند — ورودی نسخهٔ 5 یا 6 را ارائه میکند و خروجی با نسخهٔ 4 یا 6 کار میکند. به هیچ برچسب ساختی نیاز نیست.
ورودی
type: "snell" زیر inbounds[]، بهعلاوهٔ فیلدهای معمول شنونده (listen، listen_port و …):
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
version | int | (required) | 5 | 6 | نسخهٔ Snell که این ورودی ارائه میکند. 5 کلاینتهای v4 و v5 در Surge را میپذیرد (حالت پراکسی QUIC در v5 پیادهسازی نشده، پس قالب سیمی TCP همان v4 است)؛ 6 کلاینتهای v6 را میپذیرد. نبودن مقدار یا مقدار دیگر هنگام راهاندازی خطا میدهد. |
منبع: option/snell.go:12-17 · ثابتشده در v1.14.2 (af6e64c)
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
psk | string | (required) | <string> | کلید پیشاشتراکی سرور. نسخهٔ 6 طولی بین 12 تا 255 بایت میخواهد. |
users | []SnellUser | [] | [SnellUser] | حالت چندکاربره را فعال میکند: هر کلاینت با userkey خودش احراز هویت میشود و psk همچنان کلید سرور است. |
منبع: option/snell.go:19-23 · ثابتشده در v1.14.2 (af6e64c)
users[]
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
name | string | (unset) | <string> | برچسب اختیاری برای لاگها. |
userkey | string | (required) | <string> | کلید این کاربر. کلاینتها آن را بهعنوان userkey خروجی میفرستند. |
منبع: option/snell.go:135-138 · ثابتشده در v1.14.2 (af6e64c)
خروجی
type: "snell" زیر outbounds[]، بهعلاوهٔ server / server_port و فیلدهای شمارهگیری:
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
version | int | (required) | 4 | 6 | نسخهٔ Snell مورد استفاده. 4 با سرورهای v4 و v5 کار میکند (v5 بدون حالت پراکسی QUIC در سطح سیم با v4 سازگار است)؛ 6 با سرورهای v6. نبودن مقدار یا مقدار دیگر هنگام راهاندازی خطا میدهد. |
منبع: option/snell.go:70-75 · ثابتشده در v1.14.2 (af6e64c)
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
psk | string | (required) | <string> | کلید پیشاشتراکی سرور؛ باید با سرور یکی باشد. |
userkey | string | (unset) | <string> | کلید کاربر برای سرور چندکاربره. برای سرور تککاربره خالی بگذارید. نسخهٔ 6 کلیدهای بلندتر از 255 بایت را رد میکند. |
reuse | bool | false | true | false | استفادهٔ دوباره از اتصالهای سرور با فرمان CONNECT در Snell v2 بهجای باز کردن یک اتصال TCP تازه برای هر درخواست. |
network | NetworkList | (tcp and udp) | tcp | udp | شبکههایی که این خروجی رسیدگی میکند. UDP درون یک اتصال TCP به سرور حمل میشود. |
منبع: option/snell.go:77-84 · ثابتشده در v1.14.2 (af6e64c)
فیلدهای مخصوص هر نسخه
این کلیدها در سطح بالای شیء ورودی یا خروجی و کنار version قرار میگیرند. sing-box فقط کلیدهای متعلق به نسخهٔ انتخابشده را میخواند؛ کلیدی از نسخهٔ دیگر هنگام راهاندازی بهعنوان فیلد ناشناخته رد میشود.
ابهامسازی — ورودی نسخهٔ 5
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
obfs_mode | string | none | none | http | tls | فقط نسخهٔ 5. ابهامسازی مورد انتظار سرور: هیچ، استتار درخواست HTTP یا استتار رکورد TLS. باید با کلاینتها یکی باشد. |
منبع: option/snell.go:131-133 · ثابتشده در v1.14.2 (af6e64c)
ابهامسازی — خروجی نسخهٔ 4
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
obfs_mode | string | none | none | http | tls | فقط نسخهٔ 4. ابهامسازی پیچیدهشده دور اتصال؛ باید با سرور یکی باشد. |
obfs_host | string | bing.com (http) / cloudfront.net (tls) | <hostname> | فقط نسخهٔ 4. میزبانی که ابهامسازی نشان میدهد: سرآیند Host در HTTP در حالت http، و نام سرور ClientHello جعلی در حالت tls. |
منبع: option/snell.go:140-143 · ثابتشده در v1.14.2 (af6e64c)
شکلدهی ترافیک — نسخهٔ 6 (هر دو سمت)
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
mode | string | default | default | unshaped | unsafe-raw | فقط نسخهٔ 6. default ترافیک را با نمایهٔ رکورد و لایهگذاری مشتق از PSK شکل میدهد؛ unshaped رمزنگاری AEAD را نگه میدارد ولی شکلدهی را حذف میکند؛ unsafe-raw رکوردها را بدون رمزنگاری میفرستد. در هر دو سمت یک حالت را به کار ببرید. |
منبع: option/snell.go:145-147 · ثابتشده در v1.14.2 (af6e64c)
مثالها
سرور نسخهٔ 6 با دو کاربر:
{
"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 برای همان سرور:
{
"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 کار میکند):
{
"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: خروجی
version1 تا 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)
