DNS — Xray-core
بلوک dns حلکنندهٔ داخلی Xray را پیکربندی میکند: فهرستی از سرورها، میزبانهای ایستا اختیاری و چند کلید کشینگ / جایگزین. موتور DNS همچنین خود را بهعنوان یک ورودی داخلی (بهطور پیشفرض با تگ dns) معرفی میکند، بنابراین ترافیک DNS میتواند مانند هر اتصال دیگری مسیریابی شود.
گزینههای سطح بالا
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
servers | []*NameServerConfig | [] | [NameServerConfig | <string>] | فهرست حلکنندهها. هر ورودی یا یک رشتهٔ `address` است (`8.8.8.8`، `https://dns.google/dns-query`، `tcp+local://`، `fakedns`، …) یا یک شیء کامل NameServerConfig. |
hosts | *HostsWrapper | {} | {<domain or pattern>: <IP | [IP, …]>} | میزبانهای ایستا. کلیدها از همان پیشوندهای `full:`, `domain:`, `regexp:`, `keyword:`, `geosite:` مانند قواعد مسیریابی پشتیبانی میکنند. |
clientIp | *Address | (unset) | <IP> | ECS (EDNS Client Subnet) که در پرسوجوهای خروجی اعلام میشود. کمک میکند حلکنندههای آگاه از CDN پاسخ جغرافیایی نزدیکتری بازگردانند. |
tag | string | dns | <inbound tag> | تگ داخلی برای ورودی موتور DNS. توسط قواعد مسیریابی که میخواهند ترافیک DNS را جدا کنند استفاده میشود. |
queryStrategy | string | UseIP | UseIP | UseIPv4 | UseIPv6 | استراتژی پرسوجوی پیشفرض زمانی که استراتژی per-server تنظیم نشده باشد. `UseIP` هر دو A و AAAA را پرسوجو میکند؛ `UseIPv4`/`UseIPv6` خانوادهٔ دیگر را رد میکند. |
disableCache | bool | false | true | false | غیرفعال کردن کش پاسخ در حافظه. هر پرسوجو بهصورت تازه ارسال میشود. |
serveStale | bool | false | true | false | ارائهٔ ورودیهای کششدهٔ منقضی در حالی که تازهسازی در پسزمینه اجرا میشود. تأخیر درکشده را بهبود میبخشد. |
serveExpiredTTL | uint32 | 0 | <seconds> | حداکثر ثانیههایی که یک ورودی منقضی هنگام فعال بودن `serveStale` ارائه میشود. 0 یعنی بدون محدودیت. |
disableFallback | bool | false | true | false | اگر سرور اول پاسخ قابل استفادهای بازنگرداند به سرورهای بعدی رجوع نکن. |
disableFallbackIfMatch | bool | false | true | false | همان، اما فقط زمانی که سرور تطبیقیافته خود فهرست `domains` داشته باشد — یعنی سرورهای تطبیقیافته با دامنه هرگز جایگزین را راهاندازی نمیکنند. |
enableParallelQuery | bool | false | true | false | همهٔ سرورهای تطبیقیافته را بهصورت موازی پرسوجو کن؛ اولین پاسخ معتبر برنده است. |
useSystemHosts | bool | false | true | false | همچنین قبل از رفتن به شبکه، `/etc/hosts` سیستمعامل (یا معادل پلتفرم) را نیز مشورت کن. |
منبع: infra/conf/dns.go:198-211 · ثابتشده در v1.260327.0 (d2758a0)
servers[] — NameServerConfig
هر ورودی یا یک رشتهٔ آدرس خام است (که به address تجزیه میشود) یا شکل شیءگونهٔ کامل:
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
address | *Address | (required) | <DNS URL> | آدرس حلکننده. IP خام (`8.8.8.8` = UDP/53)، `tcp://`، `tls://`، `https://`، `quic://`، `tcp+local://...` (استفاده از DNS محلی بدون پراکسی)، `localhost`، یا `fakedns`. |
clientIp | *Address | (inherit) | <IP> | بازنویسی ECS per-server. |
port | uint16 | 53 | <port> | پورت سرور (فقط برای آدرسهای IP خام). |
skipFallback | bool | false | true | false | وقتی true باشد و این سرور پاسخی برنگرداند، زنجیرهٔ جایگزین آزمایش *نمیشود* — پرسوجو صرفاً شکست میخورد. |
domains | []string | [] | <domain pattern> | دامنههایی که این سرور باید پاسخ دهد. نحو همانند قواعد مسیریابی است. اگر غیرخالی باشد، سرور فقط برای این دامنهها مشورت میشود. |
expectedIPs | StringList | [] | <IP / CIDR / geoip:> | پاسخ این سرور را فقط زمانی بپذیر که IP حلشده با یکی از این الگوها تطبیق داشته باشد. برای فیلتر کردن پاسخهای سانسورشده یا ربودهشده استفاده میشود. |
expectIPs | StringList | (alias) | (alias of expectedIPs) | نام مستعار سازگاری برای `expectedIPs`. |
queryStrategy | string | (inherit) | UseIP | UseIPv4 | UseIPv6 | بازنویسی استراتژی per-server. |
tag | string | (unset) | <string> | تگ سرور — توسط قواعد مسیریابی که ترافیک خروجی حلکننده را مسیریابی میکنند ارجاع میشود. |
timeoutMs | uint64 | 4000 | <ms> | زماناوت per-query به میلیثانیه. |
disableCache | *bool | (inherit) | true | false | بازنویسی کش per-server. |
serveStale | *bool | (inherit) | true | false | بازنویسی serve-stale per-server. |
serveExpiredTTL | *uint32 | (inherit) | <seconds> | سقف TTL منقضی per-server. |
finalQuery | bool | false | true | false | این سرور را بهعنوان جایگزین نهایی علامت بزن — اگر پاسخ دهد، حل بیشتری انجام نمیشود. |
unexpectedIPs | StringList | [] | <IP / CIDR / geoip:> | پاسخ این سرور را اگر IP حلشده با هر یک از این الگوها تطبیق داشته باشد رد کن. مکمل `expectedIPs`. |
منبع: infra/conf/dns.go:18-34 · ثابتشده در v1.260327.0 (d2758a0)
hosts
فیلد hosts یک نگاشت تخت است. کلیدها از همان پیشوندهای قواعد مسیریابی پشتیبانی میکنند؛ مقادیر یا یک IP واحد یا آرایهای از IPها هستند.
{
"dns": {
"hosts": {
"domain:example.com": "203.0.113.10",
"domain:internal.corp": ["10.0.0.1", "10.0.0.2"],
"geosite:cn": "8.8.8.8"
}
}
}مقدار "fakedns" بهعنوان IP باعث میشود Xray یک آدرس جعلی از استخر FakeDNS بازگرداند.
مثالها
حلکنندهٔ تقسیمشدهٔ استاندارد — دامنههای CN از طریق DoH محلی و باقی از طریق Cloudflare DoH:
{
"dns": {
"servers": [
{
"address": "https://doh.pub/dns-query",
"domains": ["geosite:cn"],
"expectedIPs": ["geoip:cn"]
},
"https://1.1.1.1/dns-query",
{
"address": "tcp+local://223.5.5.5",
"domains": ["geosite:cn"]
}
],
"hosts": {
"domain:example.com": "203.0.113.10"
},
"queryStrategy": "UseIP",
"disableFallbackIfMatch": true,
"enableParallelQuery": false
}
}مسیریابی FakeDNS:
{
"dns": {
"servers": ["fakedns", "1.1.1.1"]
},
"fakeDns": { "ipPool": "198.18.0.0/15", "poolSize": 32768 },
"inbounds": [{
"port": 1080,
"protocol": "socks",
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls", "fakedns"]
}
}]
}نکات
- یک رشتهٔ خام
8.8.8.8درservers[]کوتاهشده برای{"address": "8.8.8.8"}است —UnmarshalJSONدرNameServerConfig(infra/conf/dns.go:36-43) هر دو شکل را میپذیرد. address: "localhost"از حلکنندهٔ سیستمعامل استفاده میکند (در پلتفرمهایی با حلکنندهٔ stub مانند systemd-resolved مفید است).address: "tcp+local://..."از طریق TCP و با عبور از موتور مسیریابی پرسوجو میکند — برای حلکنندهٔ راهاندازی اولیه که بقیهٔ تنظیمات DNS به آن وابستهاند مفید است.- الگوهای
domains: رشتههای خام بهطور پیشفرض تطبیق پسوندی هستند؛ باfull:برای تطبیق دقیق،regexp:برای regex،keyword:برای زیررشته،geosite:برای دستهٔ GeoSite پیشوندگذاری کنید. expectedIPs/unexpectedIPsبا هم الگوی "رد پاسخهای مسمومشده" را پیادهسازی میکنند —expectedIPs: ["geoip:cn"]را روی حلکنندهٔ داخلی وunexpectedIPs: ["geoip:cn"]را روی حلکنندهٔ عمومی تنظیم کنید.clientIp(وclientIpper-server) گزینهٔ EDNS Client Subnet را تنظیم میکند. از مقدار واقعی (مثلاً یکی از IPهای خودتان) استفاده کنید تا پاسخهای آگاه از CDN دریافت کنید.finalQuery: trueیک سرور را بهعنوان پایانی علامت میزند — وقتی پاسخ دهد، هیچ جایگزینی اجرا نمیشود.
نکات بینهستهای
- sing-box از یک شِمای چندریختی سرور بر اساس نوع (
type: "https",type: "tls",type: "fakeip", …) به علاوهٔ قواعد DNS ساختاریافته باaction: "route"|"reject"|"predefined"استفاده میکند. ببینید DNS — sing-box. - mihomo از یک بلوک تخت
dns:با فهرستهای جداگانهٔnameserver/fallbackبه علاوهٔ نگاشت قدرتمندnameserver-policyبرای مسیریابی per-domain استفاده میکند. ببینید DNS — mihomo.
منبع: infra/conf/dns.go:18-247 · v1.260327.0 (d2758a0)
