Split DNS 架構整理與小實驗
在網路架構中,Split DNS 或 Split-horizon DNS 是這類技術的「總稱」。其核心目的在於:根據發出 DNS 查詢的來源(通常是 IP 位址),回傳相對應的解析結果。最常見的應用場景就是讓公司內網與外部網際網路的使用者,在查詢同一個網域名稱時,被導向不同的伺服器 IP。
以下整理三種常見的 Split DNS 架構與優缺點,並附上使用 Unbound 實作的測試紀錄。
基礎架構分類
1. 雙腦架構 (Split-brain DNS) —— 「實體 / 完全隔離」
- 概念: 系統如同被分割成「兩個獨立的大腦」,內部 DNS 和外部 DNS 各自獨立運作,互不相連,也對彼此的存在一無所知。
- 做法: 內網架設一台專屬的 DNS 伺服器(A 腦),外部雲端或 DMZ 區放置另一台 DNS 伺服器(B 腦)。兩邊雖然都託管
company.com這個網域,但內部的 Zone file 紀錄與外部完全不同。 - 優點: 安全性最高、架構最單純。即使外部 DNS 遭受攻擊或被惡意竄改,內部 DNS 依然安然無恙,企業內部的機密網路拓樸完全不會外洩。
- 缺點: 維護成本倍增。每次新增或修改共用的網域名稱時,網管人員都必須在內、外兩台伺服器上各設定一次,容易產生資料不同步的人為疏失。
2. Split View DNS —— 「集中化視圖管理」
- 概念: 依靠「一台」強大的 DNS 伺服器集中處理,但具備「看來源給答案」的能力。它會根據發問者的 Source IP 網段,動態切換並回傳對應的「視圖 (Views)」。
- 做法: 利用 BIND9 的
views功能、Windows Server 的DNS Policies,或 Unbound 的access-control-view。在同一台伺服器內定義好 ACL(存取控制清單)與規則:「匹配到 192.168.x.x 的來源給內部 Zone 紀錄,其餘則給外部 Zone 紀錄」。 - 優點: 集中管理。維運人員只需登入一台伺服器即可完成所有設定,免去了維護兩套系統的麻煩。
- 缺點: 設定邏輯較為複雜。若 View 或 ACL 的匹配規則寫錯,很容易導致內外網解析錯亂(例如外網拿到內網的私有 IP)。
3. DNS Override —— 「輕量化邊緣攔截」
- 概念: 不特別架設正規的內部 DNS 伺服器,而是利用既有的邊緣設備(路由器或防火牆)(如 pfSense、FortiGate 等)來「攔截」並「覆寫」特定的 DNS 查詢。
- 做法:
- 外部 DNS 一樣依賴 Cloudflare 或 HiNet 等公共 DNS 代管。
- 公司內部的終端設備,將 DNS 指向公司的路由器 (Gateway)。
- 路由器平常作為 Forwarder,將查詢轉發給外部公共 DNS。但是,網管會在路由器中設定幾條「特例規則 (Host Overrides)」:當有人查詢
erp.company.com時,路由器會自己攔截該請求,直接回覆內部 IP192.168.1.50,其餘沒寫在規則裡的網域才往外丟。
- 優點: 超級輕量、建置成本極低。不需額外採購伺服器或維護作業系統,現有的商用路由器/防火牆即可實現。
- 缺點: 擴充性差,只適合少量的網域覆寫。如果企業內部有數百個網址需要解析,透過路由器的 Web UI 或單一清單來管理會是一場災難。
實戰演練:Unbound 操作 Split-view DNS
在 Unbound 中實作 Split-view DNS,核心概念為:透過 ACL (Access Control List) 將不同來源的網段綁定到不同的 View,再搭配 local-zone / local-data 來回覆對應的解析結果。
首先安裝 Unbound 並確認服務狀態:
|
|
🧪 設定 Linux 網路命名空間 (Network Namespace) 與 DNS
為了方便在一台機器上模擬內、外網環境,我們可以使用 Linux 的 netns 搭配 veth pair 來進行測試。以下操作皆以 root 權限執行:
1. 建立兩個獨立的 Namespace * ns-internal → 模擬內網使用者環境
ns-external→ 模擬外網使用者環境
|
|
2. 建立 veth pair 並配置 IP 網段 利用 veth pair 將 Namespace 與 Host 主機連接,使其能向主機上的 Unbound 發送 DNS 查詢。
設定內部網路 (ns-internal):
|
|
設定外部網路 (ns-external):
|
|
3. 配置 Unbound 的 Split-view 規則 編輯 unbound.conf,定義不同來源網段對應的解析紀錄(註:以下配置為測試環境驗證用,未作極度嚴謹的安全強化):
|
|
設定完成後,重啟 Unbound 服務:
|
|
4. 驗證與測試 我們可以直接在剛剛建好的 namespace 中使用 dig 來測試是否成功切換 View。
在 ns-internal 中查詢(應回傳內網 IP 192.168.1.100):
|
|
在 ns-external 中查詢(應回傳外網 IP 203.0.113.5):
|
|
補充:使用 Unbound 實作 DNS Override
前面提到路由器可以做 DNS Override,其實在 Unbound 的 server 區塊中,我們也可以直接利用 local-data 來強行覆寫特定網域的解析結果,這在阻擋廣告或是區域性服務覆寫時非常實用:
|
|