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

نصب

WaterWall به‌صورت یک فایل اجرایی مستقل منتشر می‌شود و به سرویس package manager، database یا runtime جداگانه‌ای نیاز ندارد. کافی است نسخه‌ی مناسب سیستم‌عامل خود را دانلود کنید، فایل core.json را کنار فایل اجرایی بگذارید و برنامه را از همان دایرکتوری اجرا کنید.

بیشتر کاربران WaterWall را روی یک VPS لینوکسی اجرا می‌کنند. می‌توانید از Windows با SSH یا VS Code Remote SSH فایل‌ها را مدیریت کنید، اما دستورهای زیر را باید روی خود سرور اجرا کنید.

دانلود​

آخرین نسخه را از صفحه‌ی release‌های WaterWall دانلود کنید. فایلی را انتخاب کنید که با سیستم‌عامل و معماری CPU شما سازگار باشد.

build‌های Linux x64، از جمله نسخه‌های old-CPU و AVX512، با همان نام‌های قبلی به‌صورت فایل اجرایی فشرده منتشر می‌شوند. فایل را مثل همیشه اجرا کنید؛ برنامه هنگام شروع در حافظه از حالت فشرده خارج می‌شود و فایل اجرایی موقتی روی دیسک نمی‌سازد. این build‌ها به Linux 3.19 یا جدیدتر، memfd_create، قابلیت file sealing، execveat، مجوز اجرای فایل‌های ناشناسِ مبتنی بر حافظه و دسترسی خواندن به /proc/self/exe نیاز دارند. نیازمندی‌های CPU و کتابخانه‌های سیستمیِ build انتخاب‌شده همچنان برقرار است. راه‌اندازی با Set-ID یا file capabilities در loader فشرده پشتیبانی نمی‌شود.

دانلودهای Windows همچنان فایل اجرایی معمولی هستند. در build اختیاری از سورس با WW_PACK_RUNTIME=ON، برنامه در یک مسیر موقت خصوصی استخراج می‌شود و در process جدا اجرا می‌شود؛ launcher منتظر پایان آن می‌ماند و فایل موقت را پاک می‌کند. پیش از استفاده در release، این حالت باید روی Windows واقعی تست و تأیید شود. DLL‌های همراه باید کنار launcher بمانند. قوانین firewall و سرویس‌هایی که مسیر یا PID ثابت می‌خواهند باید process موقت را در نظر بگیرند؛ قانون مربوط به مسیر launcher برای آن کافی نیست. پایان اجباری ممکن است فایل موقت باقی بگذارد. فشرده‌سازی Windows ARM پشتیبانی نمی‌شود.

یک نصب دستی معمول در Linux به این شکل است:

mkdir -p ~/waterwall
cd ~/waterwall

# Put the downloaded archive or binary here, then extract it if needed.
chmod +x ./WaterWall

اگر فایل release فشرده است، ابتدا آن را با ابزار متناسب، مانند tar، unzip یا 7z، از حالت فشرده خارج کنید.

ساختار دایرکتوری​

یک راه‌اندازی کوچک معمولاً چنین ساختاری دارد:

waterwall/
WaterWall
core.json
configs/
local-test.json
logs/

WaterWall به‌طور پیش‌فرض فایل ./core.json را از working directory خود می‌خواند. مسیرهای داخل core.json، از جمله فایل‌های آرایه‌ی configs، بدون تغییر به loader داده می‌شوند؛ پس دقت کنید برنامه را از کدام دایرکتوری اجرا می‌کنید.

انتخاب فایل core یا خواندن از stdin​

می‌توانید از شکل‌های معادل -c:PATH، --c:PATH، -config:PATH، --config:PATH یا config:PATH استفاده کنید. مسیر می‌تواند نسبی یا مطلق باشد. برای ارسال مستقیم JSON از مقدار stdin استفاده کنید:

./WaterWall --config:/etc/waterwall/core.json
./WaterWall --config:stdin < core.json

به‌جای CLI می‌توانید متغیر محیطی WW_CORE_JSON_INPUT را روی یک مسیر یا stdin قرار دهید. گزینه‌ی CLI بر متغیر محیطی اولویت دارد و متغیر محیطی نیز بر مقدار پیش‌فرض ./core.json مقدم است.

انتخاب منبع جدید، working directory را تغییر نمی‌دهد. مسیرهای نسبی داخل JSON همچنان نسبت به دایرکتوری اجرای WaterWall محاسبه می‌شوند.

یک core.json حداقلی​

فایل core.json را کنار فایل اجرایی بسازید:

{
"log": {
"path": "logs/",
"core": {
"loglevel": "INFO",
"file": "core.log",
"console": true
},
"network": {
"loglevel": "INFO",
"file": "network.log",
"console": true
},
"dns": {
"loglevel": "INFO",
"file": "dns.log",
"console": true
},
"internal": {
"loglevel": "INFO",
"file": "internal.log",
"console": true
}
},
"misc": {
"workers": 1,
"ram-profile": "client",
"mtu": 1500,
"try-enabling-bbr": true,
"libs-path": "libs/"
},
"dns": {
"domain-strategy": "prefer-ipv4"
},
"configs": [
"configs/local-test.json"
]
}

وجود آرایه‌ی configs الزامی است و این آرایه باید دست‌کم مسیر یک فایل config را داشته باشد. بخش‌های دیگر اختیاری‌اند، اما نوشتن صریح تنظیمات misc باعث می‌شود رفتار runtime روشن‌تر و قابل‌پیش‌بینی‌تر باشد.

یک chain ساده برای تست​

فایل configs/local-test.json را بسازید:

{
"name": "local-test",
"author": "waterwall-user",
"config-version": 1,
"core-minimum-version": 0,
"nodes": [
{
"name": "listen-http",
"type": "TcpListener",
"settings": {
"address": "127.0.0.1",
"port": 8080
},
"next": "connect-example"
},
{
"name": "connect-example",
"type": "TcpConnector",
"settings": {
"address": "example.com",
"port": 80
}
}
]
}

WaterWall را اجرا کنید:

cd ~/waterwall
./WaterWall

در ترمینالی دیگر، listener محلی را تست کنید:

curl -v http://127.0.0.1:8080/

اگر درخواست به example.com می‌رسد، فایل اجرایی، فایل core، config loader، TcpListener، DNS resolver و TcpConnector همگی درست کار می‌کنند.

اجرا روی VPS​

برای ارائه‌ی یک سرویس عمومی، listener‌ها را روی یک آدرس عمومی یا wildcard قرار دهید:

"address": "0.0.0.0"

سپس پورت را در firewall سیستم‌عامل یا cloud firewall باز کنید. برای مثال، اگر روی پورت 443 گوش می‌دهید، هم firewall سیستم‌عامل و هم firewall شرکت ارائه‌دهنده باید اتصال ورودی TCP روی پورت 443 را مجاز بدانند.

استفاده از پورت‌های پایین‌تر از 1024 معمولاً به دسترسی root یا قابلیتی مانند CAP_NET_BIND_SERVICE نیاز دارد. node‌های packet-level مانند TunDevice نیز ممکن است به دسترسی بیشتری نیاز داشته باشند، زیرا interface شبکه می‌سازند یا از آن استفاده می‌کنند.

مشکلات رایج​

core.json پیدا نمی‌شود: WaterWall را از دایرکتوری حاوی core.json اجرا کنید، مسیر را با --config:PATH یا WW_CORE_JSON_INPUT مشخص کنید، یا working directory را در service manager خود مشخص کنید.

فایل config پیدا نمی‌شود: همه‌ی مسیرهای موجود در configs را بررسی کنید. مسیرهای نسبی معمولاً نسبت به working directory فعلی محاسبه می‌شوند.

خطای Permission denied: دستور chmod +x ./WaterWall را اجرا کنید. اگر پورت listener کمتر از 1024 است، برنامه را با دسترسی لازم اجرا کنید یا برای تست پورت بالاتری در نظر بگیرید.

پورت از قبل در حال استفاده است: در Linux با دستور ss -ltnp process‌ای را پیدا کنید که روی آن پورت TCP گوش می‌دهد.

client‌های راه دور نمی‌توانند متصل شوند: آدرس listener، log‌های WaterWall، firewall لینوکس و firewall شرکت ارائه‌دهنده را بررسی کنید. listener‌ای که روی 127.0.0.1 قرار دارد فقط اتصال‌های محلی را می‌پذیرد.

نام domain resolve نمی‌شود: بخش dns در core.json، به‌ویژه گزینه‌های servers و domain-strategy، را بررسی کنید و سپس log موجود در logs/dns.log را ببینید.