本文目錄
IPAM 管的是 IP 位址,但大家平常記得、連線時用的是名稱。jt-ipam 整合 DNS 伺服器的目的,就是把 DNS 上的記錄和 IPAM 的位址資料對起來:在 IPAM 查到一個 IP,就能看到它對應的 FQDN 或主機名稱;反過來 DNS 上的記錄指向哪個位址、那個位址在 IPAM 裡有沒有登記,也查得到。
公司裡的 DNS 很少只有一台。主從架構靠區域傳送(Zone Transfer)複寫,AD 環境每台 DC 各有一份。照理說這幾台的內容應該一模一樣,但實務上常遇到兩種狀況:一種是複寫斷了沒人發現,主要伺服器一切正常,次要伺服器卻停在舊資料;另一種是兩台各自獨立、沒有複寫的 DNS 伺服器,靠人工在兩邊做一樣的設定,某次改記錄時忘了改其中一台。
使用者查到的結果時好時壞,通常要等有人抱怨才開始查。以前要確認,只能自己寫腳本對每台 dig 再比對,或是乾脆不檢查。
既然各台 DNS 伺服器的記錄都已經拉回 jt-ipam,這次就加上「DNS 比對群組」:把內容應該一致的 DNS 伺服器放進同一組,每次拉取後自動比對,哪一筆記錄在哪一台不見了、哪一筆在兩台的值不一樣,直接列出來並通知管理員。
同一組裡的 DNS 伺服器不必是同一套軟體,PowerDNS、BIND 9、Windows DNS、Technitium、Univention UCS 都可以放進同一個比對群組,例如 PowerDNS 主要搭配 BIND 9 次要,或 Windows DNS 與 UCS 並存的 AD 環境。
jt-ipam 的 DNS 整合
jt-ipam 目前可以接 PowerDNS、BIND 9、Windows DNS、Technitium DNS Server、Univention UCS 與 OPNsense Unbound,接上之後提供這些功能:
- IP 對應名稱:IP 記錄可以從 DNS 取得對應的 FQDN 或主機名稱,並標示是哪一台 DNS 伺服器回報的
- DNS 記錄查詢:在「進階 > DNS 記錄」依伺服器、類型篩選或搜尋,也可以用 IP 反查對應的記錄
- 找出沒有對應的記錄:篩選出指向的 IP 在 IPAM 裡找不到的 A/AAAA 記錄
- 正反解一致性:比對 A/AAAA 與 PTR 記錄是否互相對得上
- 失效 DNS 記錄:異常偵測會列出指向已不存在、或很久沒看過的位址的記錄
- IP 變更評估:改 IP 前列出會影響到哪些 DNS 記錄
- 推送記錄:可以選擇把記錄推送回 DNS 伺服器(Technitium 只讀取)
這篇介紹的「DNS 比對群組」,就是在這些拉回來的資料上,再加上多台 DNS 伺服器之間的比對。
運作方式

jt-ipam 用各家 DNS 伺服器原生的方式讀取記錄:
| DNS 伺服器 | 讀取方式 |
|---|---|
| PowerDNS | HTTP API |
| BIND 9 | 區域傳送(AXFR),可用 TSIG 金鑰驗證 |
| Windows DNS | WinRM |
| Technitium DNS Server | API(只需要檢視權限) |
| Univention UCS | UDM REST API |
| OPNsense Unbound | REST API(只有主機覆寫) |
比對群組只讀取、不寫入,不會在伺服器之間同步或修改記錄,比對用的是已經拉回來的資料。發現差異後,修正仍要回到 DNS 伺服器上處理,例如重新觸發區域傳送。
每台成員拉取完成就會比對一次,規則如下:
- 整個 zone 只出現在部分成員上:列成一筆「整個 zone 只在部分伺服器上」,不再逐筆列出裡面的記錄
- 所有成員都有的 zone:逐筆比對記錄的名稱、類型與值,TTL 與 SOA 序號不比
- 同一筆記錄在兩台的值不同:會出現兩筆差異,分別是「這個值只在 A 有」與「那個值只在 B 有」
- AD 的服務定位資料不比:
_msdcs、TrustAnchors兩個 zone,以及DomainDnsZones、ForestDnsZones記錄,Windows 與 Samba 的登記方式本來就不同
跨異質 DNS 伺服器比對
不同軟體混在同一組時,最怕的是「內容一樣、寫法不同」也被當成不一致。比對前會先把寫法統一:
- IPv6 位址轉成標準縮寫格式
- 名稱不分大小寫,並去掉結尾的點
- MX、SRV 記錄裡的主機名稱也做同樣處理
- TXT 記錄去掉引號,BIND 拆成多段的字串(
"a" "b")接回一段
所以 PowerDNS 主要、BIND 9 次要這類混搭架構,不會因為格式差異而誤報。我實際用 PowerDNS 主要、BIND 9 與 Technitium 次要三台同組測試過,複寫中斷時只會回報真的缺資料的那台,恢復後也會發恢復通知。
建立比對群組
設定位置在「管理 > 外部系統整合 > DNS」。先把各台 DNS 伺服器加進來,伺服器清單會多一個「比對群組」欄位,頁面下方是比對群組的清單。

按「新增比對群組」,設定以下項目:
| 項目 | 說明 |
|---|---|
| 成員 | 至少兩台;原本在別組的伺服器會移到這一組,停用的伺服器不參與比對 |
| 寬限時間 | 預設 30 分鐘,可設 0 到 1440 分鐘,說明見下一節 |
| 比對的紀錄類型 | 預設 A、AAAA、PTR,另外可勾 CNAME、MX、TXT、NS、SRV、CAA |
| 不比對的 zone | 只放在部分伺服器上的 zone,列在這裡就不算差異 |
| 發告警 | 確認不一致時通知管理員,恢復一致時再通知一次 |

比對類型預設只有 A、AAAA、PTR,因為這三種是 IPAM 有對應的記錄。勾選其他類型後,成員要等下一次拉取才會存下那些記錄,可以到各台伺服器按「拉取」立即更新。
選成員時,每台都會標出 DNS 軟體與讀取方式。Windows DNS、UCS、PowerDNS、BIND 9、Technitium 可以混在同一組,例如 Windows DNS 搭配 UCS 的 AD 環境。

注意:OPNsense 的 Unbound 只存主機覆寫,不是完整的 zone,只能和 Unbound 放同一組,混到其他類型時系統會擋下並說明原因。
也可以從單台 DNS 伺服器的編輯畫面直接指定或移出比對群組。

避免誤報的設計
比對工具最怕的是一直誤報,告警多了就沒人看。這部分有幾個設計:
寬限時間
主從之間的複寫本來就有延遲,主要伺服器剛新增一筆記錄,次要伺服器晚幾分鐘才收到是正常的。所以差異出現時不會馬上告警,要等「沒有的那台」在寬限時間過後重新拉取過、仍然沒有,才算確認。
以資料時間判斷
成員是依序拉取的,比對當下,別台的資料可能還是舊的。判斷依據是每台資料本身的拉取時間,不是比對當下的時鐘,所以不會因為拉取順序不同而誤報。
資料不完整時先不判定
有成員最近一次拉取失敗、或從來沒有拉取過時,群組會標示「資料不完整」,先不判定、也不告警。
群組的四種狀態整理如下:
| 狀態 | 意思 |
|---|---|
| 一致 | 所有成員的記錄相同 |
| 待確認 | 有差異,但還在寬限時間內 |
| 不一致 | 差異已經確認 |
| 資料不完整 | 有成員拉取失敗或尚未拉取,先不判定 |
差異清單
在群組清單按操作欄的清單圖示,會列出每一筆差異出現在哪幾台、哪幾台沒有,以及第一次看到的時間。以下圖的 corp-dns 群組為例,可以看出:
- vpn 的 PTR 記錄只有 corp-ns3 沒有
- erp-db-01 在 corp-ns2 還是舊位址
.21,另外兩台已經改成.22 - vpn 的 A 記錄 corp-ns2 沒有
- 整個
sandbox.example.net只在主要伺服器 corp-ns1 上

其中 erp-db-01 這種「一台是舊值、其他台是新值」的狀況,最容易造成使用者連線時好時壞,用傳統的單台查詢很難發現。
sandbox.example.net 是刻意只放在主要伺服器上的測試 zone,不是複寫問題。這種情況可以在那一列按「不比對這個 zone」,之後就不再比對,要改回來到群組設定的「不比對的 zone」移除即可。

確定後,sandbox.example.net 從差異清單消失,清單上方與群組設定都會列出它,差異從 5 筆變成 4 筆。

DNS 記錄合併顯示
三台內容相同的 DNS 伺服器,在「進階 > DNS 記錄」頁面上原本會把同一筆記錄列三次。現在同一個比對群組裡相同的記錄會合併成一列,來源欄標出群組名稱與有這筆記錄的伺服器。

合併之後,哪一筆只在部分伺服器上反而更明顯。上圖的 erp-db-01 出現兩個位址、vpn 只有兩台有,不用另外比對就看得出來。
取消「合併比對群組裡相同的紀錄」,就會回到逐台列出,同樣的查詢條件從 12 筆變成 32 筆。

不同群組的記錄不會合併,即使內容相同也一樣。
異常偵測與 IP 變更評估
確認的差異也會出現在「管理 > 異常偵測」的「DNS 比對不一致」分頁,列出群組、zone、有與沒有的伺服器,以及首次發現的時間。只會列出已確認的差異,還在寬限時間內的不會出現。

其他用到 DNS 記錄的地方,也會依群組合併。例如「失效 DNS 記錄」分頁(DNS 記錄指向已不存在或很久沒看過的位址),同一筆記錄只列一次,DNS 伺服器欄列出所有成員,並多一個「比對群組」欄位。

IP 變更評估也一樣。下圖把 www 從 198.51.100.10 改到 198.51.100.110,三台 DNS 伺服器上的同一筆 A 記錄與 PTR 記錄各只算一項影響,原因裡列出 corp-ns1、corp-ns2、corp-ns3。以前同一筆記錄會因為三台伺服器而算成三項,影響清單看起來比實際嚴重。

通知
群組有開「發告警」時,確認不一致會依「通知發送設定」通知管理員,可以用 Email、Telegram、Slack、Teams、Nextcloud Talk、Zulip 或 Webhook。通知內容會寫出是哪一筆記錄、哪幾台沒有,以及另外還有幾筆。
同一批差異只通知一次,之後又多出來的才會再通知;全部恢復一致時,會再發一則恢復通知。

與自寫腳本比對的差異
| 項目 | 自寫 dig 腳本 | DNS 比對群組 |
|---|---|---|
| 比對範圍 | 通常只查幾個重點名稱 | 拉回完整 zone,逐筆比對 |
| 整個 zone 缺漏 | 要另外檢查 | 列成一筆「整個 zone 只在部分伺服器上」 |
| 不同 DNS 軟體的寫法 | 要自己處理格式差異 | 比對前自動統一寫法 |
| 複寫延遲 | 容易誤報 | 寬限時間過後重新拉取確認 |
| 通知 | 要自己串接 | 內建,含恢復一致通知 |
| 歷史記錄 | 通常沒有 | 首次發現時間、可匯出 |
適用情境
- 主從 DNS 的複寫監控:確認次要伺服器有沒有落後或漏掉記錄
- 人工維護的多台獨立 DNS:兩邊靠人工設定時,確認沒有漏改其中一台
- 多台 AD DC 的 DNS 一致性檢查:Windows DNS 與 UCS(Samba)可以混搭比對
- 更換 DNS 軟體的轉移期:例如 BIND 9 換成 PowerDNS,新舊並行時確認兩邊內容一致
- 稽核:差異清單有每筆記錄出現在哪幾台、首次發現與確認的時間,可以匯出
限制
- 比對的是 jt-ipam 已經拉回來的資料,準確度取決於各台伺服器的同步週期;需要馬上確認時,可以在差異清單按「立即檢查」
- 只比對群組設定勾選的記錄類型,TTL 與 SOA 序號不比
- jt-ipam 只負責發現與通知,不會自動修正,修正要回到 DNS 伺服器上做
DNS 比對群組從 v1.0.7 開始提供,v1.0.12 加入可選的比對類型。本文截圖為 v1.0.15,畫面上的網域、位址與主機名稱都是示範資料。
結論
多台 DNS 內容不一致,往往不是整台壞掉,而是少了幾筆、或某一台停在舊資料,平常很難發現。比對群組把「每台的內容是否一致」變成每次拉取後自動檢查的項目,差異會列出是哪一筆、哪一台,有問題時直接通知。
比對時也考慮了複寫延遲、拉取順序、拉取失敗,以及刻意只放在單台的 zone,這些都是真實環境常見的情況。告警要準,才不會被當成雜訊忽略。
參考資料
- jt-ipam:專案網站
https://jasoncheng7115.github.io/jt-ipam/ - jt-ipam:原始碼庫(GitHub)
https://github.com/jasoncheng7115/jt-ipam - jt-ipam:變更記錄
https://github.com/jasoncheng7115/jt-ipam/blob/main/CHANGELOG_zh-TW.md - RFC 5936:DNS Zone Transfer Protocol (AXFR)
https://datatracker.ietf.org/doc/html/rfc5936 - jt-ipam IP 探測:整合 Nmap 與指紋比對的設備辨識
https://blog.jason.tools/2026/10/jt-ipam-probe.html - jt-ipam 整合 RustDesk:從 IP 記錄直接遠端連線
https://blog.jason.tools/2026/10/jt-ipam-rustdesk.html



