TlsClient
TlsClient یک wrapper سمت client برای TLS است و روی BoringSSL موجود در سورس WaterWall ساخته شده است. این نود payload خام را از نود قبلی میگیرد، آن را به TLS record برای نود بعدی تبدیل میکند و در مسیر برگشت TLS recordها را decrypt میکند.
جایگاه رایج:
HttpClient -> TlsClient -> TcpConnector
SomeTunnel -> TlsClient -> TcpConnector
این نود TLS واقعی انجام میدهد و برای شبیهتر شدن به رفتار Chrome شکل handshake را تنظیم میکند. با این حال، TLS را خودش روی socket نمیفرستد؛ برای حمل byteها معمولا بعد از آن TcpConnector قرار میگیرد.
نمونه تنظیم
{
"name": "tls-client",
"type": "TlsClient",
"settings": {
"sni": "example.com",
"verify": true,
"ech-sni-trick": "example.net",
"x25519mlkem768": true
},
"next": "tcp-connector"
}
تنظیمات
| گزینه | اجباری | پیشفرض | توضیح |
|---|---|---|---|
sni | بله | - | SNI مقصد. مقدار خالی یا حذفشده reject میشود. |
verify | خیر | true | کنترل verify شدن certificate chain با CA bundle داخلی |
ech-sni-trick | خیر | - | ساخت fake ClientHello و قرار دادن آن داخل GREASE encrypted_client_hello برای هماهنگی با ترفندهای packet-side |
x25519mlkem768 | خیر | true | تبلیغ گروه hybrid X25519MLKEM768 برای رفتار نزدیکتر به Chrome |
فیلدی به نام alpn در بعضی بخشهای سورس دیده میشود، اما create path فعلی مقدار JSON برای ALPN را استفاده نمیکند. ALPN داخلی فعلی روی رفتار Chrome-like متمرکز است.
رفتار handshake
در upstream Init، نود state TLS میسازد، SNI را تنظیم میکند، init را به نود بعدی میفرستد و بلافاصله SSL_connect() را اجرا میکند تا ClientHello و بایتهای handshake تولید شوند. اگر transport بعدی مثل TcpConnector هنوز در حال connect باشد، میتواند این بایتها را طبق رفتار خودش buffer کند.
Est در WaterWall یعنی transport زیرین برقرار شده است، نه اینکه handshake TLS حتما تمام شده باشد. اگر payload زود برسد، TlsClient آن را تا پایان handshake نگه میدارد.
verify certificate
اگر verify روی true بماند:
- peer verification فعال است.
- CA bundle داخلی WaterWall بارگذاری میشود.
- خطای chain میتواند handshake را fail کند.
اگر verify را false کنید:
- handshake TLS همچنان واقعی است.
- BoringSSL peer verification را انجام نمیدهد.
- این حالت برای تست یا مسیرهای کنترلشده است؛ برای اتصال به سرویس عمومی معمولا توصیه نمیشود.
ech-sni-trick
ech-sni-trick برای هماهنگی با ترفندهای IpManipulator طراحی شده است. outer SNI همان settings.sni میماند، اما یک fake ClientHello با hostname تنظیمشده ساخته و در payload GREASE ECH قرار داده میشود تا بایتهایی که TLS hash میکند با بایتهای روی wire هماهنگ باشند.
API داخلی
این نود API زیر را میپذیرد:
generateTlsHello:<sni>
خروجی، buffer خام ClientHello براساس تنظیمات instance است. اگر x25519mlkem768 غیرفعال باشد، ClientHello کوچکتر ولی کمتر شبیه Chrome فعلی میشود.