跳到主要內容
節省工具箱Jason Tools
專案分享

jt-ipam DNS 比對群組:多台 DNS 一致性檢查

Jason Cheng 發布 瀏覽 20 次
jt-ipam DNS 比對群組:多台 DNS 一致性檢查
本文目錄
  1. jt-ipam 的 DNS 整合
  2. 運作方式
  3. 跨異質 DNS 伺服器比對
  4. 建立比對群組
  5. 避免誤報的設計
  6. 差異清單
  7. DNS 記錄合併顯示
  8. 異常偵測與 IP 變更評估
  9. 通知
  10. 與自寫腳本比對的差異
  11. 適用情境
  12. 限制
  13. 結論
  14. 參考資料

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 伺服器之間的比對。

運作方式

DNS 比對群組的運作流程:唯讀拉取各台記錄、統一寫法、比對,寬限時間後確認
DNS 比對群組的運作流程:唯讀拉取各台記錄、統一寫法、比對,寬限時間後確認

jt-ipam 用各家 DNS 伺服器原生的方式讀取記錄:

DNS 伺服器讀取方式
PowerDNSHTTP API
BIND 9區域傳送(AXFR),可用 TSIG 金鑰驗證
Windows DNSWinRM
Technitium DNS ServerAPI(只需要檢視權限)
Univention UCSUDM REST API
OPNsense UnboundREST 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 伺服器加進來,伺服器清單會多一個「比對群組」欄位,頁面下方是比對群組的清單。

DNS 頁面下方的比對群組清單,狀態分為資料不完整、待確認、不一致、一致
DNS 頁面下方的比對群組清單,狀態分為資料不完整、待確認、不一致、一致

按「新增比對群組」,設定以下項目:

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

比對類型預設只有 A、AAAA、PTR,因為這三種是 IPAM 有對應的記錄。勾選其他類型後,成員要等下一次拉取才會存下那些記錄,可以到各台伺服器按「拉取」立即更新。

選成員時,每台都會標出 DNS 軟體與讀取方式。Windows DNS、UCS、PowerDNS、BIND 9、Technitium 可以混在同一組,例如 Windows DNS 搭配 UCS 的 AD 環境。

選擇成員時會標出每台的 DNS 軟體,不同軟體可以放在同一組
選擇成員時會標出每台的 DNS 軟體,不同軟體可以放在同一組

注意:OPNsense 的 Unbound 只存主機覆寫,不是完整的 zone,只能和 Unbound 放同一組,混到其他類型時系統會擋下並說明原因。

也可以從單台 DNS 伺服器的編輯畫面直接指定或移出比對群組。

單台 DNS 伺服器的編輯畫面也能指定比對群組,這台 Technitium 只給 jt-ipam 檢視權限
單台 DNS 伺服器的編輯畫面也能指定比對群組,這台 Technitium 只給 jt-ipam 檢視權限

避免誤報的設計

比對工具最怕的是一直誤報,告警多了就沒人看。這部分有幾個設計:

寬限時間

主從之間的複寫本來就有延遲,主要伺服器剛新增一筆記錄,次要伺服器晚幾分鐘才收到是正常的。所以差異出現時不會馬上告警,要等「沒有的那台」在寬限時間過後重新拉取過、仍然沒有,才算確認。

以資料時間判斷

成員是依序拉取的,比對當下,別台的資料可能還是舊的。判斷依據是每台資料本身的拉取時間,不是比對當下的時鐘,所以不會因為拉取順序不同而誤報。

資料不完整時先不判定

有成員最近一次拉取失敗、或從來沒有拉取過時,群組會標示「資料不完整」,先不判定、也不告警。

群組的四種狀態整理如下:

狀態意思
一致所有成員的記錄相同
待確認有差異,但還在寬限時間內
不一致差異已經確認
資料不完整有成員拉取失敗或尚未拉取,先不判定

差異清單

在群組清單按操作欄的清單圖示,會列出每一筆差異出現在哪幾台、哪幾台沒有,以及第一次看到的時間。以下圖的 corp-dns 群組為例,可以看出:

  • vpn 的 PTR 記錄只有 corp-ns3 沒有
  • erp-db-01 在 corp-ns2 還是舊位址 .21,另外兩台已經改成 .22
  • vpn 的 A 記錄 corp-ns2 沒有
  • 整個 sandbox.example.net 只在主要伺服器 corp-ns1 上
corp-dns 群組的差異清單,列出每一筆記錄有與沒有的伺服器
corp-dns 群組的差異清單,列出每一筆記錄有與沒有的伺服器

其中 erp-db-01 這種「一台是舊值、其他台是新值」的狀況,最容易造成使用者連線時好時壞,用傳統的單台查詢很難發現。

sandbox.example.net 是刻意只放在主要伺服器上的測試 zone,不是複寫問題。這種情況可以在那一列按「不比對這個 zone」,之後就不再比對,要改回來到群組設定的「不比對的 zone」移除即可。

整個 zone 只在部分伺服器上的差異,可以一鍵設成不比對
整個 zone 只在部分伺服器上的差異,可以一鍵設成不比對

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

排除 sandbox.example.net 之後,差異剩下 4 筆
排除 sandbox.example.net 之後,差異剩下 4 筆

DNS 記錄合併顯示

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

預設合併顯示,erp-db-01 的兩個位址、vpn 只在兩台上,一看就知道
預設合併顯示,erp-db-01 的兩個位址、vpn 只在兩台上,一看就知道

合併之後,哪一筆只在部分伺服器上反而更明顯。上圖的 erp-db-01 出現兩個位址、vpn 只有兩台有,不用另外比對就看得出來。

取消「合併比對群組裡相同的紀錄」,就會回到逐台列出,同樣的查詢條件從 12 筆變成 32 筆。

取消合併後逐台列出,同樣的查詢從 12 筆變成 32 筆
取消合併後逐台列出,同樣的查詢從 12 筆變成 32 筆

不同群組的記錄不會合併,即使內容相同也一樣。

異常偵測與 IP 變更評估

確認的差異也會出現在「管理 > 異常偵測」的「DNS 比對不一致」分頁,列出群組、zone、有與沒有的伺服器,以及首次發現的時間。只會列出已確認的差異,還在寬限時間內的不會出現。

異常偵測的「DNS 比對不一致」分頁
異常偵測的「DNS 比對不一致」分頁

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

失效 DNS 記錄依比對群組合併,一筆記錄一列
失效 DNS 記錄依比對群組合併,一筆記錄一列

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

IP 變更評估:同一筆記錄在三台伺服器上只算一項影響
IP 變更評估:同一筆記錄在三台伺服器上只算一項影響

通知

群組有開「發告警」時,確認不一致會依「通知發送設定」通知管理員,可以用 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,這些都是真實環境常見的情況。告警要準,才不會被當成雜訊忽略。

參考資料

Jason Cheng

Jason Cheng

企業開源技術顧問,專注架構規劃與實務導入

關於作者 →

延伸閱讀