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

بخش ۴: انتخاب node‌ها

هر node در WaterWall یک کار مشخص انجام می‌دهد و با کنار هم گذاشتن آن‌ها یک chain می‌سازید. پیش از نوشتن config، مشخص کنید با چه نوع ترافیکی کار می‌کنید و کدام سمت مالک socket یا interface است.

جدول‌های زیر راهنمای انتخاب‌اند، نه فهرست کامل. اگر به node تخصصی نیاز دارید، همه‌ی node‌ها را ببینید و پیش از قراردادن آن در chain، صفحه‌ی مرجع همان node را بخوانید.

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

entry adapter -> middle transforms -> exit adapter

برای TCP:

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

برای packet‌ها:

UdpStatelessSocket -> WireGuardDevice -> TunDevice

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‌ها معمولاً ابتدای chain stream و connector‌ها معمولاً انتهای آن قرار می‌گیرند. adapter‌های packet بسته به توپولوژی می‌توانند در هر یک از دو سمت باشند.

node‌های transform​

node‌های transform در میانه‌ی chain قرار می‌گیرند و شیوه‌ی حمل داده را تغییر می‌دهند.

transform‌های جفت و node‌های انتقال رایج:

سمت clientسمت serverکاربرد
MuxClientMuxServermultiplex کردن چند line منطقی روی تعداد کمتری اتصال transport.
EncryptionClientEncryptionServerرمزنگاری AEAD روی payload‌های frame شده.
ObfuscatorClientObfuscatorServerاعمال obfuscation سبک XOR همسان؛ این کار رمزنگاری نیست.
TlsClientTlsServerاستفاده از TLS واقعی روی wire.
HttpClientHttpServerحمل payload از طریق HTTP/1.1، HTTP/2 یا جریان‌های مبتنی بر WebSocket.
VlessClientVlessServerframing سمت client و server پروتکل VLESS.
TrojanClientTrojanServerframing سمت client و server به سبک Trojan.
RealityClientRealityServerرفتار سمت client و server به سبک Reality.
Socks5ClientSocks5Serverاتصال به SOCKS5 یا ارائه‌ی سرویس SOCKS5.
HeaderClientHeaderServerحمل metadata پورت WaterWall یا اطلاعات قابل‌اعتماد IPv4 PROXY protocol.
Bgp4ClientBgp4Serverاستفاده از framing stream شبیه BGP؛ این node‌ها مسیریابی BGP را پیاده‌سازی نمی‌کنند.
ReverseClientReverseServerساخت تونل reverse، وقتی سمت server امکان پذیرفتن اتصال ورودی مستقیم را ندارد.
ConnectionFisherClientConnectionFisherServerامتحان‌کردن هم‌زمان چند مسیر و نگه‌داشتن اولین مسیری که peer آن را تأیید می‌کند.
HalfDuplexClientHalfDuplexServerجداکردن upload و download در دو جهت مستقل.
KeepAliveClientKeepAliveServerافزودن heartbeat برای تشخیص مسیرهای قطع‌شده.
TcpOverUdpClientTcpOverUdpServerحمل یک stream روی مسیر UDP حفظ‌کننده‌ی مرز packet با KCP.
UdpOverTcpClientUdpOverTcpServerحفظ مرز datagram‌های UDP-style روی یک انتقال stream.

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

node‌های کمکی​

node‌های کمکی برای اعمال policy، تست و debug به کار می‌روند:

nodeکاربرد
Routerفرستادن اتصال به مقصدهای متفاوت بر اساس مبدأ، مقصد، پروتکل، domain یا credential‌ها.
SniffRouterمسیریابی بر اساس metadata به‌دست‌آمده از sniff کردن ترافیک.
Bridgeاتصال دو بخش جداگانه‌ی chain که در یک فایل config تعریف شده‌اند.
AuthenticationClient / AuthenticationServerهمگام‌سازی و ارائه‌ی داده‌ی کاربران احرازشده برای node‌های مشارکت‌کننده؛ این مسیر کنترل است، نه forward کردن عادی داده.
SoftIpLimiterمحدودکردن source IP‌هایی که می‌توانند از هویت اولیه‌ی یکسان VLESS یا Trojan استفاده کنند.
SpeedLimitمحدودکردن throughput.
BlackHoleدورریختن ترافیک یا پایان‌دادن عمدی به یک مسیر.
LoggerTunnelثبت payload یا رویدادهای ترافیک برای debug.
Disturberشبیه‌سازی packet loss، خرابی داده یا تأخیر برای تست.
JunkDatagramSenderفرستادن noise تولیدشده پیش از ترافیک واقعی روی یک مسیر حفظ‌کننده‌ی datagram.
TesterClient / TesterServerتولید و اعتبارسنجی ترافیک تست.
SpeedTestClient / SpeedTestServerاجرای تست‌های متمرکز بر throughput.

با این node‌ها می‌توانید رفتار chain را تغییر دهید، بدون اینکه 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 دیگری در همان فایل config است. یک rule می‌تواند چند شرط را با هم ترکیب کند؛ شرط‌های داخل یک rule با عملگر منطقی AND سنجیده می‌شوند و مقادیر داخل هر شرط معمولاً گزینه‌های جایگزین یکدیگرند.

وقتی یک listener باید ترافیک را به چند chain شاخه‌ای بفرستد، از 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 درون chain WaterWall.
IpOverrideroverride کردن آدرس مبدأ یا مقصد packet.
IpManipulatorاعمال تغییرات سطح packet برای مسیریابی ویژه یا سناریوهای تست.
PingClient / PingServerحمل IPv4 در Echo request‌های جفت‌شده و مصرف Echo reply دقیق به‌عنوان تأیید.
PacketSender / PacketReceiverابزارهای کمکی برای تست و bootstrap ترافیک packet.

chain packet با chain اتصال TCP یکسان نیست. برخی مسیرهای packet از packet line سطح worker استفاده می‌کنند که در طول پردازش تعداد زیادی packet زنده می‌ماند. config packet را با این فرض نسازید که هر packet مانند یک اتصال TCP معمولی line را ایجاد و نابود می‌کند.

bridge‌های packet، stream و اتصال​

گاهی لازم است ترافیک را بین مدل‌های packet، stream و اتصال تبدیل کنید. node‌های bridge این کار را انجام می‌دهند.

nodeمرز یا نقش
ConnectionToPacketsاز اتصال دارای destination context به packet‌های خام IPv4 TCP/UDP.
PacketsToConnectionاز packet‌های خام IPv4 به line‌های اتصال عادی TCP/UDP در WaterWall.
PacketsToStreamاز سمت packet به سمت stream.
StreamToPacketsاز سمت stream به سمت packet.
PacketSplitStreamnode کمکی ویژه‌ی packet line برای شاخه‌های نام‌دار upload و بازگشت.

PacketsToStream و StreamToPackets یک جفت framing هستند. این دو در حال حاضر فقط IPv4 را پشتیبانی می‌کنند، header سفارشی طول اضافه نمی‌کنند، packet‌های خام IPv4 را در stream می‌نویسند و مرز packet‌ها را از فیلد total length در IPv4 بازیابی می‌کنند.

ConnectionToPackets و PacketsToConnection یک flow bridge می‌سازند. این دو با stack داخلی lwIP در همان process، line‌های عادی TCP/UDP WaterWall را به raw packet‌های IPv4 و برعکس تبدیل می‌کنند. ConnectionToPackets به یک source-ipv4 مجازی تنظیم‌شده نیاز دارد، فقط IPv4 را پشتیبانی می‌کند و برای آن آدرس به مسیر بازگشت نیاز دارد. PacketSplitStream تخصصی‌تر است: خودش packet‌ها را frame یا تبدیل نمی‌کند، بلکه یک چیدمان packet line را به شاخه‌های نام‌دار upload و بازگشت تقسیم می‌کند.

شکل پایه‌ی انتقال 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 در سیستم‌عامل نمی‌سازد.

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

UdpStatelessSocket -> WireGuardDevice -> TunDevice

UdpStatelessSocket فقط در ابتدای chain مجاز است. آن را پیش از WireGuardDevice قرار دهید؛ این socket نمی‌تواند پس از WireGuard باشد. solver لایه همچنان مشخص می‌کند کدام سمت مجاور packet‌های L3 و کدام سمت انتقال L4 را حمل می‌کند.

تقسیم وظایف:

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

برای یک مسیر IPv4 و بدون نیاز به root، از SOCKS CONNECT به packet:

شاخه‌ی application محلی: TcpListener -> Socks5Server -> ConnectionToPackets -> Bridge A
شاخه‌ی UDP محلی: UdpStatelessSocket -> WireGuardDevice -> Bridge B
سمت راه‌دور: UdpStatelessSocket -> WireGuardDevice -> PacketsToConnection -> TcpUdpConnector

Bridge A و Bridge B را به هم pair کنید تا شاخه‌ی connection-to-packet به سمت packet وایرگارد وصل شود. هر UdpStatelessSocket در ابتدای chain خودش می‌ماند.

Socks5Server مقصد درخواستی را برای ConnectionToPackets فراهم می‌کند. source-ipv4 آن را به‌صورت یک آدرس مجازی یکتا تنظیم کنید که peer راه‌دور آن را می‌پذیرد و مسیر بازگشت به آن را دارد. این یک flow bridge در userspace است و جای capture کردن ترافیک دلخواه host را نمی‌گیرد؛ هر زمان به interface packet در سطح سیستم‌عامل نیاز دارید، از TunDevice استفاده کنید.

برای WireGuard:

UdpStatelessSocket -> WireGuardDevice -> TunDevice

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