Skip to content

DNS — sing-box

موتور DNS sing-box فهرستی از سرورهای نوع‌دار به‌علاوهٔ یک زنجیرهٔ قاعدهٔ ساختاریافته است. هر سرور یک type دارد که ترابرد آن را انتخاب می‌کند (UDP، TLS، HTTPS، فایل hosts، مخزن fake-ip، تأمین‌شده توسط DHCP، systemd-resolved، Tailscale تعبیه‌شده). قواعد از همان مجموعه‌فیلد تطبیق قواعد مسیریابی استفاده می‌کنند اما با کنش‌های ویژهٔ DNS.

گزینه‌های سطح بالا

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
servers[]DNSServerOptions[][DNSServerOptions]فهرست سرور DNS. هر ورودی یک `type` (local، udp، tls، https، h3، dhcp، fakeip، hosts، resolved، tailscale) و مجموعهٔ گزینه‌های متناظر دارد.
rules[]DNSRule[][DNSRule]قواعد مسیریابی در سطح DNS. شکل یکسانی با قواعد مسیریابی دارند اما با مجموعهٔ کنش‌های ویژهٔ DNS.
finalstring(unset)<server tag>سرور DNS پیش‌فرض وقتی هیچ قاعده‌ای تطبیق نمی‌یابد. مقدار خالی به اولین سرور در `servers[]` بازگشت می‌کند.
reverse_mappingboolfalsetrue | falseنگه‌داری نگاشت معکوس (IP → دامنه) تا قواعد بتوانند پس از این‌که اتصالی مقصد را به IP حل کرد، روی دامنهٔ اصلی تطبیق دهند.

منبع: option/dns.go:21-27 · ثابت‌شده در v1.13.11 (553cfa1)

به علاوهٔ DNSClientOptions تعبیه‌شده:

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
strategyDomainStrategy(prefer_ipv4)prefer_ipv4 | prefer_ipv6 | ipv4_only | ipv6_onlyاولویت پیش‌فرض خانوادهٔ آدرس.
disable_cacheboolfalsetrue | falseغیرفعال‌سازی کش پاسخ درون‌حافظه.
disable_expireboolfalsetrue | falseورودی‌های کش‌شده را بر اساس TTL بیرون نراند — آن‌ها را برای همیشه نگه دار.
independent_cacheboolfalsetrue | falseاستفاده از کش جداگانه برای هر برچسب سرور (به‌جای یک کش سراسری).
cache_capacityuint32(unbounded)<int>حداکثر ورودی‌های کش‌شده. مقدار ۰ سقف را غیرفعال می‌کند.
client_subnet*badoption.Prefixable(unset)<CIDR>ECS (EDNS Client Subnet) که در پرس‌وجوهای خروجی اعلان می‌شود.

منبع: option/dns.go:105-112 · ثابت‌شده در v1.13.11 (553cfa1)

انواع سرور

هر ورودی در servers[] یک فیلد type دارد. فیلدهای تطبیق:

type: "local"

حل‌وفصل از طریق حل‌کنندهٔ سیستم‌عامل (در macOS/iOS که حل‌کنندهٔ سیستم مسیر معتبر است مفید است). برای انتخاب حل‌کنندهٔ گو بدون CGO، prefer_go را اضافه می‌کند.

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
prefer_goboolfalsetrue | falseاستفاده از net.Resolver گو (بدون CGO) به‌جای حل‌کنندهٔ بومی پلتفرم. در سیستم‌هایی که حل‌کنندهٔ بومی شکسته یا نرخ‌محدود است مفید است.

منبع: option/dns.go:376-379 · ثابت‌شده در v1.13.11 (553cfa1)

type: "udp" و type: "tcp" — RemoteDNSServerOptions

json
{ "type": "udp", "tag": "local-udp", "server": "8.8.8.8", "server_port": 53 }
فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
serverstring(required)<host>نام میزبان یا IP سرور.
server_portuint1653 (udp/tcp), 853 (tls), 443 (https/h3)<port>پورت سرور.

منبع: option/dns.go:332-335 · ثابت‌شده در v1.13.11 (553cfa1)

type: "tls" — DNS-over-TLS

همان فیلدهای udp/tcp به‌علاوهٔ بلوک استاندارد tls:.

type: "https" و type: "h3" — DNS-over-HTTPS / -H3

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
pathstring/dns-query/<path>مسیر نقطه‌انتهایی DoH.
methodstringPOSTPOST | GETروش HTTP استفاده‌شده برای پرس‌وجوهای DoH.
headersbadoption.HTTPHeader{}{<header>: <value>}هدرهای HTTP اضافی.

منبع: option/dns.go:394-399 · ثابت‌شده در v1.13.11 (553cfa1)

type: "hosts" — فایل hosts محلی

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
pathbadoption.Listable[string][/etc/hosts][<file path>]فهرست مسیرهای فایل hosts برای ادغام.
predefined*badjson.TypedMap[string, badoption.Listable[netip.Addr]]{}{<domain>: [<IP>]}جدول hosts درون‌خطی. اولویت بالاتری نسبت به `path` دارد.

منبع: option/dns.go:363-366 · ثابت‌شده در v1.13.11 (553cfa1)

type: "fakeip"

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
inet4_range*badoption.Prefix(required for v4)<CIDR>محدودهٔ CIDR IPv4 اختصاص‌یافته برای IPهای جعلی.
inet6_range*badoption.Prefix(required for v6)<CIDR>محدودهٔ CIDR IPv6 اختصاص‌یافته برای IPهای جعلی.

منبع: option/dns.go:401-404 · ثابت‌شده در v1.13.11 (553cfa1)

type: "dhcp"

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
interfacestring(auto)<interface>رابطی که حل‌کننده‌های ارائه‌شده توسط DHCP آن استفاده می‌شوند.

منبع: option/dns.go:406-409 · ثابت‌شده در v1.13.11 (553cfa1)

انواع دیگر

  • type: "resolved" — خواندن سرورهای نام per-link از systemd-resolved (فقط Linux).
  • type: "tailscale" — استفاده از حل‌کنندهٔ MagicDNS دیمن Tailscale.
  • type: "predefined" — بازگشت مجموعهٔ پاسخ کدشده.
  • type: "rcode" — بازگشت یک RCODE ثابت (NOERROR / NXDOMAIN / SERVFAIL …).

قواعد DNS

قواعد DNS از همان شکل چندریختی _Rule قواعد مسیریابی استفاده می‌کنند (type: "default" یا type: "logical") و همان مجموعهٔ ۴۳ کلید تطبیق در RawDefaultDNSRule. تفاوت‌ها در سطح کنش است:

کنش DNSمعنا
route (پیش‌فرض)ارسال پرس‌وجو به server: "<tag>". فیلدهای اختیاری: strategy، disable_cache، rewrite_ttl، client_subnet.
route-optionsاعمال گزینه‌های DNS-route روی تطبیق‌های بعدی قاعده.
rejectحذف پرس‌وجو. با method: "default" (NXDOMAIN) یا method: "drop" (بدون پاسخ).
predefinedبازگشت یک پاسخ کدشده (مجموعهٔ رکورد یا RCODE).

مثال‌ها

تقسیم دو سروری — داخلی روی DoH محلی، بقیه روی DoH Cloudflare:

json
{
  "dns": {
    "servers": [
      { "type": "https", "tag": "local",
        "server": "doh.pub", "path": "/dns-query" },
      { "type": "https", "tag": "remote",
        "server": "cloudflare-dns.com", "path": "/dns-query",
        "detour": "proxy" },
      { "type": "fakeip", "tag": "fakeip",
        "inet4_range": "198.18.0.0/15",
        "inet6_range": "fc00::/18" }
    ],
    "rules": [
      { "rule_set": ["geosite-cn"], "server": "local" },
      { "outbound": "any", "server": "remote" }
    ],
    "final": "remote",
    "strategy": "prefer_ipv4"
  }
}

مسدودسازی تبلیغات از طریق DNS:

json
{
  "dns": {
    "servers": [
      { "type": "https", "tag": "main",
        "server": "cloudflare-dns.com" }
    ],
    "rules": [
      {
        "domain_keyword": ["ads", "doubleclick", "googlesyndication"],
        "action": "reject",
        "method": "default"
      }
    ],
    "final": "main"
  }
}

نکات

  • گزینهٔ سطح بالای قدیمی fakeip: {...} منسوخ‌شده است — به‌جای آن از یک ورودی سرور type: "fakeip" استفاده کنید. sing-box پیکربندی‌های قدیمی را در زمان بارگذاری به‌طور خودکار مهاجرت می‌دهد اما هشدار منسوخ‌شدن صادر می‌کند.
  • reverse_mapping: true به قواعد مسیریابی بعدی اجازه می‌دهد حتی پس از این‌که اسنیف، مقصد را به IP حل کرده، روی نام دامنه تطبیق دهند. هنگام استفاده از fake-ip در کنار قواعد دامنهٔ پیچیده، ضروری است.
  • independent_cache: true وقتی سرورهایی دارید که برای یک دامنه پاسخ‌های واقعاً متفاوتی برمی‌گردانند (حل‌کنندگان split-horizon) مفید است.
  • قواعد DNS و قواعد مسیریابی یک واژگان مشترک کلید تطبیق دارند اما در زمان‌های متفاوت عمل می‌کنند: قواعد DNS روی پرس‌وجوی حل‌کننده اجرا می‌شوند؛ قواعد مسیریابی روی اتصال نهایی اجرا می‌شوند.
  • type: "resolved" از D-Bus API systemd-resolved می‌خواند — فقط روی سیستم‌های Linux که resolved واقعاً حل‌کنندهٔ در حال اجرا است کار می‌کند.

نکات بین‌هسته‌ای

  • Xray-core از یک بلوک تخت dns: با servers[] حامل رشته‌های URL (یا اشیاء NameServerConfig) استفاده می‌کند — بدون فیلد type، اسکیمای URL ترابرد را تعیین می‌کند. بنگرید به DNS — Xray-core.
  • mihomo یک بلوک ۲۵ فیلدی dns: با فهرست‌های جداگانهٔ nameserver / fallback و یک نگاشت nameserver-policy دارد. بنگرید به DNS — mihomo.

منبع: option/dns.go:21-409 · v1.13.11 (553cfa1)

Core Tutorial اثر Argsment