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:160-173 · ثابتشده در v26.9.9 (52a412d)
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 | StringList | [] | <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:19-35 · ثابتشده در v26.9.9 (52a412d)
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یک سرور را بهعنوان پایانی علامت میزند — وقتی پاسخ دهد، هیچ جایگزینی اجرا نمیشود.
خروجی dns
متمایز از بلوک dns بالا، Xray یک خروجی dns فراهم میکند ("protocol": "dns"). ترافیک DNS را به آن مسیریابی کنید و یا هر پرسوجو را به یک حلکنندهٔ ثابت ارسال میکند یا بر اساس یک فهرست قاعده به آن پاسخ میدهد: فیلدهای بازنویسی مقصد و یک موتور rules دارد، و کلیدهای nonIPQuery / blockTypes به نفع rules منسوخ شدهاند.
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
rewriteNetwork | Network | (unset) | tcp | udp | tcp,udp | ترابردی که پرسوجوها به آن بازنویسی میشوند. نام متعارف برای network قدیمی. |
rewriteAddress | *Address | (unset) | <host> | حلکنندهای که پرسوجوهای DNS رهگیریشده به آن بازنویسی میشوند. نام متعارف برای address قدیمی. |
rewritePort | uint16 | 0 | <port> | پورتی که پرسوجوها به آن بازنویسی میشوند. نام متعارف برای port قدیمی. |
network | Network | (alias) | (alias of rewriteNetwork) | نام مستعار قدیمی برای rewriteNetwork. |
address | *Address | (alias) | (alias of rewriteAddress) | نام مستعار قدیمی برای rewriteAddress. |
port | uint16 | (alias) | (alias of rewritePort) | نام مستعار قدیمی برای rewritePort. |
userLevel | uint32 | 0 | <uint32> | سطح policy اعمالشده به اتصالهای این خروجی. |
rules | []*DNSOutboundRuleConfig | (unset) | [DNSOutboundRuleConfig] | قواعد به ازای هر پرسوجو که به ترتیب ارزیابی میشوند؛ اولین تطبیق تصمیم میگیرد پرسوجو چگونه مدیریت شود. |
nonIPQuery | *string | (legacy) | reject | drop | skip | مدیریت قدیمی پرسوجوهای غیر-IP. به نفع rules منسوخ شده و نمیتوان آن را با آن ترکیب کرد. |
blockTypes | *[]int32 | (legacy) | [<qType number>] | فهرست قدیمی شمارههای نوع پرسوجوی DNS برای مسدودسازی. به نفع rules منسوخ شده است. |
منبع: infra/conf/dns_proxy.go:60-71 · ثابتشده در v26.9.9 (52a412d)
rules[]
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
action | string | (required) | direct | drop | return | hijack | با یک پرسوجوی تطبیقیافته چه کنیم. direct آن را بدون تغییر ارسال میکند؛ drop آن را دور میاندازد؛ return بهصورت محلی با rCode پاسخ میدهد؛ hijack آن را به سرور بازنویسی هدایت میکند. |
qType | *PortList | (any) | <DNS type number / range> | تطبیق این انواع پرسوجوی DNS بر اساس شماره (1 = A، 28 = AAAA، 65 = HTTPS، …). فهرستهای کاما/بازه را میپذیرد. |
domain | *StringList | (any) | <domain pattern> | تطبیق این دامنهها (بهطور پیشفرض زیررشته؛ همان پیشوندهای الگوی قواعد مسیریابی). |
rCode | uint32 | 0 | 0-65535 | کد پاسخی که وقتی action برابر return است بازگردانده میشود (مثلاً 5 = REFUSED، 3 = NXDOMAIN). |
منبع: infra/conf/dns_proxy.go:13-18 · ثابتشده در v26.9.9 (52a412d)
ربودن A/AAAA به یک حلکنندهٔ ثابت، اسقاط جستجوهای رکورد HTTPS (نوع 65) و رد کردن هر چیز دیگر:
{
"outbounds": [
{
"tag": "dns-out",
"protocol": "dns",
"settings": {
"rewriteAddress": "1.1.1.1",
"rewritePort": 53,
"rewriteNetwork": "udp",
"rules": [
{ "action": "hijack", "qType": "1,28" },
{ "action": "drop", "qType": "65" },
{ "action": "return", "rCode": 5 }
]
}
}
]
}nonIPQuery و blockTypes را نمیتوان با rules ترکیب کرد — انجام این کار یک خطای راهاندازی است. پیکربندیهای قدیمی را به rules مهاجرت دهید.
نکات بینهستهای
- 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:19-173 · v26.9.9 (52a412d)
