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 لینوکس برای ترافیک ورودی.
acme*InboundACMEOptions(unset)InboundACMEOptionsتأمین خودکار گواهی Let's Encrypt. با `certificate`/`key` صریح متقابلاً انحصاری است.
ech*InboundECHOptions(unset)InboundECHOptionsپیکربندی Encrypted Client Hello.
reality*InboundRealityOptions(unset)InboundRealityOptionsپیکربندی سرور REALITY. با TLS عادی متقابلاً انحصاری است — REALITY دست‌دهی TLS را جایگزین می‌کند.

منبع: option/tls.go:12-34 · ثابت‌شده در v1.13.11 (553cfa1)

tls خروجی

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
enabledboolfalsetrue | falseکلید اصلی.
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).
kernel_txboolfalsetrue | falseKTLS لینوکس برای ترافیک خروجی.
kernel_rxboolfalsetrue | falseKTLS لینوکس برای ترافیک ورودی.
ech*OutboundECHOptions(unset)OutboundECHOptionsپیکربندی ECH. وقتی تنظیم نشود، ECH استفاده نمی‌شود (مگر این‌که از طریق رکوردهای HTTPS به‌طور خودکار کشف شود).
utls*OutboundUTLSOptions(unset)OutboundUTLSOptionsتقلید ClientHello کلاینت uTLS.
reality*OutboundRealityOptions(unset)OutboundRealityOptionsپیکربندی کلاینت REALITY. با TLS عادی متقابلاً انحصاری است.

منبع: option/tls.go:97-122 · ثابت‌شده در v1.13.11 (553cfa1)

utls

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
enabledboolfalsetrue | falseروشن کردن uTLS.
fingerprintstringchromechrome | firefox | safari | ios | android | edge | 360 | qq | random | randomizedاثرانگشت مرورگر برای تقلید. کل ClientHello (مجموعهٔ رمز، افزونه‌ها، امضاها) را راهبری می‌کند.

منبع: option/tls.go:229-232 · ثابت‌شده در v1.13.11 (553cfa1)

مثال‌ها

ورودی با تأمین ACME:

json
{
  "inbounds": [{
    "type": "vless",
    "listen_port": 443,
    "users": [{ "uuid": "..." }],
    "tls": {
      "enabled": true,
      "server_name": "example.com",
      "alpn": ["h2", "http/1.1"],
      "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 را بارگذاری کرده و ماژول‌های رمزنگاری مناسب را ثبت کرده باشد.
  • acme با certificate/key صریح متقابلاً انحصاری است. با ACME، sing-box از کلاینت autocert تعبیه‌شده استفاده می‌کند — برای گزینه‌های ارائه‌دهندهٔ ACME به اسناد بالادست بنگرید.
  • 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:12-238 · v1.13.11 (553cfa1)

Core Tutorial اثر Argsment