تکهتکه کردن 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.fragmentClientHello را در محل نام سرور به سگمنتهای TCP میبرد و منتظر تأیید (ACK) هر سگمنت میماند (و اگر نتواند تشخیص دهد، به اندازهٔfragment_fallback_delay).tls.record_fragmentClientHello را، باز هم درون نام سرور، به چند رکورد 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 نادیده گرفته میشود.