在Windows 7上架設自己的 DNS 服務(使用BIND 9)
這是因應自己需要架設 DNS 伺服器紀錄的
在沒有Windows Server和Linux作業環境中,利用PC版的Windows開設DNS服務的方式
BIND的官方網站: https://www.isc.org
BIND下載位置(如果不存在請到官方網站尋找):https://www.isc.org/downloads/
找到下面位置,然後點開BIND項目產生下拉選單,選擇下載版本點選Download,依照作業系統類型選擇下載。
我下載的版本是9.10.6穩定版,作業系統是64位元
下載後是一個壓縮檔,把它解壓縮,會看到一個安裝檔案 BINDinstall.exe
注意,你必須以系統管理員身份執行,否則安裝後會有很多問題
雙擊後進行安裝,下面如下:
注意中間紅框,這個是 BIND啟動用的帳號 [named],一般而言電腦不會有這個帳號,所以它會在安裝時幫你建立這個帳號,當然這個建立過程是有問題的,所以我們事後要去調整這個帳號的權限。
還有一些需要注意(檢查)的:
- 安裝完畢後,程式正常的安裝位置會在 C:\Program Files\ISC BIND 9,如果你的路徑跑到 C:\Program Files (x86)\ISC BIND 9,代表你的作業系統是64位元,而你下載到的BIND版本是 32位元的。
- 某些版本BIND的組態設定檔會在 C:\Windows\System32\dns\etc,但是這個版本的組態預設是在 C:\Program Files\ISC BIND 9\etc,而程式與工具路徑會放在 C:\Program Files\ISC BIND 9\bin,要注意的是 C:\Program Files\ISC BIND 9\etc 基本上是空的,接下來所有組態檔都必須自己建立,這點對新手真的不是很友善。
- 某些套裝電腦會把作業系統的administrator帳號鎖起來,讓使用者以別的帳號執行,雖然這個使用者帳號是可能編屬於administrators權組的,但是對於C:\Program Files和C:\Windows的權限還是有一些限制的,對於接下來要建立BIND的組態與設定會有很多不便(通常是無法儲存設定檔到C:\Program Files\ISC BIND 9\etc)。
所以建議執行BIND任何設定或是開啟編輯器編輯組態檔案前,記得使用右鍵『以系統管理員身份執行』,或是直接使用administrators帳號登入進行編輯。
修改[named]帳號權限(成員隸屬):
原則上是不需要修改的,除非你的日誌(寫入)路徑是放在 C:\Program Files\ISC BIND 9\etc 底下,或是你的BIND需要抄寫其他DNS清單(會修改C:\Program Files\ISC BIND 9\etc裡面檔案)就會需要把權限調高。
組態檔案:
先了解BIND9需要自行建立底下一些檔案:
- rndc.key
- name.conf
- named.root
- named.local
- localhost.zone
- mysite1.com.tw.dns
- mysite2.idv.tw.dns
除了rndc.key、named.conf 之外,其他檔案名稱其實可以自己訂沒有硬性規定,但基於日久怕忘,所以我是以常見公版的命名方式處理。
檔尾名稱.dns的檔案是我的網域裡面主機名稱 正解 清單(玩過windows server的DNS的人大概就瞭解)
在這裡我沒有設定反解清單,大部分的情況下,只有公司內部比較有機會使用反解,一般架設在外部的主機通常是租用或是資安的理由不會設定。
- rndc.key
加密序號檔案,由系統指令產生。
- name.conf
主要組態檔案。
- named.root
根(root)主機清單,可以到 ftp://rs.internic.net/domain 直接下載最新的 named.root,不定期更新(基本上很少會異動)。
- named.local
本機形式 正解 清單
- localhost.zone
本機形式 反解 清單
- mysite1.com.tw.dns
我的第一個網站 正解 清單,.dns前面的檔案名稱通常會以你申請的域名為主(當然也可以完全不相關,只是這樣比較好記)。
- mysite2.idv.tw.dns
我的第二個網站 正解 清單
設定方式/步驟:
- 檢視C:\Program Files\ISC BIND 9\bin\readme1st.txt,內容主要是說,請先建立一個 named.conf 純文字檔案,儲存位置在 C:\Program Files\ISC BIND 9\etc ,然後先建立一個內容然後儲存:
options {
directory "C:\Program Files\ISC BIND 9\etc";
}; - 產生 rndc.key ,開啟命令列模式,進入 C:\Program Files\ISC BIND 9\bin,執行
rndc-confgen -a
便會自動產生這個檔案,而預設產生路徑就在 C:\Program Files\ISC BIND 9\etc 。
- 然後把rndc.key內容複製到 named.conf 內:
key "rndc-key" {
注意 secret "lJNu1IPdgmnej+ZzGYAbVA=="; 這序號每次產生都會不一樣。
algorithm hmac-md5;
secret "lJNu1IPdgmnej+ZzGYAbVA==";
};
,然後再加上 controls 文字:
controls {
inet 127.0.0.1 port 953 allow { localhost; } keys { "rndc-key"; };
}; - 依照需要繼續加上 named.conf 設定項目:
- options : 操作設定說明(不想看直接跳範例)
- directory "設定檔操作路徑"
告訴 BIND 設定檔的位置 - version "自訂的版本訊息"
- zone-statistics yes | no ;
是否開啟 ZONE 狀態記錄 - statistics-file "檔案位置"
配合 zone-statistics yes; 告訴 BIND 儲存 ZONE 狀態的檔案位置 - allow-query { IP條件 };
允許來查詢的IP/網段/單機 - allow-recursion { IP條件 } ;
允許來遞迴查詢的IP/網段/單機 - allow-transfer { IP條件 };
允許來讀取本機清單的IP/網段/單機 - recursion yes | no ;
遞迴查詢全開/全關,這個和 allow-recursion 只使用其中一種設定 - transfer yes | no ;
讀取本機清單 全開/全關,這個和 allow-transfer 只使用其中一種設定 - forwarders { 其他 DNS IP };
當本機查無資訊時,將查詢條件送往其他 DNS 主機查詢
例如:forwarders { 168.95.1.1; 8.8.8.8; }; 意思是當本DNS查無資料時送往中華電信DNS或Google的DNS進行查詢,此種查詢稱為遞迴查詢,可以配合 recursion 設定來限制特定使用者使用,以免被人利用。
- directory "設定檔操作路徑"
- zone : 轄區(網域)宣告設定說明
- 語法和指令
- zone "正反解轄區名稱" IN {}; : 架構樣式
- type master|slave|stub|forward|hint : 類型
- file "紀錄檔案" :實際內容檔案
- allow-update {IP;|範圍;|none;} :允許更新內容(此處為轄區獨立設定,如若 options 有定義則會以 options 為主)
- allow-transfer {IP;|範圍;|none;} :允許轉送內容
- 其他指令眾多有興趣可以Google研究
- 根目錄資訊(必要)
zone "." {
type hint;
file "named.root";
}; - 本機正解清單資訊
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update {none;};
}; - 本機反解清單資訊
zone "0.0.127.in-addr.arpa" {
type master;
file "named.local";
allow-update {none;};
}; - 自訂網域正解清單資訊(至少一個,我的範例是二
個網站)zone "mysite1.com.tw" {
type master;
file "mysite1.com.tw.dns"; //第一網站
allow-update {none;};
};
zone "mysite2.idv.tw" {
type master;
file "mysite2.idv.tw.dns"; //第二網站
allow-update {none;};
};
- 語法和指令
- logging : 日誌產生設定說明
- 語法和指令
logging {
channel 種類-log{
file "儲存檔案名稱" versions 保留檔案數 size 每個檔案大小;
severity critical|error|warning|notice|info|debug|dynamic; 要紀錄的告警等級
print-time yes|no; 列印時間
print-severity yes|no; 列印告警等級名
print-category yes|no; 列印類別名
};
category client|config|database|default|delegation-only|dispatch|dnssec|general|lame-servers|network|notify|queries|resolver|rpz|rate-limit|security|unmatched|update|update-security|xfer-in|xfer-out; 要輸出的類別
}; - 用法
logging{
channel default-log {
file "D:\ISC_BIND_log\named_default.log" versions 5 size 200m;
severity info;
print-time yes;
};
category default { default-log; };
};
- 語法和指令
- 其他
在 named.conf 裡面 options 和 logging 段落只會有一個,zone 則可以有好幾個。 - 範例
options {
directory "C:\Program Files\ISC BIND 9\etc";
zone-statistics yes;
statistics-file "C:\Program Files\ISC BIND 9\etc\data\named_stats.txt";
version "none of your business";
//限制遞迴查詢
allow-recursion {192.0.0.0/8; 127.0.0.1/32;};
//限制轉送清單
allow-transfer {192.168.2.0/24; };
forwarders {
168.95.1.1;
139.175.10.20;
8.8.8.8;
};
};
key "rndc-key" {
algorithm hmac-md5;
secret "lJNu1IKdgmnej+ZzUYAbVA==";
};
controls {
inet 127.0.0.1 port 953 allow { localhost; } keys { "rndc-key"; };
};
zone "." {
type hint;
file "named.root";
};
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update {none;};
};
zone "0.0.127.in-addr.arpa" {
type master;
file "named.local";
allow-update {none;};
};
zone "mysite1.com.tw" {
type master;
file "mysite1.com.tw.dns";
allow-update {none;};
};
zone "mysite2.idv.tw" {
type master;
file "mysite2.idv.tw.dns";
allow-update {none;};
};
logging{
channel default-log {
file "D:\ISC_BIND_log\named_default.log" versions 5 size 200m;
severity info;
print-time yes;
};
channel security-log {
file "D:\ISC_BIND_log\named_security.log" versions 3 size 100m;
severity info;
print-severity yes;
print-time yes;
print-category yes;
};
channel query-log {
file "D:\ISC_BIND_log\named_query.log" versions 10 size 200m;
severity info;
print-time yes;
};
channel lamer-log {
file "D:\ISC_BIND_log\named_lamer.log" versions 3 size 100m;
severity info;
print-severity yes;
print-time yes;
print-category yes;
};
category default { default-log; };
category security { security-log; };
category queries { query-log; };
category lame-servers { lamer-log; };
};
- options : 操作設定說明(不想看直接跳範例)
- 建立named.root(zone file)
這個就直接從 ftp://rs.internic.net/domain 直接下載最新的 named.root 就好。
- 建立localhost.zone(zone file)正解資訊檔
※藍色字在實際使用時要拿掉以免有問題
$TTL 86400 (資訊有效期)
$ORIGIN localhost. (宣告全區域屬性)
@ 1d IN SOA @ root (
42; Serial (序號:Slave判斷是否需更新檔案)
3H; Resresh (Slave自動來取得檔案的時間)
15M; Retry (若refresh失敗,再度取得檔案的時間)
1W; Expire (若refresh失敗,保留該網域的時間)
1D) ; Minimum TTL 別台DNS 伺服器保留cache的時間)
1D IN NS @
1D IN A 127.0.0.1
1D IN NS @ 為第一筆NS記錄指出本地網域名稱為localhost.
1D IN A 127.0.0.1 指出第一筆A記錄對應為本機網用名稱伺服器IP 127.0.0.1 - 建立named.local(zone file)反解資訊檔
$TTL 86400
@ IN SOA localhost. root.localhost. (
2017 ; Serial
28800 ; Resresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum TTL
IN NS localhost.
1 IN PTR localhost.
那個紅色1是本機(DNS)的IP最後一碼(本機IP是 127.0.0.1)
- 建立主機清單(zone file) mysite1.com.tw.dns 和 mysite2.idv.tw.dns檔案
這裡只做一個範例 mysite1.com.tw.dns
$TTL 86400
@ IN SOA dns.mysite1.com.tw. hostmaster.mysite1.com.tw. (
001 ;Serial
10800 ;Resresh
600 ;Retry
86400 ;Expire
3600 ) ;Minimum TTL
IN NS dns.mysite1.com.tw.
IN MX 10 sp4.mail.com.
IN MX 20 sp3.mail.com.
IN MX 30 spam.mysite1.com.tw.
webmail IN CNAME mail.mysite1.com.tw.
dns IN A 61.233.159.103
ftp IN A 61.233.159.102
mail IN A 61.233.159.99
service IN A 61.233.159.102
spam IN A 61.233.159.89
sydb IN A 61.233.159.101
webserv1 IN A 61.233.159.110
www IN A 61.233.159.76
- 清單檔案注意事項:
每個檔案結尾必須是 NewLine (換行) 字元符號。
每個條件後面必須以 ; (分號) 作為結束。
請到 『控制台』→『系統管理工具』→『服務』裡面找到『ISC BIND』,這個項目預設是沒有啟動的,然後啟動它
如果無法啟動,請到『事件檢視器』→『Windows紀錄』→『應用程式』查看來源是『named』,通常第一個錯誤是主要的訊息來源。
錯誤員因常見像是:
檔案找不到
zone 0.0.127.in-addr.arpa/IN: loading from master file named.local failed: file not found
紀錄重覆
dns_master_load: mysite1.com.tw.dns:33: webmail.mysite1.com.tw: multiple RRs of singleton type
註解放錯位置
dns_rdata_fromtext: named.local:9: near '//本機的IP': extra input text
打錯關鍵字
C:\Program Files\ISC BIND 9\etc\named.conf:78: unknown option '3'
結尾漏掉分號
C:\Program Files\ISC BIND 9\etc\named.conf:73: missing ';' before '10'
檔案結尾不是換行(NewLine)字元
localhost.zone: file does not end with newline
修正問題後,重新啟動,只要沒有重大錯誤,一般而言都可以運作的。
這時候就要恭喜你,完成DNS伺服器的架設了。
參考文章:
- http://www.weithenn.org/2009/07/bind-dns.html
- http://tnrc.ncku.edu.tw/news/900709_1.doc
- http://blog.xuite.net/allenw/kimo/19110710-%E7%94%A8BIND9+%E5%9C%A8+XP+%E6%9E%B6%E8%A8%ADDNS
- http://www.ilrc.edu.tw/data/dns.pdf
- https://dqno1.org/dqno1discuz/thread-2729-1-1.html
- http://dns-learning.twnic.net.tw/bind/intro10.html
- http://dns-learning.twnic.net.tw/bind/intro9.html
- http://dns-learning.twnic.net.tw/bind/intro8.html
留言
請問一下,我重新啟動 bind 時,一直會出現 localhost.zone: file does not end with newline,但是我確實也空行了,仍然有這行訊息出現,請問您是如何解決這個問題?
謝謝您的解答
我是空了兩行空白解決了,檔案參考 https://drive.google.com/file/d/1f-KpxjMvyMSiGh5016gvsiYDU5g2ygnA/view?usp=sharing
我嘗試用您的方法,或是多空幾格,仍有這個問題出現。
比對兩個檔案,唯一不同處只有 Serial 這一個。(目前我的是14,但覺得應該和這個也沒關系)
但是有這行,實際上仍可以運作。
不知道這個會不會影響到其他的作業。
我仍再查看是什麼問題中。
我剛又試了一次,把您給的連結裡的檔案,直接貼在localhost.zone裡,結果
這個錯訊息就沒有了。
在重新讀取這個檔案時,原序號 42 自動改了 43,
所以好像和Serial有關系。
雖然還是似懂非懂狀態,不過還是謝謝您的解答及詳細的教學。
我使用您的方法,確定有架設成功。
作業系統 win 7 pro 32bits
謝謝。