معرفی WaterWall
WaterWall یک framework ماژولار برای ساخت تونل است. در فایلهای config با فرمت JSON، nodeهای کوچک را به هم وصل میکنید تا یک chain بسازید و ترافیک شبکه را از مسیر دلخواهتان عبور دهید.
یک chain WaterWall میتواند به سادگی هدایت ترافیک یک پورت TCP باشد:
TcpListener -> TcpConnector
یا چند لایهی transport، پروتکل، رمزنگاری، multiplexing و پردازش packet را با هم ترکیب کند:
TcpListener -> MuxClient -> VlessClient -> TlsClient -> TcpConnector
همین طراحی برای کار با packet هم کاربرد دارد؛ از جمله interfaceهای TUN، مسیرهای شبیه WireGuard، پردازش raw packet و bridgeهایی که اتصال را به packet یا packet را به stream تبدیل میکنند.
WaterWall چگونه کار میکند؟
configهای WaterWall از nodeها ساخته میشوند.
هر node وظیفهی مشخصی دارد:
| نقش node | نمونهها |
|---|---|
| دریافت ترافیک ورودی | TcpListener، UdpListener، TcpUdpListener، TunDevice، RawSocket |
| اتصال به یک مقصد بیرونی | TcpConnector، UdpConnector، TcpUdpConnector، UdpStatelessSocket |
| تبدیل یا محافظت از ترافیک | TlsClient / TlsServer، RealityClient / RealityServer، HttpProxyClient / HttpProxyServer، EncryptionClient / EncryptionServer، MuxClient / MuxServer، VlessClient / VlessServer |
| مسیریابی یا بررسی ترافیک | Router، SniffRouter، LoggerTunnel |
| کار با ترافیک packet | TunDevice، RawSocket، WireGuardDevice، PacketSender، PacketReceiver، PingClient، PingServer |
| تبدیل بین مدلهای اتصال، packet و stream | ConnectionToPackets، PacketsToConnection، PacketsToStream، StreamToPackets، PacketSplitStream |
در فایل JSON، با فیلدهای next این nodeها را به هم متصل میکنید. ترافیک در جهت
upstream، یعنی بهسوی node بعدی، از chain عبور میکند و پاسخها در جهت downstream،
یعنی بهسوی node قبلی، از همان chain بازمیگردند.
میتوانید با یک config ساده شروع کنید، از کارکرد درست آن مطمئن شوید و بعد با اضافهکردن nodeها، قابلیتهای موردنیازتان را به آن اضافه کنید.
مدل config
config WaterWall دو سطح دارد:
| فایل | کاربرد |
|---|---|
core.json | راهاندازی WaterWall، تنظیم logها، workerها و DNS، و مشخصکردن فایلهای config که باید load شوند. |
| فایلهای config nodeها | تعریف chainها و تنظیمات هر node. |
نمونهی core.json:
{
"misc": {
"workers": 4,
"ram-profile": "server",
"mtu": 1500,
"try-enabling-bbr": true,
"libs-path": "libs/"
},
"dns": {
"domain-strategy": "prefer-ipv4"
},
"configs": [
"configs/server.json"
]
}
نمونهی config یک chain:
{
"name": "simple-forward",
"nodes": [
{
"name": "entry",
"type": "TcpListener",
"settings": {
"address": "0.0.0.0",
"port": 8080
},
"next": "exit"
},
{
"name": "exit",
"type": "TcpConnector",
"settings": {
"address": "example.com",
"port": 80
}
}
]
}
از کجا شروع کنم؟
راهنمای کاربران را به ترتیب زیر بخوانید:
پس از آن، برای دیدن تنظیمات دقیق هر node به مرجع nodeها مراجعه کنید.
اگر میخواهید خود WaterWall را توسعه دهید، ابتدا با تنظیم chainها آشنا شوید و بعد سراغ راهنمای توسعهدهندگان بروید.
چرا WaterWall؟
معماری ماژولار
در WaterWall مجبور نیستید همیشه از یک ساختار ثابت برای proxy استفاده کنید. میتوانید listenerها، connectorها و nodeهای پروتکل، رمزنگاری، packet و مسیریابی را متناسب با نیاز شبکهی خود کنار هم بچینید.
مبتنی بر config
بیشتر کارها از طریق فایلهای JSON انجام میشود. بدون نوشتن کد C میتوانید chainها را بسازید و تغییر دهید.
پشتیبانی از stream و packet
WaterWall علاوه بر streamهای معمول TCP، با مسیرهای packet هم کار میکند. هرجا توپولوژی نیاز داشته باشد، میتوانید packetها را از طریق یک stream منتقل کنید.
طراحی runtime
هسته با C نوشته شده و برای کار شبکه از I/O بهصورت async، worker threadها، buffer poolها و اجزای قابلاستفادهی مجدد تونل استفاده میکند.
WaterWall چه چیزی نیست؟
WaterWall یک پروفایل VPN آماده یا preset یککلیکی proxy نیست؛ ابزاری است که با آن مسیر شبکهی خود را میسازید. دستتان برای این کار باز است، اما باید بدانید chain شما چگونه کار میکند.
برای نخستین راهاندازی، chain را کوچک نگه دارید، از کارکرد درست آن مطمئن شوید و سپس nodeها را یکییکی اضافه کنید.