跳轉到

ShadowDNS

ShadowDNS Logo

ShadowDNS 是一套權威 DNS 伺服器(authoritative DNS server),核心特色是 zone aliasing:以極低的記憶體成本服務大量備援網域(backup domain),同時對 client、BIND slave 與既有管理系統保持完全透明的相容性。

為什麼需要 ShadowDNS?

在 BIND 上服務大量備援網域時,每個備援網域在每個 view 都需要載入一份完整的 zone 副本。以典型的 split-horizon 部署為例 —— 3,000 個備援網域 × 7 個 view —— 記憶體中就存在約 21,000 份近乎相同的 zone 副本,彼此只差在 zone 名稱。以平均 zone 大小 10 KB 計算,這代表約 210 MB 不帶任何有效資訊的記憶體開銷。

ShadowDNS 透過 zone aliasing 消除這項浪費:

  • 只有 root domain 會完整載入記憶體。
  • 備援網域只是一個指向 root 的指標。
  • 對備援 zone 的查詢透過 in-bailiwick rewriting 即時改寫:回應看起來與載入完整備援 zone 完全相同,但伺服器只保留一份權威資料。

在參考部署中,相較於同等的 BIND master,記憶體用量約減少 80%

設計目標:透明相容

  • 查詢備援網域的 client 看不到任何回應差異。
  • 既有 BIND slave 照常透過 AXFR 接收 zone transfer。
  • 產生 named.conf 與 zone file 的管理系統不需任何修改 —— ShadowDNS 直接讀取既有設定檔。

與 BIND 的功能比較

功能 BIND (master) ShadowDNS
BIND named.conf drop-in 原生 Yes
RFC 1035 zone file 解析 Yes Yes
Split-horizon views Yes Yes
GeoIP country 比對 Yes Yes
GeoIP ASN 比對 Yes Yes
IP / CIDR 比對 Yes Yes
AXFR Yes Yes
NOTIFY Yes Yes
Wildcard records (RFC 4592) Yes Yes
Zone aliasing(備援網域) No Yes
Hot reload (SIGHUP) Yes Yes
Prometheus metrics No Yes
Grafana dashboard(內建) No Yes
IXFR Yes No
DNSSEC Yes No
IPv6 listener Yes Yes
DNS Cookies (RFC 7873) Yes Yes
Response Rate Limiting (RRL) Yes Yes
EDNS Client Subnet (ECS, RFC 7871) No Yes(opt-in,--ecs-enable,預設關閉)
Query logging(BIND 格式) Yes Yes
CNAME Flattening(外部 target) No No
In-bailiwick CNAME Flattening No Planned
回應端 CNAME 鏈收合 No Yes(per alias group opt-in,預設關閉)
Dynamic Update Yes No
Recursion 可設定 永遠關閉

專案狀態

ShadowDNS 目前為 v0.x 實驗階段,尚未部署到正式環境。切換正式流量前,計劃先以正式環境規模的資料集(7 個 view、12,000+ 個 zone file)完成整合測試。

下一步