بخش ۴: انتخاب 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. |
TcpUdpListener | Listener ترکیبی TCP/UDP. |
TunDevice | خواندن و نوشتن IP Packetها از طریق Interface نوع TUN. |
RawSocket | کار با Raw IP Packetها. |
UdpStatelessSocket | Bindکردن یک Socket نوع UDP بدون State اتصال بهازای هر Peer. |
Adapterهای خروجی رایج:
| Node | کاربرد |
|---|---|
TcpConnector | بازکردن اتصالهای TCP خروجی. |
UdpConnector | فرستادن ترافیک UDP به یک یا چند مقصد. |
TcpUdpConnector | Connector ترکیبی TCP/UDP. |
UdpStatelessSocket | فرستادن Datagramهای UDP با استفاده از Routing Context. |
Listenerها معمولاً ابتدای زنجیرهی Stream و Connectorها معمولاً انتهای آن قرار میگیرند. Adapterهای Packet بسته به توپولوژی میتوانند در هر یک از دو سمت باشند.
Nodeهای Transform
Nodeهای Transform در میانهی زنجیره قرار میگیرند و شیوهی حمل داده را تغییر میدهند.
Transformهای جفت رایج:
| سمت Client | سمت Server | کاربرد |
|---|---|---|
MuxClient | MuxServer | Multiplexکردن چند Line منطقی روی تعداد کمتری اتصال انتقال. |
EncryptionClient | EncryptionServer | رمزنگاری AEAD روی Payloadهای Frameشده. |
TlsClient | TlsServer | استفاده از TLS واقعی روی Wire. |
HttpClient | HttpServer | حمل Payload از طریق HTTP/1.1، HTTP/2 یا جریانهای WebSocket-style. |
VlessClient | VlessServer | Framing سمت Client و Server پروتکل VLESS. |
TrojanClient | TrojanServer | Framing سمت Client و Server به سبک Trojan. |
RealityClient | RealityServer | رفتار سمت Client و Server به سبک Reality. |
Socks5Client | Socks5Server | اتصال به SOCKS5 یا ارائهی سرویس SOCKS5. |
ReverseClient | ReverseServer | ساخت تونل Reverse، وقتی سمت Server امکان پذیرفتن اتصال ورودی مستقیم را ندارد. |
HalfDuplexClient | HalfDuplexServer | جداکردن Upload و Download در دو جهت مستقل. |
KeepAliveClient | KeepAliveServer | افزودن 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. |
IpOverrider | Overrideکردن آدرس مبدأ یا مقصد 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 | مسئولیت |
|---|---|
TunDevice | Interface مربوط به IP Packetهای داخلی. |
WireGuardDevice | Handshake، رمزنگاری، State مربوط به Peer، مسیریابی Allowed IP و Keepalive در WireGuard. |
UdpStatelessSocket | Socket بیرونی 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 اغلب
پیش از آنکه آموزشهای قدیمی بهروزرسانی شوند، فیلدهای تازهای اضافه میکنند.