ترفندهای TLS (tls_tricks)
tls_tricks پیام ClientHello را که خروجی در TLS میفرستد تغییر میدهد: میتواند نام سرور را با ترکیبی
تصادفی از حروف بزرگ و کوچک بفرستد، و یک افزونهٔ padding با اندازهٔ دلخواه اضافه کند. این شیء
tls_tricks درون بلوک tls یک خروجی است.
چرا از آن استفاده کنیم
برخی فیلترها نام سرور (SNI) را دقیقاً تطبیق میدهند، یا ClientHello را از روی اندازهاش میشناسند. تغییر حروف نام، یا بزرگتر کردن ClientHello، میتواند بدون هیچ تغییری در سرور از چنین فیلترهایی عبور کند.
چطور از فیلترینگ عبور میکند
- SNI با حروف درهم: نامهای DNS به بزرگی و کوچکی حروف حساس نیستند؛ پس
ExAmPle.CoMبه همان سایت میرسد و گواهی هم مطابقت دارد. فیلتری که نام را بایتبهبایت با حروف کوچک مقایسه میکند، تطابقی نمیبیند. ترکیب حروف برای هر اتصال تازه است. - Padding: یک افزونهٔ padding به اندازهٔ
padding_sizeبایت درست پیش از افزونهٔ SNI قرار میگیرد. ClientHello را بزرگتر میکند و نام سرور را جلوتر میبرد، اغلب به سگمنت TCP بعدی، جایی که فیلتری که فقط اولین بسته را میخواند نگاه نمیکند.
در برابر فیلترهایی که نام را بدون حساسیت به حروف مقایسه میکنند، جریان را سرهم میکنند یا IP سرور را مسدود کردهاند کمکی نمیکند.
چطور کار میکند
این ترفندها را خود کلاینت TLS انجام میدهد، نه ماسکهای finalmask. ClientHello بخشی از رونوشت (transcript) دستدهی TLS 1.3 است که هر دو طرف هش و بررسی میکنند؛ پس ماسکی که آن را روی سیم ویرایش کند دستدهی را خراب میکند. اینجا کتابخانهٔ TLS خودش ClientHello تغییریافته را میسازد و در رونوشت خودش به کار میبرد.
mixedcase_sniبا کلاینت استاندارد TLS در Go و با uTLS کار میکند.- Padding به uTLS با یک اثرانگشت ثابت (مثل
chromeیاfirefox) نیاز دارد. افزونهٔ padding خود اثرانگشت را با یکی به اندازهٔ انتخابی جایگزین میکند و باقی اثرانگشت را دست نمیزند. با اثرانگشتهایrandomیاrandomizedکانفیگ بارگذاری نمیشود. بدون uTLS، padding با یک هشدار نادیده گرفته میشود. - REALITY پیام ClientHello خودش را میسازد و از
tls_tricksاستفاده نمیکند.
پیکربندی
{
"outbounds": [
{
"type": "vless",
"server": "example.com",
"server_port": 443,
"uuid": "bf000d23-0752-40b4-affe-68f7707a9661",
"tls": {
"enabled": true,
"server_name": "example.com",
"utls": { "enabled": true, "fingerprint": "chrome" },
"tls_tricks": {
"mixedcase_sni": true,
"padding_mode": "random",
"padding_size": "800-1200"
}
}
}
]
}
| فیلد | نوع | پیشفرض | معنا |
|---|---|---|---|
mixedcase_sni |
bool | false |
نام سرور را در هر اتصال با ترکیب تصادفی حروف میفرستد. |
padding_mode |
string | "" |
random افزونهٔ padding را اضافه میکند. مقدار خالی هم وقتی padding_size تنظیم شده باشد آن را اضافه میکند. |
padding_size |
string | — | طول padding به بایت، یک عدد یا بازهٔ "from-to" (طولی تصادفی در هر اتصال)، از ۱ تا ۱۶۰۰۰. با random الزامی است. |
padding_sni |
string | — | پشتیبانی نمیشود؛ با هشدار نادیده گرفته میشود. |
حالتهای padding با نام sni و hello_client و فیلد padding_sni هرگز پیاده نشده بودند. با هشدار
نادیده گرفته میشوند تا کانفیگهایی که آنها را دارند همچنان بارگذاری شوند. padding_size که عدد یا
بازه نباشد، یا خارج از محدوده باشد، خطای پیکربندی است.