پرش به مطلب اصلی

بخش ۴: انتخاب Nodeها

Nodeهای WaterWall اجزای کوچکی هستند که با قرارگرفتن در یک زنجیره کاربرد پیدا می‌کنند. پیش از نوشتن پیکربندی، نوع ترافیک و اینکه کدام سمت مالک Socket یا Interface است را مشخص کنید.

رایج‌ترین شکل زنجیره چنین است:

entry adapter -> middle transforms -> exit adapter

برای TCP:

TcpListener -> MuxClient -> VlessClient -> TlsClient -> TcpConnector

برای Packetها:

TunDevice -> WireGuardDevice -> UdpStatelessSocket

Adapterهای ورودی و خروجی

Adapterها WaterWall را به دنیای بیرون متصل می‌کنند.

Adapterهای ورودی رایج:

Nodeکاربرد
TcpListenerپذیرفتن اتصال‌های TCP ورودی.
UdpListenerپذیرفتن ترافیک UDP همراه با State جداگانه برای هر Peer.
TcpUdpListenerListener ترکیبی TCP/UDP.
TunDeviceخواندن و نوشتن IP Packetها از طریق Interface نوع TUN.
RawSocketکار با Raw IP Packetها.
UdpStatelessSocketBindکردن یک Socket نوع UDP بدون State اتصال به‌ازای هر Peer.

Adapterهای خروجی رایج:

Nodeکاربرد
TcpConnectorبازکردن اتصال‌های TCP خروجی.
UdpConnectorفرستادن ترافیک UDP به یک یا چند مقصد.
TcpUdpConnectorConnector ترکیبی TCP/UDP.
UdpStatelessSocketفرستادن Datagramهای UDP با استفاده از Routing Context.

Listenerها معمولاً ابتدای زنجیره‌ی Stream و Connectorها معمولاً انتهای آن قرار می‌گیرند. Adapterهای Packet بسته به توپولوژی می‌توانند در هر یک از دو سمت باشند.

Nodeهای Transform

Nodeهای Transform در میانه‌ی زنجیره قرار می‌گیرند و شیوه‌ی حمل داده را تغییر می‌دهند.

Transformهای جفت رایج:

سمت Clientسمت Serverکاربرد
MuxClientMuxServerMultiplexکردن چند Line منطقی روی تعداد کمتری اتصال انتقال.
EncryptionClientEncryptionServerرمزنگاری AEAD روی Payloadهای Frameشده.
TlsClientTlsServerاستفاده از TLS واقعی روی Wire.
HttpClientHttpServerحمل Payload از طریق HTTP/1.1، HTTP/2 یا جریان‌های WebSocket-style.
VlessClientVlessServerFraming سمت Client و Server پروتکل VLESS.
TrojanClientTrojanServerFraming سمت Client و Server به سبک Trojan.
RealityClientRealityServerرفتار سمت Client و Server به سبک Reality.
Socks5ClientSocks5Serverاتصال به SOCKS5 یا ارائه‌ی سرویس SOCKS5.
ReverseClientReverseServerساخت تونل Reverse، وقتی سمت Server امکان پذیرفتن اتصال ورودی مستقیم را ندارد.
HalfDuplexClientHalfDuplexServerجداکردن Upload و Download در دو جهت مستقل.
KeepAliveClientKeepAliveServerافزودن Heartbeat برای تشخیص مسیرهای قطع‌شده.

Nodeهای جفت باید روبه‌روی همتای درست خود قرار بگیرند. برای مثال، در هر دو سمت یک تونل رمزنگاری‌شده از EncryptionClient استفاده نکنید.

Nodeهای کمکی

Nodeهای کمکی برای اعمال Policy، آزمایش و Debug به کار می‌روند:

Nodeکاربرد
Routerفرستادن اتصال به مقصدهای متفاوت بر اساس مبدأ، مقصد، پروتکل، دامنه یا Credentialها.
SniffRouterمسیریابی بر اساس Metadata به‌دست‌آمده از Sniffکردن ترافیک.
Bridgeاتصال دو بخش جداگانه‌ی زنجیره که در یک فایل پیکربندی تعریف شده‌اند.
SpeedLimitمحدودکردن Throughput.
BlackHoleدورریختن ترافیک یا پایان‌دادن عمدی به یک مسیر.
LoggerTunnelثبت Payload یا رویدادهای ترافیک برای Debug.
Disturberشبیه‌سازی Packet Loss، خرابی داده یا تأخیر برای آزمایش.
TesterClient / TesterServerتولید و اعتبارسنجی ترافیک آزمایشی.
SpeedTestClient / SpeedTestServerاجرای آزمایش‌های متمرکز بر Throughput.

قدرت این Nodeها در آن است که بدون تغییر Adapterهای ورودی و خروجی، رفتار زنجیره را عوض می‌کنند.

شاخه‌های Router

Router بر اساس Ruleها یک شاخه را انتخاب می‌کند. این Node منتظر نخستین Payload در جهت upstream می‌ماند، Ruleها را به‌ترتیب بررسی می‌کند و اتصال را به مقصد نخستین Rule منطبق می‌فرستد. اگر هیچ Ruleای منطبق نباشد، مقدار next سطح اول به‌عنوان مسیر پیش‌فرض استفاده می‌شود.

نمای مفهومی:

TcpListener -> Router
|-- rule: TLS domain match -> premium-path
|-- rule: SSH port match -> ssh-path
`-- default next -> direct-path

نمونه:

{
"name": "route-by-domain-or-port",
"type": "Router",
"settings": {
"sniffing": [
"http1",
"tls"
],
"rules": [
{
"destination-domain": [
"*.example.org"
],
"target": "premium-path"
},
{
"destination-port": 22,
"target": "ssh-path"
}
]
},
"next": "direct-path"
}

هر target نام Node دیگری در همان فایل پیکربندی است. یک Rule می‌تواند چند شرط را با هم ترکیب کند؛ شرط‌های داخل یک Rule با عملگر منطقی AND سنجیده می‌شوند و مقادیر داخل هر شرط معمولاً گزینه‌های جایگزین یکدیگرند.

وقتی یک Listener باید ترافیک را به چند زنجیره‌ی شاخه‌ای بفرستد، از Router استفاده کنید.

Nodeهای Packet

Nodeهای Packet به‌جای Streamهای عادی TCP با IP Packetها یا Datagramهای شبیه Packet کار می‌کنند.

Nodeهای Packet رایج:

Nodeکاربرد
TunDeviceساخت یا استفاده از Interface نوع TUN برای IP Packetها.
RawSocketفرستادن و دریافت Raw IP Packetها.
WireGuardDeviceپیاده‌سازی رمزنگاری WireGuard و مدیریت Peer درون زنجیره‌ی WaterWall.
IpOverriderOverrideکردن آدرس مبدأ یا مقصد Packet.
IpManipulatorاعمال تغییرات سطح Packet برای مسیریابی ویژه یا سناریوهای آزمایشی.
PingClient / PingServerحمل Payload مربوط به Packet درون پوششی شبیه ICMP.
PacketSender / PacketReceiverابزارهای کمکی برای آزمایش و Bootstrap ترافیک Packet.

زنجیره‌ی Packet با زنجیره‌ی اتصال TCP یکسان نیست. برخی مسیرهای Packet از Packet Line سطح Worker استفاده می‌کنند که در طول پردازش تعداد زیادی Packet زنده می‌ماند. پیکربندی Packet را با این فرض نسازید که هر Packet مانند یک اتصال TCP معمولی Line را ایجاد و نابود می‌کند.

پل‌های Packet و Stream

در برخی استقرارها باید ترافیک Packet از طریق یک انتقال Stream مانند TCP یا TLS عبور کند. Nodeهای مرزی این تبدیل را انجام می‌دهند.

Nodeجهت تبدیل
PacketsToStreamاز سمت Packet به سمت Stream.
StreamToPacketsاز سمت Stream به سمت Packet.
PacketsToConnectionاز ترافیک Packet/lwIP به Lineهای اتصال معمول WaterWall.
PacketSplitStreamتقسیم یک سمت Packet به Lineهای Stream پایدار و جداگانه برای Upload و Download.

نسخه‌ی فعلی PacketsToStream و StreamToPackets فقط IPv4 را پشتیبانی می‌کند. این دو Node Header جداگانه‌ای برای طول اضافه نمی‌کنند؛ Raw IPv4 Packetها را داخل Stream می‌نویسند و مرز هر Packet را از فیلد Total Length در IPv4 به دست می‌آورند. این دو Node، IPv6 و Payloadهای غیر IPv4 را دور می‌ریزند.

شکل پایه‌ی انتقال Packet روی Stream میان دو Server:

server A: TunDevice -> PacketsToStream -> TlsClient -> TcpConnector
server B: TcpListener -> TlsServer -> StreamToPackets -> TunDevice

در نمای کلی بالا استفاده از Nodeهای TLS اختیاری است، اما در استقرار واقعی معمولاً اطراف مسیر Stream، رمزنگاری، Authentication یا Camouflage اضافه می‌شود.

WireGuard درون WaterWall

WireGuardDevice رمزنگاری WireGuard و State مربوط به Peer را مدیریت می‌کند، اما خودش Socket نوع UDP را باز نمی‌کند و Interface نوع WireGuard در سیستم‌عامل نمی‌سازد.

توپولوژی معمول چنین است:

TunDevice -> WireGuardDevice -> UdpStatelessSocket

تقسیم وظایف:

Nodeمسئولیت
TunDeviceInterface مربوط به IP Packetهای داخلی.
WireGuardDeviceHandshake، رمزنگاری، State مربوط به Peer، مسیریابی Allowed IP و Keepalive در WireGuard.
UdpStatelessSocketSocket بیرونی UDP برای فرستادن و دریافت Packetهای WireGuard.

این تفکیک مهم است: آدرس و پورت Bind مربوط به UDP را روی UdpStatelessSocket و Keyها و Peerهای WireGuard را روی WireGuardDevice تنظیم کنید.

راهنمای عملی انتخاب Node

برای یک TCP Forward ساده:

TcpListener -> TcpConnector

برای تونل رمزنگاری‌شده‌ی TCP میان دو Server:

client side: TcpListener -> EncryptionClient -> TcpConnector
server side: TcpListener -> EncryptionServer -> TcpConnector

برای Multiplexکردن تعداد زیادی Stream روی یک مسیر انتقال:

client side: TcpListener -> MuxClient -> TcpConnector
server side: TcpListener -> MuxServer -> TcpConnector

برای VLESS روی TLS:

TcpListener -> MuxClient -> VlessClient -> TlsClient -> TcpConnector

برای انتقال ترافیک Packet روی یک Stream:

packet side A: TunDevice -> PacketsToStream -> TcpConnector
packet side B: TcpListener -> StreamToPackets -> TunDevice

برای WireGuard:

TunDevice -> WireGuardDevice -> UdpStatelessSocket

پس از انتخاب شکل کلی زنجیره، صفحه‌ی مرجع تک‌تک Nodeهای به‌کاررفته را بخوانید. Object مربوط به settings در هر Node متفاوت است و نسخه‌های جدید WaterWall اغلب پیش از آنکه آموزش‌های قدیمی به‌روزرسانی شوند، فیلدهای تازه‌ای اضافه می‌کنند.