使用 bind9 建置混合 DNS(Response Policy Zone)

Posted on

首先解釋一下,什麼是混合 DNS 呢?總的來說,如果自建大內網,那麼內部 DNS 是比較常用的。針對自己的域名,多數情況下如果伺服器全部在內網內部,則 DNS 會提供內部的解析,做到內網訪問,不需要再繞行公網。但是在某些情況下,域名的部分子域名是只有公網伺服器的,這個時候如果不在內部 DNS 上對應地增加記錄,那麼查詢時將解析失敗。如果不想手動維護這些在公網上,並且已經設定好公網 DNS 的解析記錄,有什麼辦法呢?在 bind 9.8+ 上可以使用 Response Policy Zone 特性。

RPZ 特性可以使內部 DNS Override 掉一部分的記錄,而使其他的記錄保持原先的設定。首先,先設定好 RPZ 的內容:

$TTL 2M
; sakuragawa.moe
@                               IN      SOA     ns1.internal.sakuragawa.moe. ns.internal.sakuragawa.moe. (
                                        2018032101 ; Serial
                                        28800      ; Refresh
                                        1800       ; Retry
                                        1W         ; Expire - 1 week
                                        86400 )    ; Minimum
                                IN      NS      localhost.
nas.sakuragawa.moe              A       192.168.1.10
sbox1.cloud.sakuragawa.moe      A       192.168.1.11
sbox2.cloud.sakuragawa.moe      A       192.168.1.12

ns1.sakuragawa.moe              CNAME   sbox1.cloud.sakuraawa.moe.
*.nas.sakuragawa.moe            CNAME   sbox1.cloud.sakuragawa.moe.

基本上設定與一般的 zone 是相同的。但是有幾個點需要注意:

  1. 記錄名稱填寫完整的域名,但是不帶最末尾的 .
  2. 記錄類型前不寫 IN
  3. 記錄內容的域名還是需要末尾的 .
  4. NS 記錄要填 localhost.,同樣也是記得末尾的 .

做完這些記得保存,這個最重要了。比如說 Fedora 下就保存在 /var/lib/named/,Debian 下是 /etc/bind/,其他系統浅羽並沒有認真用過。名字就隨便起一個比如 sakuragawa.moe.rpz 就好了。然後去設定好 zone,並且把它設定成 response-zone

options {
    ....
    response-zone {
        zone "comm.sakuragawa";
    };
};

zone "comm.sakuragawa" {
    type master;
    file "sakuragawa.moe.rpz";
};

這樣應該就沒問題了。這一步設定的時候,千萬千萬記得 zone 的名字不要設定成有效 TLD 的名字,否則會導致設定的 TLD 無法正確解析,而 RPZ 也不能工作。接下來重啓 bind,然後試著查詢一個:

asaba@sbox1 ~ % dig nas.sakuragawa.moe @localhost 

; <<>> DiG 9.10.3-P4-Debian <<>> nas.sakuragawa.moe @localhost
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15821
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;nas.sakuragawa.moe.    IN  A

;; ANSWER SECTION:
nas.sakuragawa.moe.  5  IN  A  192.168.1.10

;; AUTHORITY SECTION:
comm.sakuragawa.  120  IN  NS  localhost.

;; ADDITIONAL SECTION:
localhost.    604800  IN  A  127.0.0.1
localhost.    604800  IN  AAAA  ::1

;; Query time: 337 msec
;; SERVER: ::1#53(::1)
;; WHEN: Wed Mar 21 17:02:49 HKT 2018
;; MSG SIZE  rcvd: 145

再來一個:

asaba@sbox1 ~ % dig asaba.sakuragawa.moe @localhost

; <<>> DiG 9.10.3-P4-Debian <<>> asaba.sakuragawa.moe @localhost
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5335
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 13, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;asaba.sakuragawa.moe.    IN  A

;; ANSWER SECTION:
asaba.sakuragawa.moe.  299  IN  CNAME  s-n-2.cloud.sakuragawa.moe.
s-n-2.cloud.sakuragawa.moe. 299  IN  CNAME  us-la.tunnel.sakuragawa.moe.
us-la.tunnel.sakuragawa.moe. 299 IN  A  45.77.69.250

;; AUTHORITY SECTION:
.      52046  IN  NS  e.root-servers.net.
.      52046  IN  NS  b.root-servers.net.
.      52046  IN  NS  j.root-servers.net.
.      52046  IN  NS  m.root-servers.net.
.      52046  IN  NS  f.root-servers.net.
.      52046  IN  NS  a.root-servers.net.
.      52046  IN  NS  c.root-servers.net.
.      52046  IN  NS  l.root-servers.net.
.      52046  IN  NS  i.root-servers.net.
.      52046  IN  NS  k.root-servers.net.
.      52046  IN  NS  d.root-servers.net.
.      52046  IN  NS  g.root-servers.net.
.      52046  IN  NS  h.root-servers.net.

;; Query time: 503 msec
;; SERVER: ::1#53(::1)
;; WHEN: Wed Mar 21 17:02:55 HKT 2018
;; MSG SIZE  rcvd: 329

以上兩個域名,其中一個在 RPZ 中有定義,另一個沒有定義,但是在公網 DNS 上有。可以看到兩個域名都能正確查詢,也就是混合 DNS 已經按照預期工作了。


This site uses Akismet to reduce spam. Learn how your comment data is processed.