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

بخش ۱: تنظیمات هسته

فایل 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 و اجرا شوند.
logObjectخیرمسیر و فایل Log، سطح ثبت رویدادها و خروجی Console.
miscObjectخیرتعداد Workerها، پروفایل حافظه، MTU، تنظیم BBR در Linux و مسیر Libraryها.
dnsObjectخیر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.
networkLogهای شبکه و Runtime تونل‌ها.
dnsLogهای DNS Resolver مشترک و Asynchronous.

هر Logger فیلدهای یکسانی می‌پذیرد:

فیلدنوعمقدار پیش‌فرضتوضیح
loglevelString"INFO"پایین‌ترین سطحی که این Logger ثبت می‌کند.
fileStringمختص همان Loggerنام فایلی که به log.path افزوده می‌شود.
consoleBooleantrueخروجی این Logger در Console نیز چاپ شود.

log.path دایرکتوری پایه برای ساخت مسیر فایل‌های Log است. مقدار پیش‌فرض آن "log/" است. WaterWall در صورت نیاز این دایرکتوری را هنگام راه‌اندازی می‌سازد.

مقادیر پیش‌فرض:

فیلدمقدار پیش‌فرض
log.path"log/"
log.internal.loglevel"INFO"
log.internal.file"internal.log"
log.internal.consoletrue
log.core.loglevel"INFO"
log.core.file"core.log"
log.core.consoletrue
log.network.loglevel"INFO"
log.network.file"network.log"
log.network.consoletrue
log.dns.loglevel"INFO"
log.dns.file"dns.log"
log.dns.consoletrue

سطح‌های قابل‌قبول برای 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/"
}
}
فیلدنوعمقدار پیش‌فرضاعتبارسنجی و رفتار
workersIntegerتعداد هسته‌های CPUمقدار 0 یا منفی به تعداد هسته‌های CPU برمی‌گردد. مقادیر بیشتر از 254 به 254 کاهش می‌یابند.
ram-profileString یا Integerاگر misc وجود داشته باشد، "server"اندازه‌ی Memory Poolها را انتخاب می‌کند. مقدار نامعتبر راه‌اندازی را متوقف می‌کند.
mtuIntegerاگر misc وجود داشته باشد، 1500مقدار 0 یا منفی به 1500 برمی‌گردد.
try-enabling-bbrBooleantrueفقط در Linux: اگر Kernel در حال اجرا از BBR پشتیبانی کند، WaterWall در حد توان می‌کوشد TCP BBR را فعال کند.
libs-pathString"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-ms1000
max-timeout-ms5000
tries2
query-cache-max-ttl1800
server-failover.retry-chance10
server-failover.retry-delay-ms5000

سایر گزینه‌های رفتاری 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 قدیمی:

مقدارراهبرد
0accept-dns-returned-order
1prefer-ipv4
2prefer-ipv6
3only-ipv4
4only-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-msInteger1000بزرگ‌تر از 0Timeout اولیه‌ی Query مربوط به DNS بر حسب میلی‌ثانیه.
max-timeout-msInteger5000بزرگ‌تر از 0بیشترین Timeout برای Query مربوط به DNS پس از Retryها.
triesInteger2بزرگ‌تر از 0تعداد دفعات تلاش برای Query.
query-cache-max-ttlInteger18000 یا بیشترحداکثر 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 اعمال خواهد شد.

فیلدنوعاعتبارسنجیمفهوم
ndotsIntegerاز 0 تا 15تعداد نقطه‌های لازم پیش از آنکه c-ares نام را Absolute در نظر بگیرد.
udp-portIntegerاز 1 تا 65535پورت UDP سرور DNS.
tcp-portIntegerاز 1 تا 65535پورت TCP سرور DNS.
socket-send-buffer-sizeIntegerبزرگ‌تر از 0اندازه‌ی Send Buffer مربوط به Socketِ DNS.
socket-receive-buffer-sizeIntegerبزرگ‌تر از 0اندازه‌ی Receive Buffer مربوط به Socketِ DNS.
edns-packet-sizeIntegerاز 1 تا 65535اندازه‌ی Packet مربوط به EDNS.
udp-max-queriesInteger0 یا بیشترمحدودیت Queryهای UDP در c-ares.
rotateBooleanمقدار 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 داده می‌شوند.
lookupsStringفقط b و f، بدون نویسه‌ی تکراریترتیب Lookup Sourceها؛ b یعنی DNS و f یعنی فایل hosts.
resolvconf-pathStringString غیرخالیمسیر سفارشی resolv.conf.
hosts-pathStringString غیرخالیمسیر سفارشی فایل hosts.
sortlistStringString غیرخالیمقدار Sortlist مربوط به c-ares.
serversString یا آرایه‌ای از 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-chanceInteger10از 0 تا 65535مقدار احتمال Retry در c-ares.
retry-delay-msInteger50000 یا بیشترفاصله‌ی زمانی تا تلاش دوباره برای سرور 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 در JSONCommentها را از 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
کنترل مصرف CPUmisc.workers
انتخاب رفتار حافظه برای Server یا Clientmisc.ram-profile
داشتن Logهای کاربردیlog.network.loglevel، log.dns.loglevel
اولویت‌دادن به IPv4 یا IPv6dns.domain-strategy
استفاده از Resolverهای مشخصdns.servers

تا زمانی که دلیل مشخصی برای تغییر گزینه‌های پیشرفته‌ی DNS ندارید، آن‌ها را به حال خود بگذارید. مقادیر پیش‌فرض عمداً برای استقرارهای معمول محافظه‌کارانه انتخاب شده‌اند.