بخش ۱: تنظیمات هسته
فایل core.json پیکربندی آغاز به کار WaterWall است و فایل اجرایی آن را هنگام
راهاندازی میخواند. تنظیمات سراسری پردازش، مانند Logها، تعداد Workerها، پروفایل
حافظه، MTU، تنظیم اختیاری BBR در Linux، مسیر Libraryهای خارجی، DNS Resolver مشترک
و فهرست فایلهای پیکربندی Nodeها، در این فایل قرار میگیرند.
خود Nodeهای تونل مستقیماً در این فایل تعریف نمیشوند. زنجیرههای تونل در فایلهایی
قرار دارند که زیر configs فهرست شدهاند.
نکات مهم هنگام راهاندازی
WaterWall فایل core.json را از Working Directory پردازش میخواند. چیدمان معمول
فایلها چنین است:
waterwall/
WaterWall
core.json
configs/
server.json
WaterWall را از همین دایرکتوری اجرا کنید:
cd ~/waterwall
./WaterWall
محتوای core.json باید JSON معتبر باشد؛ بنابراین در آن Commentهایی با //
ننویسید. امکان Commentگذاری و جایگزینی Variable که در ادامه برای فایلهای
پیکربندی Node توضیح داده میشود، متعلق به Node Config Loader است و Parser تنظیمات
هسته آن را پشتیبانی نمیکند.
همهی مسیرهای core.json دقیقاً با همان شکلی که نوشته شدهاند به بخش مربوط داده
میشوند. در راهاندازیهای معمول، مسیرهای نسبی نسبت به Working Directory اجرای
WaterWall محاسبه میشوند.
ساختار سطح اول
{
"log": {},
"misc": {},
"dns": {},
"configs": []
}
| فیلد | نوع | الزامی | کاربرد |
|---|---|---|---|
configs | آرایهای از Stringها | بله | فایلهای پیکربندی Node که باید Parse و اجرا شوند. |
log | Object | خیر | مسیر و فایل Log، سطح ثبت رویدادها و خروجی Console. |
misc | Object | خیر | تعداد Workerها، پروفایل حافظه، MTU، تنظیم BBR در Linux و مسیر Libraryها. |
dns | Object | خیر | DNS Resolver مشترک و Asynchronous و راهبرد پیشفرض انتخاب آدرس دامنه. |
وجود configs الزامی است و باید دستکم یک مسیر String در آن باشد. بخشهای دیگر
اختیاریاند، اما در محیط Production بهتر است misc و dns.domain-strategy را
صریحاً مشخص کنید.
گزینهی domain-strategy را در ریشهی core.json قرار ندهید:
{
"domain-strategy": "prefer-ipv4"
}
این ساختار هنگام راهاندازی رد میشود. شکل درست آن چنین است:
{
"dns": {
"domain-strategy": "prefer-ipv4"
}
}
configs
بخش configs مشخص میکند WaterWall پس از آمادهشدن Runtime هسته، کدام فایلهای
پیکربندی Node را بارگذاری کند.
{
"configs": [
"configs/server.json",
"configs/reverse.json"
]
}
قواعد:
| حالت | رفتار |
|---|---|
configs وجود ندارد | راهاندازی با خطا متوقف میشود. |
| آرایه خالی است | راهاندازی با خطا متوقف میشود. |
| هیچ عضو String در آرایه نیست | راهاندازی با خطا متوقف میشود. |
| مسیرها نسبیاند | نسبت به Working Directory پردازش Resolve میشوند. |
| چند فایل وجود دارد | پس از Parseشدن تنظیمات هسته، Node Manager آنها را بارگذاری میکند. |
برای راهاندازیهای کوچک یک فایل کافی است. در استقرارهای بزرگتر میتوانید گروههای مختلف زنجیره را در چند فایل جدا قرار دهید.
log
بخش log چهار Logger سراسری پردازش را تنظیم میکند.
| Logger | کاربرد |
|---|---|
internal | جزئیات سطح پایین Runtime و اطلاعات تشخیصی داخلی. |
core | راهاندازی، Parseکردن پیکربندی و Logهای سطح Manager. |
network | Logهای شبکه و Runtime تونلها. |
dns | Logهای DNS Resolver مشترک و Asynchronous. |
هر Logger فیلدهای یکسانی میپذیرد:
| فیلد | نوع | مقدار پیشفرض | توضیح |
|---|---|---|---|
loglevel | String | "INFO" | پایینترین سطحی که این Logger ثبت میکند. |
file | String | مختص همان Logger | نام فایلی که به log.path افزوده میشود. |
console | Boolean | true | خروجی این Logger در Console نیز چاپ شود. |
log.path دایرکتوری پایه برای ساخت مسیر فایلهای Log است. مقدار پیشفرض آن
"log/" است. WaterWall در صورت نیاز این دایرکتوری را هنگام راهاندازی میسازد.
مقادیر پیشفرض:
| فیلد | مقدار پیشفرض |
|---|---|
log.path | "log/" |
log.internal.loglevel | "INFO" |
log.internal.file | "internal.log" |
log.internal.console | true |
log.core.loglevel | "INFO" |
log.core.file | "core.log" |
log.core.console | true |
log.network.loglevel | "INFO" |
log.network.file | "network.log" |
log.network.console | true |
log.dns.loglevel | "INFO" |
log.dns.file | "dns.log" |
log.dns.console | true |
سطحهای قابلقبول برای Log:
VERBOSE, DEBUG, INFO, WARN, ERROR, FATAL, SILENT
Logger پیش از اعمال مقدار، آن را به حروف بزرگ تبدیل میکند؛ بنابراین در این لایه
"debug" و "DEBUG" تفاوتی ندارند.
نمونه:
{
"log": {
"path": "logs/",
"internal": {
"loglevel": "INFO",
"file": "internal.log",
"console": false
},
"core": {
"loglevel": "INFO",
"file": "core.log",
"console": true
},
"network": {
"loglevel": "WARN",
"file": "network.log",
"console": true
},
"dns": {
"loglevel": "DEBUG",
"file": "dns.log",
"console": true
}
}
}
پیشنهادهای عملی:
| موقعیت | پیشنهاد |
|---|---|
| نصب اولیه یا Debug | خروجی Console برای core، network و dns را فعال نگه دارید. |
| محیط Production با اتصالهای زیاد | برای network از INFO یا WARN استفاده کنید؛ سطحهای پرحجم را فقط هنگام Debug فعال کنید. |
| عیبیابی DNS | موقتاً log.dns.loglevel را روی "DEBUG" بگذارید. |
| سرویس بلندمدت | حتی اگر خروجی Console غیرفعال است، ثبت Log در فایل را فعال نگه دارید. |
misc
بخش misc اندازهی منابع Runtime و نحوهی بارگذاری Libraryها را در سطح پردازش
کنترل میکند.
{
"misc": {
"workers": 4,
"ram-profile": "server",
"mtu": 1500,
"try-enabling-bbr": true,
"libs-path": "libs/"
}
}
| فیلد | نوع | مقدار پیشفرض | اعتبارسنجی و رفتار |
|---|---|---|---|
workers | Integer | تعداد هستههای CPU | مقدار 0 یا منفی به تعداد هستههای CPU برمیگردد. مقادیر بیشتر از 254 به 254 کاهش مییابند. |
ram-profile | String یا Integer | اگر misc وجود داشته باشد، "server" | اندازهی Memory Poolها را انتخاب میکند. مقدار نامعتبر راهاندازی را متوقف میکند. |
mtu | Integer | اگر misc وجود داشته باشد، 1500 | مقدار 0 یا منفی به 1500 برمیگردد. |
try-enabling-bbr | Boolean | true | فقط در Linux: اگر Kernel در حال اجرا از BBR پشتیبانی کند، WaterWall در حد توان میکوشد TCP BBR را فعال کند. |
libs-path | String | "libs/" | دایرکتوری بارگذاری Libraryهای خارجی تونل. |
اگر misc وجود داشته و خالی نباشد، فیلدهای حذفشده از مقادیر پیشفرض بالا استفاده
میکنند. اگر کل این بخش حذف شود، Parser فعلی برای workers صریحاً تعداد هستههای
CPU و برای libs-path مقدار "libs/" را در نظر میگیرد. برای رفتار قابلپیشبینی،
بهتر است کل بخش misc را صریح بنویسید.
workers
گزینهی workers تعداد Worker Threadهایی را مشخص میکند که WaterWall میسازد.
| نوع استقرار | نقطهی شروع مناسب |
|---|---|
| Client کوچک یا محیط آزمایش | 1 یا 2 |
| VPS عمومی | برابر با تعداد هستههای CPU |
| سرور پرترافیک | ابتدا تعداد هستههای CPU؛ سپس تنظیم بر اساس معیارهای CPU و Latency |
Worker بیشتر همیشه بهتر نیست. هر Worker یک Event Loop و بخشی از منابع مختص خود
را دارد. مقادیر بسیار بزرگ به 254 محدود میشوند.
ram-profile
مقادیر String:
| مقدار | پروفایل داخلی | کاربرد معمول |
|---|---|---|
"server" | پروفایل حافظهی L2 | پروفایل پیشفرض سمت Server با Poolهای بزرگتر. |
"client" | پروفایل حافظهی M1 | پروفایل عمومی سمت Client. |
"client-larger" | پروفایل حافظهی M2 | پروفایل بزرگتر سمت Client. |
"minimal" | پروفایل حافظهی S1 | پروفایل کمینهی حافظه. |
"ultralow" | پروفایل حافظهی S1 | نام مستعار "minimal". |
Parser پیش از تطبیق، مقدار String را به حروف کوچک تبدیل میکند. در پیکربندیهای جدید بهتر است از مقدارهای String استفاده کنید.
مقادیر Integer قدیمی نیز همچنان پذیرفته میشوند:
| مقدار | پروفایل |
|---|---|
0 یا 1 | پروفایل حافظهی S1 |
2 | پروفایل حافظهی S2 |
3 | پروفایل حافظهی M1 |
4 | پروفایل حافظهی M2 |
5 | پروفایل حافظهی L1 |
6 | پروفایل حافظهی L2 |
هر مقدار عددی یا String نامعتبر، راهاندازی را متوقف میکند.
mtu
mtu مقدار سراسری MTU است که در اختیار تونلهای نیازمند مقدار پیشفرض قرار
میگیرد.
مگر آنکه توپولوژی شما مقدار دیگری لازم داشته باشد، از 1500 استفاده کنید.
تونلهای Packet، دستگاههای TUN، لایههای Encapsulation و زنجیرههای شبیه VPN ممکن
است برای جلوگیری از Fragmentation به MTU مؤثر کوچکتری نیاز داشته باشند.
Parser فقط مقدار 0 و اعداد منفی را رد میکند. مقداری واقعبینانه برای MTU
انتخاب کنید و از اعداد بیشازحد بزرگ استفاده نکنید.
try-enabling-bbr
وقتی این گزینه در Linux برابر true باشد، WaterWall الگوریتم فعلی کنترل ازدحام
TCP و مقدار net.ipv4.tcp_available_congestion_control را بررسی میکند. اگر Kernel
در حال اجرا bbr را در فهرست پشتیبانیشده داشته باشد و BBR از قبل فعال نباشد،
WaterWall مقادیر زندهی sysctl را برای net.core.default_qdisc=fq و
net.ipv4.tcp_congestion_control=bbr اعمال میکند.
این فقط تلاشی برای تنظیم بهتر سیستم هنگام راهاندازی است و موفقیت آن تضمینشده
نیست. WaterWall نه Kernel نصب میکند و نه /etc/sysctl.conf را تغییر میدهد. اگر
نمیخواهید برنامه هنگام راهاندازی تنظیمات TCP سیستم را تغییر دهد، این گزینه را
روی false بگذارید.
libs-path
libs-path دایرکتوری Libraryهای خارجی تونل را مشخص میکند.
در بیشتر استقرارهای معمول از Nodeهای داخلی استفاده میشود و این مقدار را میتوان بدون تغییر گذاشت:
{
"misc": {
"libs-path": "libs/"
}
}
فقط زمانی آن را تغییر دهید که عمداً Library مربوط به Nodeهای خارجی را از دایرکتوری دیگری بارگذاری میکنید.
dns
بخش dns، Resolver مشترک و Asynchronous مبتنی بر c-ares را که Workerهای WaterWall
به کار میبرند تنظیم میکند. همچنین راهبرد پیشفرض انتخاب آدرس دامنه برای Nodeهای
Connector در همین بخش تعیین میشود.
اگر dns حذف شده یا خالی باشد:
| تنظیم | مقدار پیشفرض |
|---|---|
| گزینههای Resolver | مقادیر پیشفرض c-ares در WaterWall |
dns.domain-strategy | "prefer-ipv4" |
timeout-ms | 1000 |
max-timeout-ms | 5000 |
tries | 2 |
query-cache-max-ttl | 1800 |
server-failover.retry-chance | 10 |
server-failover.retry-delay-ms | 5000 |
سایر گزینههای رفتاری DNS فقط در صورت تعریفشدن به c-ares فرستاده میشوند. در صورت حذف آنها، رفتارشان را c-ares و تنظیمات Resolver سیستمعامل تعیین میکند.
dns.domain-strategy
domain-strategy مشخص میکند وقتی DNS رکورد IPv4، IPv6 یا هر دو را برمیگرداند،
WaterWall کدام آدرس را انتخاب کند.
این مقدار پیشفرض هسته برای Nodeهایی است که راهبرد جداگانهای ندارند.
TcpConnector و UdpConnector میتوانند در settings خود آن را Override کنند.
هر مقصد در ورودیهای وزندار TcpConnector.addresses نیز میتواند راهبرد مخصوص
خود را داشته باشد.
مقادیر String معتبر:
| مقدار | رفتار |
|---|---|
"prefer-ipv4" | در صورت وجود، نخستین آدرس IPv4 انتخاب میشود؛ در غیر این صورت IPv6 به کار میرود. این مقدار پیشفرض هسته است. |
"prefer-ipv6" | در صورت وجود، نخستین آدرس IPv6 انتخاب میشود؛ در غیر این صورت IPv4 به کار میرود. |
"only-ipv4" | فقط نتیجههای IPv4 پذیرفته میشوند. اگر آدرس IPv4 برنگردد، نتیجه برای آن اتصال قابلاستفاده نیست. |
"only-ipv6" | فقط نتیجههای IPv6 پذیرفته میشوند. اگر آدرس IPv6 برنگردد، نتیجه برای آن اتصال قابلاستفاده نیست. |
"accept-dns-returned-order" | نخستین آدرس قابلاستفاده با همان ترتیبی که DNS برگردانده انتخاب میشود. |
تطبیق Stringها به بزرگی و کوچکی حروف حساس نیست.
مقادیر Integer قدیمی:
| مقدار | راهبرد |
|---|---|
0 | accept-dns-returned-order |
1 | prefer-ipv4 |
2 | prefer-ipv6 |
3 | only-ipv4 |
4 | only-ipv6 |
نمونه:
{
"dns": {
"domain-strategy": "prefer-ipv4"
}
}
راهنمای عملی:
| محیط | راهبرد |
|---|---|
| بیشتر VPSهای مبتنی بر IPv4 | "prefer-ipv4" |
| شبکهای که IPv6 در آن اولویت دارد | "prefer-ipv6" |
| سرور یا قواعد Firewall مختص IPv4 | "only-ipv4" |
| استقرار فقط با IPv6 | "only-ipv6" |
| به ترتیب اعلامشدهی Resolver اعتماد دارید | "accept-dns-returned-order" |
زمانبندی و Cache مربوط به Resolver
| فیلد | نوع | مقدار پیشفرض | اعتبارسنجی | مفهوم |
|---|---|---|---|---|
timeout-ms | Integer | 1000 | بزرگتر از 0 | Timeout اولیهی Query مربوط به DNS بر حسب میلیثانیه. |
max-timeout-ms | Integer | 5000 | بزرگتر از 0 | بیشترین Timeout برای Query مربوط به DNS پس از Retryها. |
tries | Integer | 2 | بزرگتر از 0 | تعداد دفعات تلاش برای Query. |
query-cache-max-ttl | Integer | 1800 | 0 یا بیشتر | حداکثر TTL مربوط به DNS Cache بر حسب ثانیه. |
نمونه:
{
"dns": {
"timeout-ms": 750,
"max-timeout-ms": 3000,
"tries": 2,
"query-cache-max-ttl": 600
}
}
Timeoutهای کوتاهتر باعث میشوند دامنههای ناموفق زودتر Fail شوند، اما ممکن است پایداری را در شبکههای کند یا همراه با Packet Loss کاهش دهند. TTL کوتاهتر برای Cache، تغییرات DNS را زودتر نمایان میکند، ولی ترافیک Resolver را افزایش میدهد.
گزینههای رفتاری Resolver
این گزینهها اختیاریاند. اگر حذف شوند، مقادیر پیشفرض c-ares اعمال خواهد شد.
| فیلد | نوع | اعتبارسنجی | مفهوم |
|---|---|---|---|
ndots | Integer | از 0 تا 15 | تعداد نقطههای لازم پیش از آنکه c-ares نام را Absolute در نظر بگیرد. |
udp-port | Integer | از 1 تا 65535 | پورت UDP سرور DNS. |
tcp-port | Integer | از 1 تا 65535 | پورت TCP سرور DNS. |
socket-send-buffer-size | Integer | بزرگتر از 0 | اندازهی Send Buffer مربوط به Socketِ DNS. |
socket-receive-buffer-size | Integer | بزرگتر از 0 | اندازهی Receive Buffer مربوط به Socketِ DNS. |
edns-packet-size | Integer | از 1 تا 65535 | اندازهی Packet مربوط به EDNS. |
udp-max-queries | Integer | 0 یا بیشتر | محدودیت Queryهای UDP در c-ares. |
rotate | Boolean | مقدار Boolean | چرخش میان Serverهای c-ares را فعال یا غیرفعال میکند. |
نمونه:
{
"dns": {
"ndots": 1,
"udp-port": 53,
"tcp-port": 53,
"socket-send-buffer-size": 262144,
"socket-receive-buffer-size": 262144,
"edns-packet-size": 1232,
"udp-max-queries": 0,
"rotate": true
}
}
تا وقتی دلیل مشخصی ندارید، این گزینهها را تغییر ندهید. برای بیشتر کاربران،
servers، domain-strategy و گزینههای زمانبندی کافیاند.
گزینههای Search و Source
| فیلد | نوع | اعتبارسنجی | مفهوم |
|---|---|---|---|
domains | آرایهای از Stringها | آرایه و Stringها نباید خالی باشند | Search Domainهایی که به c-ares داده میشوند. |
lookups | String | فقط b و f، بدون نویسهی تکراری | ترتیب Lookup Sourceها؛ b یعنی DNS و f یعنی فایل hosts. |
resolvconf-path | String | String غیرخالی | مسیر سفارشی resolv.conf. |
hosts-path | String | String غیرخالی | مسیر سفارشی فایل hosts. |
sortlist | String | String غیرخالی | مقدار Sortlist مربوط به c-ares. |
servers | String یا آرایهای از Stringها | غیرخالی؛ اعضای آرایه نباید کاما داشته باشند | سرورهای DNS که به c-ares داده میشوند. |
servers میتواند یک String با قالب CSV مورد قبول c-ares یا یک آرایه باشد. اگر
آرایه باشد، WaterWall اعضای آن را پیش از فرستادن به c-ares با کاما به هم متصل
میکند.
نمونه:
{
"dns": {
"servers": [
"1.1.1.1",
"8.8.8.8"
],
"lookups": "bf",
"domains": [
"example.com"
],
"resolvconf-path": "/etc/resolv.conf",
"hosts-path": "/etc/hosts",
"sortlist": "10.0.0.0/8"
}
}
مقادیر lookups:
| مقدار | مفهوم |
|---|---|
"b" | فقط DNS. |
"f" | فقط فایل hosts. |
"bf" | ابتدا DNS و سپس فایل hosts بررسی شود. |
"fb" | ابتدا فایل hosts و سپس DNS بررسی شود. |
Sourceهای Lookup را تکرار نکنید؛ مقادیر "bb"، "ff" و "bfb" رد میشوند.
dns.flags
flags گزینههای Flag پشتیبانیشدهی c-ares را تنظیم میکند و چهار شکل نوشتاری
دارد.
Bitmask عددی:
{
"dns": {
"flags": 0
}
}
نام یک Flag:
{
"dns": {
"flags": "edns"
}
}
آرایهای از نام Flagها:
{
"dns": {
"flags": [
"edns",
"dns0x20"
]
}
}
Object با مقدارهای Boolean:
{
"dns": {
"flags": {
"edns": true,
"dns0x20": true,
"use-vc": false
}
}
}
در شکل Object، مقدار true یک Flag را فعال میکند و false آن را غیرفعال باقی
میگذارد.
نام Flagهای پشتیبانیشده:
| نام | Flag در c-ares |
|---|---|
"usevc" | ARES_FLAG_USEVC |
"use-vc" | ARES_FLAG_USEVC |
"tcp" | ARES_FLAG_USEVC |
"primary" | ARES_FLAG_PRIMARY |
"igntc" | ARES_FLAG_IGNTC |
"ignore-truncated" | ARES_FLAG_IGNTC |
"norecurse" | ARES_FLAG_NORECURSE |
"no-recurse" | ARES_FLAG_NORECURSE |
"stayopen" | ARES_FLAG_STAYOPEN |
"stay-open" | ARES_FLAG_STAYOPEN |
"no-search" | ARES_FLAG_NOSEARCH |
"no-aliases" | ARES_FLAG_NOALIASES |
"nocheckresp" | ARES_FLAG_NOCHECKRESP |
"no-check-response" | ARES_FLAG_NOCHECKRESP |
"edns" | ARES_FLAG_EDNS |
"no-default-server" | ARES_FLAG_NO_DFLT_SVR |
"no-dflt-svr" | ARES_FLAG_NO_DFLT_SVR |
"dns0x20" | ARES_FLAG_DNS0x20 |
وجود نام ناشناخته برای Flag، راهاندازی را متوقف میکند. Bitmaskهای عددی نیز فقط میتوانند Bitهای پشتیبانیشدهی c-ares را در خود داشته باشند.
dns.server-failover
بخش server-failover گزینههای Failover سرور را در c-ares تنظیم میکند.
| فیلد | نوع | مقدار پیشفرض | اعتبارسنجی | مفهوم |
|---|---|---|---|---|
retry-chance | Integer | 10 | از 0 تا 65535 | مقدار احتمال Retry در c-ares. |
retry-delay-ms | Integer | 5000 | 0 یا بیشتر | فاصلهی زمانی تا تلاش دوباره برای سرور DNS ناموفق. |
نمونه:
{
"dns": {
"server-failover": {
"retry-chance": 25,
"retry-delay-ms": 2000
}
}
}
اگر server-failover وجود داشته باشد، باید یک Object باشد. فیلدهای داخل آن
اختیاریاند و فیلدهای حذفشده مقدار پیشفرض خود را حفظ میکنند.
نمونهی کامل ساختار
نمونهی زیر همهی بخشهای فعلی مستندشدهی هسته و بیشتر فیلدهای DNS را نشان میدهد. از آن بهعنوان مرجع استفاده کنید، نه توصیهای برای تغییر همهی مقادیر DNS.
{
"log": {
"path": "log/",
"internal": {
"loglevel": "INFO",
"file": "internal.log",
"console": true
},
"core": {
"loglevel": "INFO",
"file": "core.log",
"console": true
},
"network": {
"loglevel": "INFO",
"file": "network.log",
"console": true
},
"dns": {
"loglevel": "INFO",
"file": "dns.log",
"console": true
}
},
"misc": {
"workers": 4,
"ram-profile": "server",
"mtu": 1500,
"try-enabling-bbr": true,
"libs-path": "libs/"
},
"dns": {
"domain-strategy": "prefer-ipv4",
"timeout-ms": 1000,
"max-timeout-ms": 5000,
"tries": 2,
"query-cache-max-ttl": 1800,
"ndots": 1,
"udp-port": 53,
"tcp-port": 53,
"socket-send-buffer-size": 262144,
"socket-receive-buffer-size": 262144,
"edns-packet-size": 1232,
"udp-max-queries": 0,
"flags": [
"edns",
"dns0x20"
],
"rotate": true,
"domains": [
"example.com"
],
"lookups": "bf",
"resolvconf-path": "/etc/resolv.conf",
"hosts-path": "/etc/hosts",
"sortlist": "10.0.0.0/8",
"servers": [
"1.1.1.1",
"8.8.8.8"
],
"server-failover": {
"retry-chance": 10,
"retry-delay-ms": 5000
}
},
"configs": [
"configs/server.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": 4,
"ram-profile": "server",
"mtu": 1500,
"try-enabling-bbr": true,
"libs-path": "libs/"
},
"dns": {
"domain-strategy": "prefer-ipv4"
},
"configs": [
"configs/server.json"
]
}
نمونهی تنظیمشده برای DNS
اگر میخواهید سرورهای DNS را صریحاً مشخص کنید و رفتار Resolver را سریعتر عیبیابی کنید، نمونهی زیر نقطهی شروع مناسبی است:
{
"log": {
"path": "logs/",
"core": {
"loglevel": "INFO",
"file": "core.log",
"console": true
},
"network": {
"loglevel": "WARN",
"file": "network.log",
"console": false
},
"dns": {
"loglevel": "DEBUG",
"file": "dns.log",
"console": true
},
"internal": {
"loglevel": "INFO",
"file": "internal.log",
"console": false
}
},
"misc": {
"workers": 8,
"ram-profile": "client-larger",
"mtu": 1500,
"try-enabling-bbr": true,
"libs-path": "libs/"
},
"dns": {
"domain-strategy": "prefer-ipv4",
"servers": [
"1.1.1.1",
"8.8.8.8"
],
"timeout-ms": 1000,
"max-timeout-ms": 5000,
"tries": 2,
"query-cache-max-ttl": 600,
"lookups": "bf",
"flags": [
"edns",
"dns0x20"
],
"rotate": true,
"server-failover": {
"retry-chance": 10,
"retry-delay-ms": 5000
}
},
"configs": [
"configs/server.json",
"configs/reverse.json"
]
}
خطاهای رایج هنگام راهاندازی
| اشتباه | نتیجه | راهحل |
|---|---|---|
در core.json از Commentهای // استفاده شده است | خطای Parse در JSON | Commentها را از core.json حذف کنید. |
configs وجود ندارد یا خالی است | راهاندازی متوقف میشود | مسیر دستکم یک فایل پیکربندی را اضافه کنید. |
مسیر موجود در configs نسبت به دایرکتوری دیگری نوشته شده است | فایل پیکربندی خوانده نمیشود | WaterWall را از Working Directory موردنظر اجرا کنید یا مسیرها را اصلاح کنید. |
domain-strategy در ریشه قرار دارد | راهاندازی متوقف میشود | آن را به dns.domain-strategy منتقل کنید. |
dns یک Object نیست | راهاندازی متوقف میشود | برای dns از Object استفاده کنید یا آن را حذف کنید. |
dns.flags نام ناشناختهای دارد | راهاندازی متوقف میشود | یکی از نامهای مستندشده را به کار ببرید. |
در misc.ram-profile اشتباه تایپی وجود دارد | راهاندازی متوقف میشود | از server، client، client-larger، minimal یا ultralow استفاده کنید. |
| تعداد Workerها بیشازحد زیاد است | مقدار به 254 کاهش مییابد | تعداد واقعبینانهای برای Workerها انتخاب کنید. |
ابتدا چه چیزهایی را تنظیم کنیم؟
در شروع، فقط روی این موارد تمرکز کنید:
| هدف | فیلد |
|---|---|
| اجرای زنجیرههای درست | configs |
| کنترل مصرف CPU | misc.workers |
| انتخاب رفتار حافظه برای Server یا Client | misc.ram-profile |
| داشتن Logهای کاربردی | log.network.loglevel، log.dns.loglevel |
| اولویتدادن به IPv4 یا IPv6 | dns.domain-strategy |
| استفاده از Resolverهای مشخص | dns.servers |
تا زمانی که دلیل مشخصی برای تغییر گزینههای پیشرفتهی DNS ندارید، آنها را به حال خود بگذارید. مقادیر پیشفرض عمداً برای استقرارهای معمول محافظهکارانه انتخاب شدهاند.