Skip to content

TLS — sing-box ​

هر ورودی و خروجی sing-box یک بلوک tls: { ... } را از طریق InboundTLSOptionsContainer / OutboundTLSOptionsContainer تعبیه می‌کند. همان بلوک، زیربلوک‌های REALITY، ECH و uTLS را به‌عنوان گزینه‌های تودرتو حمل می‌کند — این‌ها ویژگی‌های جداگانهٔ سطح بالا نیستند.

tls ورودی ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
enabledboolfalsetrue | falseکلید اصلی. وقتی false باشد، بقیهٔ بلوک نادیده گرفته می‌شود.
server_namestring(inferred from SNI)<hostname>نام سرور مورد انتظار برای تأمین ACME. در صورت تنظیم acme لازم است.
insecureboolfalsetrue | falseرد کردن تأیید TLS. فقط آزمایش.
alpnbadoption.Listable[string][]<ALPN string>فهرست ALPN ارائه‌شده به کلاینت‌ها.
min_versionstring1.21.0 | 1.1 | 1.2 | 1.3حداقل نسخهٔ TLS قابل‌قبول.
max_versionstring1.31.0 | 1.1 | 1.2 | 1.3حداکثر نسخهٔ TLS قابل‌قبول.
cipher_suitesbadoption.Listable[string](library default)<cipher>بازنویسی فهرست مجموعهٔ رمز (فقط TLS 1.2).
curve_preferencesbadoption.Listable[CurvePreference](library default)P256 | P384 | P521 | X25519 | X25519MLKEM768فهرست اولویت منحنی تبادل کلید.
certificatebadoption.Listable[string][]<PEM block>PEM گواهی سرور درون‌خطی. شکل فهرستی از زنجیرهٔ کامل پشتیبانی می‌کند.
certificate_pathstring(unset)<PEM file path>مسیر گواهی سرور.
client_authenticationClientAuthTypenono | request | require-any | verify-if-given | require-and-verifyخط‌مشی احراز هویت کلاینت TLS متقابل. به مقادیر ClientAuthType از crypto/tls گو نگاشت می‌شود.
client_certificatebadoption.Listable[string][]<PEM block>ریشه‌های گواهی کلاینت مورد اعتماد (mTLS).
client_certificate_pathbadoption.Listable[string][]<PEM file path>ریشه‌های کلاینت مورد اعتماد به شکل مسیر.
client_certificate_public_key_sha256badoption.Listable[[]byte][]<SHA-256 bytes>پین‌کردن گواهی کلاینت بر اساس SHA-256 کلید عمومی. هنگام صدور گواهی‌های کلاینت یک‌بارمصرف مفید است.
keybadoption.Listable[string][]<PEM block>کلید خصوصی سرور درون‌خطی.
key_pathstring(unset)<file path>مسیر کلید خصوصی سرور.
kernel_txboolfalsetrue | falseKTLS لینوکس — برون‌سپاری رمزگذاری TLS به هسته برای ترافیک خروجی. به پشتیبانی هسته از TLS و ماژول‌های رمزنگاری صحیح نیاز دارد.
kernel_rxboolfalsetrue | falseKTLS لینوکس برای ترافیک ورودی.
handshake_timeoutbadoption.Duration15s<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 خروجی ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
enabledboolfalsetrue | falseکلید اصلی.
enginestringgogo | 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_sniboolfalsetrue | falseحذف کامل افزونهٔ SNI از ClientHello.
server_namestring(server address)<hostname>SNI ارسال‌شده به سرور، و نامی که در برابر گواهی برگ تأیید می‌شود.
insecureboolfalsetrue | falseرد کردن تأیید گواهی سرور.
alpnbadoption.Listable[string][]<ALPN string>فهرست ALPN ارائه‌شده به سرور.
min_versionstring1.21.0 | 1.1 | 1.2 | 1.3حداقل نسخهٔ TLS قابل‌قبول.
max_versionstring1.31.0 | 1.1 | 1.2 | 1.3حداکثر نسخهٔ TLS قابل‌قبول.
cipher_suitesbadoption.Listable[string](library default)<cipher>بازنویسی فهرست مجموعهٔ رمز.
curve_preferencesbadoption.Listable[CurvePreference](library default)<see inbound>اولویت منحنی تبادل کلید.
certificatebadoption.Listable[string][]<PEM block>گواهی‌های CA مورد اعتماد افزوده‌شده به انبار ریشهٔ سیستم. برای سرورهای خودامضا با insecure: false استفاده شود.
certificate_pathstring(unset)<file path>CAهای مورد اعتماد به شکل مسیر.
certificate_public_key_sha256badoption.Listable[[]byte][]<SHA-256 bytes>پین‌کردن گواهی سرور بر اساس SHA-256 کلید عمومی.
client_certificatebadoption.Listable[string][]<PEM block>گواهی کلاینت (mTLS).
client_certificate_pathstring(unset)<file path>گواهی کلاینت به شکل مسیر.
client_keybadoption.Listable[string][]<PEM block>کلید خصوصی کلاینت.
client_key_pathstring(unset)<file path>کلید خصوصی کلاینت به شکل مسیر.
fragmentboolfalsetrue | falseتکه‌تکه‌سازی دست‌دهی در سطح TCP. ClientHello را در میان بسته‌ها می‌شکند تا از DPI مبتنی بر SNI فرار کند.
fragment_fallback_delaybadoption.Duration500ms<duration>اگر دست‌دهی تکه‌تکه‌شده تا این مهلت کامل نشود، بدون تکه‌تکه‌سازی دوباره تلاش می‌کند.
record_fragmentboolfalsetrue | falseتکه‌تکه‌سازی لایهٔ رکورد TLS (تهاجمی‌تر از fragment — درون جریان رکورد TLS تقسیم می‌کند، نه فقط بسته‌های TCP).
spoofstring(unset)<hostname>پیش از ClientHello واقعی، یک نسخهٔ جعلی از آن با این SNI فرستاده می‌شود تا تجهیزات میانی فیلترکنندهٔ SNI که نام‌های میزبان خاصی را مجاز می‌دانند فریب بخورند. باید با server_name متفاوت باشد. فقط Linux، macOS و Windows؛ به دسترسی سوکت خام نیاز دارد (CAP_NET_RAW + CAP_NET_ADMIN در Linux، root در macOS، Administrator در Windows؛ Windows ARM64 پشتیبانی نمی‌شود).
spoof_methodstringwrong-sequencewrong-sequence | wrong-checksum | wrong-ack | wrong-md5 | wrong-timestampروشی که سرور واقعی قطعهٔ جعلی را دور بریزد: شمارهٔ ترتیب خارج از پنجره (پیش‌فرض)، checksum نادرست، ACK خارج از پنجره، گزینهٔ TCP-MD5، یا timestamp عقب‌افتاده (wrong-timestamp در macOS پشتیبانی نمی‌شود).
kernel_txboolfalsetrue | falseKTLS لینوکس برای ترافیک خروجی.
kernel_rxboolfalsetrue | falseKTLS لینوکس برای ترافیک ورودی.
handshake_timeoutbadoption.Duration15s<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 ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
enabledboolfalsetrue | falseروشن کردن uTLS.
fingerprintstringchromechrome | 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:

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
domainbadoption.Listable[string](required)<domain> | …دامنه‌هایی که برایشان گواهی درخواست می‌شود. الزامی.
data_directorystring(certmagic default)<dir path>محل نگهداری وضعیت و گواهی‌های ACME. پیش‌فرض: $XDG_DATA_HOME/certmagic یا $HOME/.local/share/certmagic.
emailstring(unset)<e-mail>ایمیل حساب برای ساخت یا انتخاب حساب ACME.
providerstringletsencryptletsencrypt | zerossl | <https:// directory URL>CA مربوط به ACME. با zerossl، اگر email تنظیم و external_account خالی باشد، اعتبارنامهٔ EAB خودکار درخواست می‌شود.
account_keystring(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_typeACMEKeyType(certmagic default)ed25519 | p256 | p384 | rsa2048 | rsa4096نوع کلید برای گواهی‌های تازه صادرشده.
profilestring(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 درون‌خطی:

json
{
  "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:

json
{
  "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 متقابل — سرور به گواهی‌های کلاینت نیاز دارد:

json
{
  "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)

Core Tutorial اثر Argsment