TLS — sing-box
هر ورودی و خروجی sing-box یک بلوک tls: { ... } را از طریق InboundTLSOptionsContainer / OutboundTLSOptionsContainer تعبیه میکند. همان بلوک، زیربلوکهای REALITY، ECH و uTLS را بهعنوان گزینههای تودرتو حمل میکند — اینها ویژگیهای جداگانهٔ سطح بالا نیستند.
tls ورودی
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
enabled | bool | false | true | false | کلید اصلی. وقتی false باشد، بقیهٔ بلوک نادیده گرفته میشود. |
server_name | string | (inferred from SNI) | <hostname> | نام سرور مورد انتظار برای تأمین ACME. در صورت تنظیم acme لازم است. |
insecure | bool | false | true | false | رد کردن تأیید TLS. فقط آزمایش. |
alpn | badoption.Listable[string] | [] | <ALPN string> | فهرست ALPN ارائهشده به کلاینتها. |
min_version | string | 1.2 | 1.0 | 1.1 | 1.2 | 1.3 | حداقل نسخهٔ TLS قابلقبول. |
max_version | string | 1.3 | 1.0 | 1.1 | 1.2 | 1.3 | حداکثر نسخهٔ TLS قابلقبول. |
cipher_suites | badoption.Listable[string] | (library default) | <cipher> | بازنویسی فهرست مجموعهٔ رمز (فقط TLS 1.2). |
curve_preferences | badoption.Listable[CurvePreference] | (library default) | P256 | P384 | P521 | X25519 | X25519MLKEM768 | فهرست اولویت منحنی تبادل کلید. |
certificate | badoption.Listable[string] | [] | <PEM block> | PEM گواهی سرور درونخطی. شکل فهرستی از زنجیرهٔ کامل پشتیبانی میکند. |
certificate_path | string | (unset) | <PEM file path> | مسیر گواهی سرور. |
client_authentication | ClientAuthType | no | no | request | require-any | verify-if-given | require-and-verify | خطمشی احراز هویت کلاینت TLS متقابل. به مقادیر ClientAuthType از crypto/tls گو نگاشت میشود. |
client_certificate | badoption.Listable[string] | [] | <PEM block> | ریشههای گواهی کلاینت مورد اعتماد (mTLS). |
client_certificate_path | badoption.Listable[string] | [] | <PEM file path> | ریشههای کلاینت مورد اعتماد به شکل مسیر. |
client_certificate_public_key_sha256 | badoption.Listable[[]byte] | [] | <SHA-256 bytes> | پینکردن گواهی کلاینت بر اساس SHA-256 کلید عمومی. هنگام صدور گواهیهای کلاینت یکبارمصرف مفید است. |
key | badoption.Listable[string] | [] | <PEM block> | کلید خصوصی سرور درونخطی. |
key_path | string | (unset) | <file path> | مسیر کلید خصوصی سرور. |
kernel_tx | bool | false | true | false | KTLS لینوکس — برونسپاری رمزگذاری TLS به هسته برای ترافیک خروجی. به پشتیبانی هسته از TLS و ماژولهای رمزنگاری صحیح نیاز دارد. |
kernel_rx | bool | false | true | false | KTLS لینوکس برای ترافیک ورودی. |
handshake_timeout | badoption.Duration | 15s | <duration> | مهلت دستدهی TLS (قالب duration در Go). |
certificate_provider | *CertificateProviderOptions | (unset) | <provider tag> | CertificateProviderOptions | گواهی مدیریتشده توسط یک تأمینکنندهٔ گواهی: tag یک مدخل در certificate_providers سطح بالا، یا یک شیء تأمینکنندهٔ درونخطی با type (acme، tailscale، cloudflare-origin-ca). وقتی تنظیم شود، certificate / key خوانده نمیشوند. با acme متقابلاً انحصاری است؛ با reality در دسترس نیست. |
acme | *InboundACMEOptions | (deprecated) | InboundACMEOptions | منسوخ: ACME درونخطی. بهجای آن از certificate_provider با type: acme استفاده کنید — فیلدها بدون تغییر منتقل میشوند. با certificate_provider متقابلاً انحصاری است. |
ech | *InboundECHOptions | (unset) | InboundECHOptions | پیکربندی Encrypted Client Hello. |
reality | *InboundRealityOptions | (unset) | InboundRealityOptions | پیکربندی سرور REALITY. با TLS عادی متقابلاً انحصاری است — REALITY دستدهی TLS را جایگزین میکند. |
منبع: option/tls.go:13-40 · ثابتشده در v1.14.2 (af6e64c)
tls خروجی
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
enabled | bool | false | true | false | کلید اصلی. |
engine | string | go | go | apple | windows | پیادهسازی TLS برای دستدهی. apple از Network.framework استفاده میکند (ساختهای Apple با CGO)؛ windows از Schannel از طریق SSPI (Windows build 17763 به بالا؛ TLS 1.3 فقط در Windows 11 / Server 2022 به بالا). موتورهای غیر go فقط server_name، insecure، alpn، min_version، max_version، certificate(_path)، certificate_public_key_sha256 و handshake_timeout را میپذیرند؛ هر گزینهٔ TLS دیگری هنگام راهاندازی رد میشود. |
disable_sni | bool | false | true | false | حذف کامل افزونهٔ SNI از ClientHello. |
server_name | string | (server address) | <hostname> | SNI ارسالشده به سرور، و نامی که در برابر گواهی برگ تأیید میشود. |
insecure | bool | false | true | false | رد کردن تأیید گواهی سرور. |
alpn | badoption.Listable[string] | [] | <ALPN string> | فهرست ALPN ارائهشده به سرور. |
min_version | string | 1.2 | 1.0 | 1.1 | 1.2 | 1.3 | حداقل نسخهٔ TLS قابلقبول. |
max_version | string | 1.3 | 1.0 | 1.1 | 1.2 | 1.3 | حداکثر نسخهٔ TLS قابلقبول. |
cipher_suites | badoption.Listable[string] | (library default) | <cipher> | بازنویسی فهرست مجموعهٔ رمز. |
curve_preferences | badoption.Listable[CurvePreference] | (library default) | <see inbound> | اولویت منحنی تبادل کلید. |
certificate | badoption.Listable[string] | [] | <PEM block> | گواهیهای CA مورد اعتماد افزودهشده به انبار ریشهٔ سیستم. برای سرورهای خودامضا با insecure: false استفاده شود. |
certificate_path | string | (unset) | <file path> | CAهای مورد اعتماد به شکل مسیر. |
certificate_public_key_sha256 | badoption.Listable[[]byte] | [] | <SHA-256 bytes> | پینکردن گواهی سرور بر اساس SHA-256 کلید عمومی. |
client_certificate | badoption.Listable[string] | [] | <PEM block> | گواهی کلاینت (mTLS). |
client_certificate_path | string | (unset) | <file path> | گواهی کلاینت به شکل مسیر. |
client_key | badoption.Listable[string] | [] | <PEM block> | کلید خصوصی کلاینت. |
client_key_path | string | (unset) | <file path> | کلید خصوصی کلاینت به شکل مسیر. |
fragment | bool | false | true | false | تکهتکهسازی دستدهی در سطح TCP. ClientHello را در میان بستهها میشکند تا از DPI مبتنی بر SNI فرار کند. |
fragment_fallback_delay | badoption.Duration | 500ms | <duration> | اگر دستدهی تکهتکهشده تا این مهلت کامل نشود، بدون تکهتکهسازی دوباره تلاش میکند. |
record_fragment | bool | false | true | false | تکهتکهسازی لایهٔ رکورد TLS (تهاجمیتر از fragment — درون جریان رکورد TLS تقسیم میکند، نه فقط بستههای TCP). |
spoof | string | (unset) | <hostname> | پیش از ClientHello واقعی، یک نسخهٔ جعلی از آن با این SNI فرستاده میشود تا تجهیزات میانی فیلترکنندهٔ SNI که نامهای میزبان خاصی را مجاز میدانند فریب بخورند. باید با server_name متفاوت باشد. فقط Linux، macOS و Windows؛ به دسترسی سوکت خام نیاز دارد (CAP_NET_RAW + CAP_NET_ADMIN در Linux، root در macOS، Administrator در Windows؛ Windows ARM64 پشتیبانی نمیشود). |
spoof_method | string | wrong-sequence | wrong-sequence | wrong-checksum | wrong-ack | wrong-md5 | wrong-timestamp | روشی که سرور واقعی قطعهٔ جعلی را دور بریزد: شمارهٔ ترتیب خارج از پنجره (پیشفرض)، checksum نادرست، ACK خارج از پنجره، گزینهٔ TCP-MD5، یا timestamp عقبافتاده (wrong-timestamp در macOS پشتیبانی نمیشود). |
kernel_tx | bool | false | true | false | KTLS لینوکس برای ترافیک خروجی. |
kernel_rx | bool | false | true | false | KTLS لینوکس برای ترافیک ورودی. |
handshake_timeout | badoption.Duration | 15s | <duration> | مهلت دستدهی TLS (قالب duration در Go). |
ech | *OutboundECHOptions | (unset) | OutboundECHOptions | پیکربندی ECH. وقتی تنظیم نشود، ECH استفاده نمیشود (مگر اینکه از طریق رکوردهای HTTPS بهطور خودکار کشف شود). |
utls | *OutboundUTLSOptions | (unset) | OutboundUTLSOptions | تقلید ClientHello کلاینت uTLS. |
reality | *OutboundRealityOptions | (unset) | OutboundRealityOptions | پیکربندی کلاینت REALITY. با TLS عادی متقابلاً انحصاری است. |
منبع: option/tls.go:107-136 · ثابتشده در v1.14.2 (af6e64c)
utls
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
enabled | bool | false | true | false | روشن کردن uTLS. |
fingerprint | string | chrome | chrome | firefox | safari | ios | android | edge | 360 | qq | random | randomized | اثرانگشت مرورگر برای تقلید. کل ClientHello (مجموعهٔ رمز، افزونهها، امضاها) را راهبری میکند. |
منبع: option/tls.go:247-250 · ثابتشده در v1.14.2 (af6e64c)
تأمینکنندههای گواهی
گواهی سرور میتواند بهجای فایل یا بلوک درونخطی acme از یک تأمینکنندهٔ گواهی بیاید. تأمینکنندهها را در آرایهٔ سطح بالای certificate_providers تعریف کنید (هرکدام با type و tag) و از tls.certificate_provider با tag به یکی ارجاع دهید، یا شیء تأمینکننده را همانجا درونخطی بگذارید. نوعها: acme (به برچسب ساخت with_acme نیاز دارد)، tailscale (از یک نقطهانتهایی Tailscale استفادهٔ دوباره میکند؛ MagicDNS و HTTPS باید در tailnet فعال باشند) و cloudflare-origin-ca. مرجع کامل گزینهها: تأمینکنندگان گواهی. تأمینکنندهٔ acme:
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
domain | badoption.Listable[string] | (required) | <domain> | … | دامنههایی که برایشان گواهی درخواست میشود. الزامی. |
data_directory | string | (certmagic default) | <dir path> | محل نگهداری وضعیت و گواهیهای ACME. پیشفرض: $XDG_DATA_HOME/certmagic یا $HOME/.local/share/certmagic. |
email | string | (unset) | <e-mail> | ایمیل حساب برای ساخت یا انتخاب حساب ACME. |
provider | string | letsencrypt | letsencrypt | zerossl | <https:// directory URL> | CA مربوط به ACME. با zerossl، اگر email تنظیم و external_account خالی باشد، اعتبارنامهٔ EAB خودکار درخواست میشود. |
account_key | string | (unset) | <PEM key> | کلید خصوصی PEM یک حساب ACME موجود. |
dns01_challenge | *ACMEProviderDNS01ChallengeOptions | (unset) | ACMEProviderDNS01ChallengeOptions | تنظیمات چالش DNS-01 (provider: alidns، cloudflare، acmedns، بهعلاوهٔ ttl، propagation_delay، propagation_timeout، resolvers، override_domain). وقتی تنظیم شود، دیگر روشهای چالش غیرفعال میشوند. |
key_type | ACMEKeyType | (certmagic default) | ed25519 | p256 | p384 | rsa2048 | rsa4096 | نوع کلید برای گواهیهای تازه صادرشده. |
profile | string | (unset) | <ACME profile> | پروفایل ACME برای صدور. با Let's Encrypt، اگر یکی از دامنهها آدرس IP باشد، shortlived خودکار انتخاب میشود. |
http_client | *HTTPClientOptions | (default client) | <http_clients tag> | HTTPClientOptions | کلاینت HTTP برای همهٔ درخواستهای ACME: یک شیء درونخطی یا tag یک مدخل http_clients. |
منبع: option/acme.go:15-31 · ثابتشده در v1.14.2 (af6e64c)
مثالها
ورودی با تأمینکنندهٔ گواهی ACME درونخطی:
{
"inbounds": [{
"type": "vless",
"listen_port": 443,
"users": [{ "uuid": "..." }],
"tls": {
"enabled": true,
"server_name": "example.com",
"alpn": ["h2", "http/1.1"],
"certificate_provider": {
"type": "acme",
"domain": ["example.com"],
"email": "admin@example.com"
}
}
}]
}خروجی با اثرانگشت کروم uTLS و پنهانسازی SNI با TCP-fragment:
{
"outbounds": [{
"type": "vless",
"server": "example.com",
"server_port": 443,
"uuid": "...",
"tls": {
"enabled": true,
"server_name": "example.com",
"utls": { "enabled": true, "fingerprint": "chrome" },
"fragment": true,
"fragment_fallback_delay": "500ms"
}
}]
}TLS متقابل — سرور به گواهیهای کلاینت نیاز دارد:
{
"inbounds": [{
"type": "http",
"listen_port": 8443,
"tls": {
"enabled": true,
"certificate_path": "/etc/ssl/cert.pem",
"key_path": "/etc/ssl/key.pem",
"client_authentication": "require-and-verify",
"client_certificate_path": ["/etc/ssl/clients-ca.pem"]
}
}]
}نکات
- پنج مقدار
client_authenticationبهطور مستقیم بهcrypto/tls.ClientAuthTypeگو نگاشت میشوند:no— بدون گواهی کلاینت (پیشفرض).request— درخواست کن، بدون آن بپذیر.require-any— درخواست کن اما اعتبارسنجی نکن.verify-if-given— در صورت ارائه، اعتبارسنجی کن.require-and-verify— mTLS سختگیرانه.
fragmentوrecord_fragmentدو لایهٔ متفاوت هستند:fragmentبستههای TCP حامل دستدهی TLS را میشکند.record_fragmentخود رکوردهای TLS را میشکند (رکوردهایHandshakeدر چندین قطعهٔ کوچکتر ارسال میشوند). اول ازfragmentاستفاده کنید؛ فقط در صورتیrecord_fragmentرا فعال کنید که DPI مبتنی بر SNI همچنان اتصال را طبقهبندی میکند.
kernel_tx/kernel_rxلینوکس KTLS را برای AES-GCM و CHACHA20-POLY1305 فعال میکنند. هسته باید ماژولtlsرا بارگذاری کرده و ماژولهای رمزنگاری مناسب را ثبت کرده باشد.tls.acmeدرونخطی منسوخ است. فیلدهای آن را بدون تغییر به یکcertificate_providerباtype: acmeمنتقل کنید (درونخطی مانند مثال، یا مشترک از طریقcertificate_providers+ tag).certificate_providerوacmeرا نمیتوان با هم به کار برد و REALITY هیچکدام را نمیپذیرد.engine: apple/windowsدستدهی را به پشتهٔ TLS سیستمعامل میسپارند. این موتورها uTLS، REALITY، ECH، قطعهسازی، KTLS، گواهی کلاینت،cipher_suites،curve_preferences،disable_sniوspoofرا هنگام راهاندازی رد میکنند.spoof(همراه باspoof_method) به ازای هر اتصال نیز بهصورت گزینههای کنش قاعدهٔ مسیرtls_spoof/tls_spoof_methodدر دسترس است.- REALITY (زیربلوک
reality) دستدهی TLS را بهطور کامل جایگزین میکند — بنگرید به REALITY — sing-box. - ECH (زیربلوک
ech) به همان دستدهی متصل میشود — بنگرید به ECH — sing-box.
نکات بینهستهای
- Xray-core از
streamSettings.tlsSettingsبهجای یک بلوکtlsتعبیهشده استفاده میکند. نامهای فیلد camelCase هستند (serverName،cipherSuites). اثرانگشت uTLS یک فیلد سطح بالا است، نه یک زیربلوک. بنگرید به TLS — Xray-core. - mihomo هیچ بلوک TLS تجمیعشدهای ندارد — هر آداپتور پراکسی فیلدهای TLS را بهصورت درونخطی حمل میکند (
tls،sni،alpn،skip-cert-verify، …). بنگرید به TLS — mihomo.
منبع: option/tls.go:13-250 · v1.14.2 (af6e64c)
