﻿# Ubuntu 10.04 如何正確設定次要 DNS 伺服器 (Slave DNS)

今天架設了壹台次要 DNS 伺服器 (Slave DNS) 起來，不過設定完成之後卻一直無法正確寫入 Zone File，系統記錄一直出現 permission denied 的錯誤訊息，不過我再三檢查後確定檔案與目錄權限是沒問題的，詭異的就是一直無法正確建立起 Slave 的 Zone 檔案，我查過了 Primary DNS 的 Log 已經確定資料正確傳回 Slave 了，到底是什麼問題呢？原來是寫入的目錄被 [AppArmor](https://wiki.ubuntu.com/AppArmor) 系統保護住了！

**§ 以下是錯誤示範，僅提供情境描述之用 §**

事情是這樣發生的，我原本有壹台非常老舊的 DNS 伺服器是用 Fedora Core 3 架設的，現在把設定檔全部都到新安裝的 Ubuntu 10.04，Ubuntu 的 DNS 主要設定放在 /etc/bind 目錄下，我把 master 與 slave 的檔案全部都分別寫入到 /etc/bind/master 與 /etc/bind/slave 目錄下。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/74a024ff504fd1bbf5e0-image_449.png)

在 **named.conf.local** 裡指定的檔案路徑用的是**絕對路徑**，移過來之後並沒有注意用相對路徑就能設定，因此不懷疑有他的繼續沿用，改路徑而已：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/8ec447f46892beafda0c-image_450.png)

不過當我利用 **/etc/init.d/bind9 restart** 重新啟動後，卻在 **/var/log/syslog** 系統記錄檔中發現以下錯誤：

-   Jan 10 13:15:08 XXX named\[23349\]: zone example.com/IN: Transfer started.
-   Jan 10 13:15:08 XXX named\[23349\]: transfer of 'example.com/IN' from 172.16.100.53#53: connected using 172.16.100.1#59972
-   Jan 10 13:15:08 XXX named\[23349\]: dumping master file: /etc/bind/slave/tmp-3qrrrWGEq6: open: permission denied
-   Jan 10 13:15:08 XXX named\[23349\]: transfer of 'example.com/IN' from 172.16.100.53#53: failed while receiving responses: permission denied
-   Jan 10 13:15:08 XXX named\[23349\]: transfer of 'example.com/IN' from 172.16.100.53#53: Transfer completed: 0 messages, 14 records, 0 bytes, 0.007 secs (0 bytes/sec)

從上述訊息可以判斷出應該是 Zone Transfer 已經完成而且有 14 筆紀錄，但是在本地端卻無法儲存檔案的權限問題，進一步瞭解後才得知原來是寫入的目錄被 [AppArmor](https://wiki.ubuntu.com/AppArmor) 系統保護住了，必須手動將特定目錄加入寫入權限才行。

**§ 以下是正確設定方式，有兩種方式，二選一即可 §  （推薦使用方法二進行設定）**

**方法一：修改 /etc/apparmor.d/usr.sbin.named 設定檔**

如下圖示，加上一行 **/etc/bind/slave/\*\* rw,** 進去，記得要設定 **rw** 才是代表「可讀可寫」的意思。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/51e3bbdec6d0d3436fb9-image_451.png) 

**方法二：在 /etc/bind/named.conf.local 設定相對路徑**

其實從方法一的圖示可以看出 **/var/cache/bind** 目錄早就已經設定開啟了可讀可寫的設定，而且我們在 **/etc/bind/named.conf.options** 設定檔也定義了 named 的開始目錄就是在 **/var/cache/bind** 這裡。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/cdc89c3c1ef56d601987-image_452.png)

所以，我最後修改 **/etc/bind/named.conf.local** 設定檔如下（請注意我從絕對路徑改成相對路徑了）：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/70992efd719c3f4c096b-image_453.png) 

而這些設定好的 Slave Zone 檔案就會自動建立在 **/var/cache/bind** 目錄下！

如果你想將 master 與 slave 的 zone file 分開而想將檔案建立在 **/var/cache/bind** 下的子目錄的話，則必須注意目錄的寫入權限與擁有者資訊，請透過以下指令進行目錄建立：

```
mkdir /var/cache/bind/slavechmod g+w /var/cache/bind/slavechgrp bind /var/cache/bind/slave
```

  ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/866bf182964116c5baae-image_454.png)

設定好之後你一樣可以在 **/etc/bind/named.conf.local** 設定檔裡使用相對路徑即可：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/523e8d49c05caab61001-image_455.png)

**補充說明**

-   如果你用的是 RedHat Linux 可以修改 **/etc/sysconfig/named** 設定檔，並加上以下設定：

```
ENABLE_ZONE_WRITE=yes
```

**相關連結**

-   [AppArmor - Ubuntu Wiki](https://wiki.ubuntu.com/AppArmor)
-   [AppArmor - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/AppArmor)
-   [DNS zone transfer - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/DNS_zone_transfer)
-   [Chapter 7. Domain Name Service (DNS) - Ubuntu Server Guide (Ubuntu 10.04)](https://help.ubuntu.com/10.04/serverguide/C/dns.html)
-   [DNS for Rocket Scientists](http://www.zytrax.com/books/dns/)
