Skip to content

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 پاسخ جغرافیایی نزدیک‌تری بازگردانند.
tagstringdns<inbound tag>تگ داخلی برای ورودی موتور DNS. توسط قواعد مسیریابی که می‌خواهند ترافیک DNS را جدا کنند استفاده می‌شود.
queryStrategystringUseIPUseIP | UseIPv4 | UseIPv6استراتژی پرس‌وجوی پیش‌فرض زمانی که استراتژی per-server تنظیم نشده باشد. `UseIP` هر دو A و AAAA را پرس‌وجو می‌کند؛ `UseIPv4`/`UseIPv6` خانوادهٔ دیگر را رد می‌کند.
disableCacheboolfalsetrue | falseغیرفعال کردن کش پاسخ در حافظه. هر پرس‌وجو به‌صورت تازه ارسال می‌شود.
serveStaleboolfalsetrue | falseارائهٔ ورودی‌های کش‌شدهٔ منقضی در حالی که تازه‌سازی در پس‌زمینه اجرا می‌شود. تأخیر درک‌شده را بهبود می‌بخشد.
serveExpiredTTLuint320<seconds>حداکثر ثانیه‌هایی که یک ورودی منقضی هنگام فعال بودن `serveStale` ارائه می‌شود. 0 یعنی بدون محدودیت.
disableFallbackboolfalsetrue | falseاگر سرور اول پاسخ قابل استفاده‌ای بازنگرداند به سرورهای بعدی رجوع نکن.
disableFallbackIfMatchboolfalsetrue | falseهمان، اما فقط زمانی که سرور تطبیق‌یافته خود فهرست `domains` داشته باشد — یعنی سرورهای تطبیق‌یافته با دامنه هرگز جایگزین را راه‌اندازی نمی‌کنند.
enableParallelQueryboolfalsetrue | falseهمهٔ سرورهای تطبیق‌یافته را به‌صورت موازی پرس‌وجو کن؛ اولین پاسخ معتبر برنده است.
useSystemHostsboolfalsetrue | 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.
portuint1653<port>پورت سرور (فقط برای آدرس‌های IP خام).
skipFallbackboolfalsetrue | falseوقتی true باشد و این سرور پاسخی برنگرداند، زنجیرهٔ جایگزین آزمایش *نمی‌شود* — پرس‌وجو صرفاً شکست می‌خورد.
domains[]string[]<domain pattern>دامنه‌هایی که این سرور باید پاسخ دهد. نحو همانند قواعد مسیریابی است. اگر غیرخالی باشد، سرور فقط برای این دامنه‌ها مشورت می‌شود.
expectedIPsStringList[]<IP / CIDR / geoip:>پاسخ این سرور را فقط زمانی بپذیر که IP حل‌شده با یکی از این الگوها تطبیق داشته باشد. برای فیلتر کردن پاسخ‌های سانسورشده یا ربوده‌شده استفاده می‌شود.
expectIPsStringList(alias)(alias of expectedIPs)نام مستعار سازگاری برای `expectedIPs`.
queryStrategystring(inherit)UseIP | UseIPv4 | UseIPv6بازنویسی استراتژی per-server.
tagstring(unset)<string>تگ سرور — توسط قواعد مسیریابی که ترافیک خروجی حل‌کننده را مسیریابی می‌کنند ارجاع می‌شود.
timeoutMsuint644000<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.
finalQueryboolfalsetrue | falseاین سرور را به‌عنوان جایگزین نهایی علامت بزن — اگر پاسخ دهد، حل بیشتری انجام نمی‌شود.
unexpectedIPsStringList[]<IP / CIDR / geoip:>پاسخ این سرور را اگر IP حل‌شده با هر یک از این الگوها تطبیق داشته باشد رد کن. مکمل `expectedIPs`.

منبع: infra/conf/dns.go:18-34 · ثابت‌شده در v1.260327.0 (d2758a0)

hosts

فیلد hosts یک نگاشت تخت است. کلیدها از همان پیشوندهای قواعد مسیریابی پشتیبانی می‌کنند؛ مقادیر یا یک IP واحد یا آرایه‌ای از IPها هستند.

json
{
  "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:

json
{
  "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:

json
{
  "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"] را روی حل‌کنندهٔ عمومی تنظیم کنید.
  • clientIpclientIp per-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)

Core Tutorial اثر Argsment