開啟 3 天免費試用
註冊即可免費體驗全部高級功能。
*只限新用戶;每位用戶只可獲得一次試用。


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 會改變其他撥號欄位的適用性。
- 復原時須配對二進制、設定檔及服務設定。
先按自建維護責任清單確認有效檔案由誰產生。若由 GUI、面板、訂閱或生成器管理,採其支援的遷移方式,並查核設定更新如何傳至客戶端。會被覆寫的本機改動不算持久遷移。
核心與客戶端職責說明可區分格式擁有權與介面設定。換 DNS 上游不證明 TUN 或系統代理已傳送預期流量。無關啟動問題可循裝置及應用程式排查次序處理。
準備私密工作目錄、空閒回環連接埠 1053、Ubuntu dnsutils 的 dig,以及獨立放於 /opt/sing-box-1.14.3/sing-box 的官方目標程式。使用前核對發行檔的平台及官方完整性資料。不要覆寫運作中的程式,也不下載後直接執行遠端安裝指令碼;如需解釋歷史檔案,私下保留原有配對程式。
記錄實際程式路徑與版本、有效設定及 include 目錄、單元和 drop-in、服務身份、擁有者、權限及啟用狀態。備份放在有效 include 樹以外,避免服務意外載入。改動服務前確認獨立復原通道。
以下輸入刻意沒有額外規則、快取調校、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]
逐項理解對照,不作全域文字取代;相同名稱在不同物件內可能控制不同決策。
| 歷史輸入 | typed 目標 | 必須維持的含義 |
|---|---|---|
address: 1.1.1.1 | type: udp、數字 server、53 | 引導端點可不經另一次域名解析而連接 |
address 的 HTTPS URL | type: https、server、443、path | 主機名稱、路徑及驗證的 TLS 身份符合服務 |
address_resolver: bootstrap | domain_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]
只有已保留相應程式時,才檢查舊範例。舊版本若因棄用限制拒絕,不繞過安全門,也不為了測試在正式主機安裝它。重要的目標核對使用獨立準備的 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 可能使用其他解析器,不能核實此程式。私下記錄觀察;本文沒有虛構命令輸出。
使用私密副本,每次只改一個條件。只按 Ctrl-C 停止自己的前台程式,再執行選定副本。各次檢查之間復原已知正常檔案,不改共用防火牆或系統 DNS。
| 讀者核對 | 預期現象 | 處理方法 |
|---|---|---|
| 正常目標,分別發 UDP 及 TCP 查詢 | 經選定 DNS 路徑取得回應 | 分查綁定、上游存取、TLS 及日誌 |
| 副本的 HTTPS 指向未使用本機連接埠 | 格式即使獲接受,真實查詢仍失敗 | 復原端點,不削弱 TLS 或加入隱藏後備 |
domain_resolver 改用不存在標籤 | 設定檢查或啟動拒絕引用 | 先修正引用再查詢 |
secure-dns 透過自己解析自身名稱 | 遭拒或解析失敗,不是有效引導 | 恢復獨立數字位址引導,不依賴固定錯誤字句 |
| 目標程式讀取舊範例 | legacy 格式遭拒 | 使用已映射目標,不繞過棄用限制 |
| 重新啟動未修改的有效目標 | 新查詢恢復正常 | 與私密基準比較程式、檔案及權限 |
上游中斷可能看似遷移錯誤。須分清格式拒絕、socket 綁定、名稱引導、TLS 與答案策略。這些是預期條件,並非作者實測;一次逾時不證明特定原因。
隔離檢查完成後,用現有擁有者支援的部署程序,將服務指向目標程式及已驗證檔案。重查身份、必要憑證讀取、單元命令與 include 路徑。以服務身份檢查有效設定,在維護時段只重啟獲准單元,查看有限日誌,再經實際入口重複明確查詢。
復原時先停止改動後服務,還原保存的程式或準確套件、設定及 includes、擁有者、單元和 drop-in,以及原啟用狀態。單元有變便執行 sudo systemctl daemon-reload。以還原的配對程式檢查,按舊狀態啟動,查看狀態和日誌,再做原基準查詢。只還原 JSON 而保留不相容核心並不足夠。
回退歷史版本只是臨時事故控制,仍須考慮安全支援與公告。不能無限期保留 legacy 正式部署,應安排受支援遷移。隔離練習完成時 Ctrl-C 停止自己的程式,確認 1053 釋放。未改客戶端系統 DNS,因此沒有全網路由器 DNS 切換需要撤回。
不可以。移除界線是 1.14.0,應改用 typed server,而非繞過舊格式限制。[2]
address_resolver 能一律直接改名嗎?須按所在 server 及撥號語境映射。全域取代不能自動保留代理擁有權或查詢策略。
規則及最終選擇會引用它。改名須更新所有相關引用;名稱不變仍要核對角色正確。
建立 HTTPS 連接前先要解析上游名稱。若依賴同一未能建立的連接,就形成循環。
detour: direct?不是。預設已直連;啟用 detour 會改變其他撥號欄位的適用性,還要核對所選出站的解析器。[3][4]
sing-box check 能證明 DNS 正常嗎?不能。它檢查設定;真實查詢、答案策略、上游連接及重啟行為要各自觀察。
與維護者遷移源設定或支援的範本。手改生成輸出並不能建立持久擁有權。
免責聲明:只操作獲授權主機及網絡,遵守適用法例和政策。本文是文件支持的步驟與讀者核對標準,並非部署紀錄或效能保證。
來源:
Sources checked 2026 年 10 月 11 日。
延伸閱讀:
註冊即可免費體驗全部高級功能。
*只限新用戶;每位用戶只可獲得一次試用。