sing-box DNS 遷移:更換舊欄位並核對解析引導及回退

sing-box DNS 遷移:更換舊欄位並核對解析引導及回退

Marcus Reid
2026年10月11日· 6 分鐘讀完

sing-box DNS 遷移除了更換 server 格式,還要維持原有解析及路由行為。本文在 Ubuntu 24.04 LTS amd64 上,把 sing-box 1.13.21 歷史輸入的一個 UDP 引導及一個 HTTPS 上游,映射至 1.14.3。legacy DNS server 已於 1.14.0 移除;舊版本用來解釋輸入,並非長期運作建議。作者未完成端對端實測。[1][2][6][7]

關鍵要點

  • 保留標籤、引導依賴與路由意圖,不能只確認 JSON 有效。
  • 使用域名的 HTTPS 上游需要獨立的域名解析器。
  • typed DNS 預設直連,明確設定 detour 會改變其他撥號欄位的適用性。
  • 復原時須配對二進制、設定檔及服務設定。

誰擁有這次 sing-box DNS 遷移的設定?

先按自建維護責任清單確認有效檔案由誰產生。若由 GUI、面板、訂閱或生成器管理,採其支援的遷移方式,並查核設定更新如何傳至客戶端。會被覆寫的本機改動不算持久遷移。

核心與客戶端職責說明可區分格式擁有權與介面設定。換 DNS 上游不證明 TUN 或系統代理已傳送預期流量。無關啟動問題可循裝置及應用程式排查次序處理。

準備私密工作目錄、空閒回環連接埠 1053、Ubuntu dnsutils 的 dig,以及獨立放於 /opt/sing-box-1.14.3/sing-box 的官方目標程式。使用前核對發行檔的平台及官方完整性資料。不要覆寫運作中的程式,也不下載後直接執行遠端安裝指令碼;如需解釋歷史檔案,私下保留原有配對程式。

記錄實際程式路徑與版本、有效設定及 include 目錄、單元和 drop-in、服務身份、擁有者、權限及啟用狀態。備份放在有效 include 樹以外,避免服務意外載入。改動服務前確認獨立復原通道。

步驟 1:盤點 sing-box 舊 DNS 設定的依賴

以下輸入刻意沒有額外規則、快取調校、FakeIP、查詢過濾或 strategy 覆蓋。存為私密練習目錄的 dns-old.json。它是說明用範例,不是取代既有部署的命令。

{
  "dns": {
    "servers": [
      {
        "tag": "bootstrap",
        "address": "1.1.1.1",
        "detour": "direct"
      },
      {
        "tag": "secure-dns",
        "address": "https://dns.google/dns-query",
        "address_resolver": "bootstrap",
        "detour": "direct"
      }
    ],
    "final": "secure-dns"
  },
  "inbounds": [
    {
      "type": "direct",
      "tag": "dns-test",
      "listen": "127.0.0.1",
      "listen_port": 1053
    }
  ],
  "outbounds": [
    {
      "type": "direct",
      "tag": "direct"
    }
  ],
  "route": {
    "rules": [
      {
        "inbound": [
          "dns-test"
        ],
        "action": "hijack-dns"
      }
    ],
    "final": "direct"
  }
}

bootstrap 解析 secure-dns 的主機名稱;後者處理 dns.final 選中的查詢。direct 入站省略 network 時,在回環同時接受 TCP 與 UDP,入站專屬路由動作把請求交予 DNS。它不提供公網解析,也不捕獲系統全部 DNS。[5][9]

處理真實檔案前,列出全部 server tag,以及 DNS 規則、final、路由選項和出站撥號器的引用。記錄數字位址、域名上游與代理路徑。標籤存在仍可能角色錯誤。如另有 strategy 或過濾,停止套用這個最小範例,按官方指南分別遷移其策略語義。[1]

步驟 2:對照欄位及 sing-box 域名解析器用途

逐項理解對照,不作全域文字取代;相同名稱在不同物件內可能控制不同決策。

歷史輸入typed 目標必須維持的含義
address: 1.1.1.1type: udp、數字 server、53引導端點可不經另一次域名解析而連接
address 的 HTTPS URLtype: https、server、443、path主機名稱、路徑及驗證的 TLS 身份符合服務
address_resolver: bootstrapdomain_resolver: bootstrap不依賴上游自己的連接才能解析其名稱
server tag 與 dns.final保留字串全部引用仍選擇原本需要的上游
本輸入的 detour: direct本目標省略使用 typed server 文件列明的預設直連
其他 strategy 或查詢策略按實際情況處理答案選擇及過濾語義須獨立核對

typed UDP 及 HTTPS 預設直接撥號,legacy 則可能繼承預設出站。本例舊上游明確選 direct,因此省略 detour 保留原意。若原來經代理,不可為了貼近示例而刪除 detour;先追蹤出站及引導。啟用 detour 會把撥號交予其出站,其他撥號欄位遭忽略;旁邊放一個 domain_resolver 不會自動設定該出站的解析器。[3][4][8]

將對照結果存為 dns-new.json:

{
  "dns": {
    "servers": [
      {
        "type": "udp",
        "tag": "bootstrap",
        "server": "1.1.1.1",
        "server_port": 53
      },
      {
        "type": "https",
        "tag": "secure-dns",
        "server": "dns.google",
        "server_port": 443,
        "path": "/dns-query",
        "domain_resolver": "bootstrap",
        "tls": {
          "enabled": true,
          "server_name": "dns.google",
          "insecure": false
        }
      }
    ],
    "final": "secure-dns"
  },
  "inbounds": [
    {
      "type": "direct",
      "tag": "dns-test",
      "listen": "127.0.0.1",
      "listen_port": 1053
    }
  ],
  "outbounds": [
    {
      "type": "direct",
      "tag": "direct"
    }
  ],
  "route": {
    "rules": [
      {
        "inbound": [
          "dns-test"
        ],
        "action": "hijack-dns"
      }
    ],
    "final": "direct"
  }
}

以域名連接的 HTTPS 上游明確指定獨立 UDP 引導,保留 TLS 驗證。TLS 只保護 HTTPS 一段,UDP 引導未加密。公用上游用來示範依賴分離,不保證私隱、可用性、延遲或地區連通性。[4]

步驟 3:在隔離程式檢查目標

只有已保留相應程式時,才檢查舊範例。舊版本若因棄用限制拒絕,不繞過安全門,也不為了測試在正式主機安裝它。重要的目標核對使用獨立準備的 1.14.3:

/PRIVATE/BACKUP/sing-box-1.13.21 check -c dns-old.json
/opt/sing-box-1.14.3/sing-box version
/opt/sing-box-1.14.3/sing-box check -c dns-new.json
/opt/sing-box-1.14.3/sing-box run -c dns-new.json

以一般用戶在前台執行;1053 不需要低連接埠權限。練習檔案權限設為 600。回環 1053 被佔用時,停止並一致改用空閒高連接埠,不終止擁有者程式。check 通過只確認格式接受,執行中程式與真實查詢則是另兩層證據。

從另一終端機明確指定端點查詢:

dig @127.0.0.1 -p 1053 example.com A
dig @127.0.0.1 -p 1053 example.com AAAA
dig @127.0.0.1 -p 1053 example.com A +tcp

查看 DNS 狀態、記錄類型、答案及顯示的伺服器。域名沒有 IPv6 記錄時,成功回應亦未必有 AAAA 答案。瀏覽器或不指定上游的 dig 可能使用其他解析器,不能核實此程式。私下記錄觀察;本文沒有虛構命令輸出。

步驟 4:換服務前驗證失敗情況

使用私密副本,每次只改一個條件。只按 Ctrl-C 停止自己的前台程式,再執行選定副本。各次檢查之間復原已知正常檔案,不改共用防火牆或系統 DNS。

讀者核對預期現象處理方法
正常目標,分別發 UDP 及 TCP 查詢經選定 DNS 路徑取得回應分查綁定、上游存取、TLS 及日誌
副本的 HTTPS 指向未使用本機連接埠格式即使獲接受,真實查詢仍失敗復原端點,不削弱 TLS 或加入隱藏後備
domain_resolver 改用不存在標籤設定檢查或啟動拒絕引用先修正引用再查詢
secure-dns 透過自己解析自身名稱遭拒或解析失敗,不是有效引導恢復獨立數字位址引導,不依賴固定錯誤字句
目標程式讀取舊範例legacy 格式遭拒使用已映射目標,不繞過棄用限制
重新啟動未修改的有效目標新查詢恢復正常與私密基準比較程式、檔案及權限

上游中斷可能看似遷移錯誤。須分清格式拒絕、socket 綁定、名稱引導、TLS 與答案策略。這些是預期條件,並非作者實測;一次逾時不證明特定原因。

步驟 5:啟用目標並配對復原

隔離檢查完成後,用現有擁有者支援的部署程序,將服務指向目標程式及已驗證檔案。重查身份、必要憑證讀取、單元命令與 include 路徑。以服務身份檢查有效設定,在維護時段只重啟獲准單元,查看有限日誌,再經實際入口重複明確查詢。

復原時先停止改動後服務,還原保存的程式或準確套件、設定及 includes、擁有者、單元和 drop-in,以及原啟用狀態。單元有變便執行 sudo systemctl daemon-reload。以還原的配對程式檢查,按舊狀態啟動,查看狀態和日誌,再做原基準查詢。只還原 JSON 而保留不相容核心並不足夠。

回退歷史版本只是臨時事故控制,仍須考慮安全支援與公告。不能無限期保留 legacy 正式部署,應安排受支援遷移。隔離練習完成時 Ctrl-C 停止自己的程式,確認 1053 釋放。未改客戶端系統 DNS,因此沒有全網路由器 DNS 切換需要撤回。

總結

  • 逐一對照上游類型、端點、標籤、解析器與撥號路徑。
  • 向明確回環入口發出真實查詢及受控反例。
  • 程式、設定與服務配置須共同部署及復原。

常見問題(FAQ)

1.14.3 可繼續保留 legacy server 嗎?

不可以。移除界線是 1.14.0,應改用 typed server,而非繞過舊格式限制。[2]

address_resolver 能一律直接改名嗎?

須按所在 server 及撥號語境映射。全域取代不能自動保留代理擁有權或查詢策略。

為何保留標籤?

規則及最終選擇會引用它。改名須更新所有相關引用;名稱不變仍要核對角色正確。

HTTPS 為何需要引導解析器?

建立 HTTPS 連接前先要解析上游名稱。若依賴同一未能建立的連接,就形成循環。

typed server 是否都保留 detour: direct?

不是。預設已直連;啟用 detour 會改變其他撥號欄位的適用性,還要核對所選出站的解析器。[3][4]

sing-box check 能證明 DNS 正常嗎?

不能。它檢查設定;真實查詢、答案策略、上游連接及重啟行為要各自觀察。

生成器覆寫新檔案怎麼辦?

與維護者遷移源設定或支援的範本。手改生成輸出並不能建立持久擁有權。

免責聲明:只操作獲授權主機及網絡,遵守適用法例和政策。本文是文件支持的步驟與讀者核對標準,並非部署紀錄或效能保證。

來源:

  1. sing-box DNS migration guide — https://sing-box.sagernet.org/migration/
  2. sing-box legacy DNS server — https://sing-box.sagernet.org/configuration/dns/server/legacy/
  3. sing-box UDP DNS server — https://sing-box.sagernet.org/configuration/dns/server/udp/
  4. sing-box HTTPS DNS server — https://sing-box.sagernet.org/configuration/dns/server/https/
  5. sing-box route rule actions — https://sing-box.sagernet.org/configuration/route/rule_action/
  6. sing-box 1.14.3 release — https://github.com/SagerNet/sing-box/releases/tag/v1.14.3
  7. sing-box 1.13.21 historical release — https://github.com/SagerNet/sing-box/releases/tag/v1.13.21
  8. sing-box shared dial fields — https://sing-box.sagernet.org/configuration/shared/dial/
  9. sing-box direct inbound — https://sing-box.sagernet.org/configuration/inbound/direct/

Sources checked 2026 年 10 月 11 日。

延伸閱讀:

開啟 3 天免費試用

註冊即可免費體驗全部高級功能。

*只限新用戶;每位用戶只可獲得一次試用。

sing-box DNS 遷移:更換舊欄位並核對解析引導及回退 | AethoVPN