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

معرفی 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
کار با ترافیک packetTunDevice، RawSocket، WireGuardDevice، PacketSender، PacketReceiver، PingClient، PingServer
تبدیل بین مدل‌های اتصال، packet و streamConnectionToPackets، 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
}
}
]
}

از کجا شروع کنم؟​

راهنمای کاربران را به ترتیب زیر بخوانید:

  1. نصب
  2. بخش ۱: تنظیمات هسته
  3. بخش ۲: مبانی شبکه
  4. بخش ۳: فایل‌های config و chain‌ها
  5. بخش ۴: انتخاب node‌ها

پس از آن، برای دیدن تنظیمات دقیق هر 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‌ها را یکی‌یکی اضافه کنید.