پرش به محتویات

تکه‌تکه کردن TLS (tls_fragment)

همهٔ قابلیت‌های هیدیفای

tls_fragment پیام ClientHello را که خروجی در TLS می‌فرستد به تکه‌های کوچک بسیار می‌برد و می‌تواند میان آن‌ها مکث کند. این شیء tls_fragment در فیلدهای اتصال یک خروجی است (کنار detour، نه داخل tls). هیدیفای آن را برای کانفیگ‌های موجود نگه داشته است؛ در درون، به‌عنوان اولین ماسک fragment در finalmask اعمال می‌شود.

چرا از آن استفاده کنیم

برخی فیلترها نام سرور (SNI) را از ClientHello می‌خوانند و اگر نام مسدودی ببینند اتصال را قطع می‌کنند. تکه‌تکه کردن ClientHello می‌تواند بدون هیچ تغییری در سرور اتصال را از چنین فیلتری عبور دهد. وقتی یک نود TLS یا REALITY فقط گاهی وصل می‌شود، یا درست پس از ClientHello قطع می‌شود، از آن استفاده کنید.

چطور از فیلترینگ عبور می‌کند

ClientHello به رکوردهای TLS چندبایتی بریده می‌شود و هر کدام جدا نوشته می‌شود؛ پس SNI در رکوردها و سگمنت‌های TCP زیادی پخش می‌شود. فیلتری که بسته‌ها را تک‌تک نگاه می‌کند، یا رکوردهای TLS را سرهم نمی‌کند، نمی‌تواند نام را بخواند. پشتهٔ TLS سرور تکه‌ها را دوباره کنار هم می‌گذارد، پس سرور تنظیمی لازم ندارد.

در برابر فیلترهایی که جریان را سرهم می‌کنند یا IP سرور را مسدود کرده‌اند کمکی نمی‌کند. تکه‌های کوچک و مکث‌های طولانی دست‌دهی را کندتر می‌کنند.

چطور کار می‌کند

  • method با مقدار tlsHello (پیش‌فرض) فقط ClientHello را تکه می‌کند. range نوشتن‌هایی را که در range آمده‌اند (مثلاً سه نوشتن اول) به تکه‌های size بایتی می‌برد، محتوایشان هر چه باشد.
  • هر تکه size بایت است (اندازه‌ای تصادفی از بازه)، با sleep میلی‌ثانیه مکث میان تکه‌ها.
  • اتصال‌های TCP خروجی را زیر لایهٔ TLS می‌پوشاند، پس برای هر پروتکلی که روی آن خروجی از TLS استفاده می‌کند، از جمله REALITY، کار می‌کند.
  • جلوی ماسک‌های finalmask.tcp خود خروجی قرار می‌گیرد، پس بایت‌هایی را که پشتهٔ TLS می‌نویسد پیش از هر ماسک دیگری می‌گیرد.

مقایسه با tls.fragment و tls.record_fragment

sing-box اصلی دو کلید در بلوک tls دارد:

  • tls.fragment ClientHello را در محل نام سرور به سگمنت‌های TCP می‌برد و منتظر تأیید (ACK) هر سگمنت می‌ماند (و اگر نتواند تشخیص دهد، به اندازهٔ fragment_fallback_delay).
  • tls.record_fragment ClientHello را، باز هم درون نام سرور، به چند رکورد TLS می‌برد.

این دو اندازه یا تأخیر نمی‌گیرند. در این فورک هر دو با REALITY هم کار می‌کنند (نسخهٔ اصلی روی نودهای REALITY آن‌ها را نادیده می‌گرفت). tls_fragment گزینهٔ خود هیدیفای است: اندازهٔ تکه و مکث را تعیین می‌کند و می‌تواند نوشتن‌هایی جز ClientHello را هم تکه کند. یکی از آن‌ها را به کار ببرید، نه چندتا را با هم.

پیکربندی

{
  "outbounds": [
    {
      "type": "trojan",
      "server": "example.com",
      "server_port": 443,
      "password": "secret",
      "tls": { "enabled": true, "server_name": "example.com" },
      "tls_fragment": {
        "enabled": true,
        "size": "10-30",
        "sleep": "2-8"
      }
    }
  ]
}
فیلد نوع پیش‌فرض معنا
enabled bool false تکه‌تکه کردن را روشن می‌کند.
size string 1-10 اندازهٔ تکه به بایت، یک عدد یا بازهٔ "from-to".
sleep string 0 مکث میان تکه‌ها به میلی‌ثانیه، یک عدد یا بازه.
method string tlsHello tlsHello ClientHello را تکه می‌کند؛ range نوشتن‌های range را.
range string — با روش range، این‌که کدام نوشتن‌ها تکه شوند، مثل "1-3". برای آن روش الزامی است.

خطاها: اگر tcp_fast_open روی همان خروجی روشن باشد، کانفیگ بارگذاری نمی‌شود (اولین داده همراه دست‌دهی TCP فرستاده می‌شود، پیش از آن‌که بتوان تکه‌اش کرد). method ناشناخته، یا روش range بدون range، هم خطای پیکربندی است.

قالب‌های قدیمی tls_fragment را درون بلوک tls می‌گذارند. هنگام ساخت خروجی، tls_fragment روشن در آن‌جا به فیلدهای اتصال خروجی منتقل و اعمال می‌شود، مگر این‌که خروجی خودش tls_fragment روشن داشته باشد. در آن صورت، مورد درون بلوک tls نادیده گرفته می‌شود.

همچنین ببینید


اخرین بروزرسانی: 26 فوریهٔ 2026

نظرات