Contents

Split DNS 架構整理與小實驗

在網路架構中,Split DNSSplit-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 查詢。
  • 做法:
  1. 外部 DNS 一樣依賴 Cloudflare 或 HiNet 等公共 DNS 代管。
  2. 公司內部的終端設備,將 DNS 指向公司的路由器 (Gateway)。
  3. 路由器平常作為 Forwarder,將查詢轉發給外部公共 DNS。但是,網管會在路由器中設定幾條「特例規則 (Host Overrides)」:當有人查詢 erp.company.com 時,路由器會自己攔截該請求,直接回覆內部 IP 192.168.1.50,其餘沒寫在規則裡的網域才往外丟。
  • 優點: 超級輕量、建置成本極低。不需額外採購伺服器或維護作業系統,現有的商用路由器/防火牆即可實現。
  • 缺點: 擴充性差,只適合少量的網域覆寫。如果企業內部有數百個網址需要解析,透過路由器的 Web UI 或單一清單來管理會是一場災難。

參考資料:FortiGate DNS Server Configuration


實戰演練:Unbound 操作 Split-view DNS

Unbound 中實作 Split-view DNS,核心概念為:透過 ACL (Access Control List) 將不同來源的網段綁定到不同的 View,再搭配 local-zone / local-data 來回覆對應的解析結果。

首先安裝 Unbound 並確認服務狀態:

1
2
sudo apt install unbound
sudo service unbound status

🧪 設定 Linux 網路命名空間 (Network Namespace) 與 DNS

為了方便在一台機器上模擬內、外網環境,我們可以使用 Linux 的 netns 搭配 veth pair 來進行測試。以下操作皆以 root 權限執行:

1. 建立兩個獨立的 Namespace * ns-internal → 模擬內網使用者環境

  • ns-external → 模擬外網使用者環境
1
2
ip netns add ns-internal
ip netns add ns-external

2. 建立 veth pair 並配置 IP 網段 利用 veth pair 將 Namespace 與 Host 主機連接,使其能向主機上的 Unbound 發送 DNS 查詢。

設定內部網路 (ns-internal):

1
2
3
4
5
6
ip link add veth-in type veth peer name veth-in-br
ip link set veth-in netns ns-internal
ip addr add 192.168.1.2/24 dev veth-in-br
ip link set veth-in-br up
ip netns exec ns-internal ip addr add 192.168.1.10/24 dev veth-in
ip netns exec ns-internal ip link set veth-in up

設定外部網路 (ns-external):

1
2
3
4
5
6
ip link add veth-ex type veth peer name veth-ex-br
ip link set veth-ex netns ns-external
ip addr add 10.0.0.2/24 dev veth-ex-br
ip link set veth-ex-br up
ip netns exec ns-external ip addr add 10.0.0.10/24 dev veth-ex
ip netns exec ns-external ip link set veth-ex up

3. 配置 Unbound 的 Split-view 規則 編輯 unbound.conf,定義不同來源網段對應的解析紀錄(註:以下配置為測試環境驗證用,未作極度嚴謹的安全強化):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
server:
    # 監聽的介面
    interface: 127.0.0.1
    interface: 192.168.1.2
    interface: 10.0.0.2

    # 1. 基本存取權限:允許以下網段進行 DNS 查詢
    access-control: 192.168.1.0/24 allow
    access-control: 10.0.0.0/24 allow
    access-control: 127.0.0.0/8 allow

    # 2. 關鍵修正:透過 access-control-view 將連線網段綁定到對應的 view
    access-control-view: 192.168.1.0/24 "internal"
    access-control-view: 10.0.0.0/24 "external"
    access-control-view: 127.0.0.0/8 "internal"

    # 備註:若要將所有其他未匹配到的網段預設綁定到 external,可設定 0.0.0.0/0。
    # (若省略則會走 server 區塊的預設值)
    # access-control-view: 0.0.0.0/0 "external"

# 3. 內網 view:明確宣告 internal 區塊
view:
    name: "internal"
    local-zone: "example.com." static
    local-data: "example.com. IN A 192.168.1.100"

# 4. 外網 view:宣告 external 區塊
view:
    name: "external"
    local-zone: "example.com." static
    local-data: "example.com. IN A 203.0.113.5"

設定完成後,重啟 Unbound 服務:

1
service unbound restart

參考資料:How to Set Up Split-Horizon DNS with Unbound on RHEL

4. 驗證與測試 我們可以直接在剛剛建好的 namespace 中使用 dig 來測試是否成功切換 View。

ns-internal 中查詢(應回傳內網 IP 192.168.1.100):

1
ip netns exec ns-internal dig @192.168.1.2 example.com +short

ns-external 中查詢(應回傳外網 IP 203.0.113.5):

1
ip netns exec ns-external dig @10.0.0.2 example.com +short

補充:使用 Unbound 實作 DNS Override

前面提到路由器可以做 DNS Override,其實在 Unbound 的 server 區塊中,我們也可以直接利用 local-data 來強行覆寫特定網域的解析結果,這在阻擋廣告或是區域性服務覆寫時非常實用:

1
2
3
# DNS Override Area (寫在 server: 區塊內)
local-data: "blog.cre0809.com. 3600 IN AAAA 2606:4700::16:16"
local-data: "blog.cre0809.com. 3600 IN A 104.16.16.16"

相關文章

心智圖

mindmap root((Split DNS)) 核心概念 同網域不同解析結果 依來源 IP 回傳不同答案 常見於內外網分流 架構分類 雙腦架構 內外 DNS 完全隔離 安全性高 維護成本高 Split View DNS 單一 DNS 集中管理 依 ACL 與 View 回應 規則寫錯容易解析混亂 DNS Override 路由器或防火牆覆寫 建置輕量 不適合大量網域