摘要:安裝 DNS 網域名稱服務 - named、bind 指令步驟 - CentOS
	 上次寫了一篇「安裝 DNS 服務 bind (named)」,該篇拖了很久一直沒詳細的寫完,只寫了初步的安裝,『如果你是要自己 make,並且不放在預設目錄』,那麼你可能會遭遇一些問題,底下就用安裝的過程指令來說明。
上次寫了一篇「安裝 DNS 服務 bind (named)」,該篇拖了很久一直沒詳細的寫完,只寫了初步的安裝,『如果你是要自己 make,並且不放在預設目錄』,那麼你可能會遭遇一些問題,底下就用安裝的過程指令來說明。
前言:使用關鍵字「named、安裝、centos...等」來搜尋就可以找到一大堆的說明文章,而且眾網友也都說明的很詳細,故在此我僅以簡略的說明安裝過程,及其遭遇到的問題處理。
如果:你是使用套件安裝 yum、rpm 等,你可以不需要看下去。
************************************************
BIND 的官網:https://www.isc.org/software/bind
安裝步驟 指令+說明
- 
		sudo yum install -y openssl openssl-devel    
 //安裝 openssl 套件
- 
		sudo yum install -y gcc    
 //安裝 gcc 套件
- wget http://ftp.isc.org/isc/bind9/9.9.2-P2/bind-9.9.2-P2.tar.gz //下載新版的 9.9.2 bind Source
- 
		tar zxvf bind-9.9.2-P2.tar.gz      
 //解壓縮、解包裝
- 
		cd bind-9.9.2-P2                           
 //進入剛剛解開的目錄
- 
		./configure --prefix=/var --sysconfdir=/etc/ --localstatedir=/var --enable-threads --with-openssl=yes CFLAGS="-DDIG_SIGCHASE"
 //對 Bind 的安裝環境、路徑做設定
 // 分別是 bind安裝路徑、named.conf放的路徑、狀態路徑、啟用thread執行緒、啟用openssl、啟用DNSSEC的 validation 功能
- 
		make
 //編譯 compiler BIND 的原始檔
- 
		make -n install
 //測試安裝
- 
		sudo make install
 //安裝BIND到系統去,他會依你 configure 所指的路徑去放
- 
		ls -al /dev/urandom
 //觀看 urandom 檔案是否存在
- 
		sudo /var/sbin/rndc-confgen -r /dev/urandom -a
 //利用rndc-congen 以hmac-md5 產出secret 的 hash key,放在 --sysconfdir 所指定的路徑
- 
		sudo mkdir /var/named
 //建立 BIND 設定 zone file 的路徑目錄
- 
		wget -O named.root ftp://ftp.internic.net/domain/named.root
 //取得 DNS ROOT 的資料
- 
		sudo mv named.root /etc/
 //搬到 /etc 目錄下
- 
		wget http://ftp.isc.org/isc/bind9/keys/9.8/bind.keys.v9_8
 //抓取新版BIND的KEY
- 
		more /etc/bind.keys
 //然後跟現有的KEY做個比對,相同的話就不需要更換了
- 
		sudo vi /etc/named.conf
 //開始編修你的 named.conf ,這個檔案最重要但卻沒樣版的 example,因為
 『 Isn't "make install" supposed to generate a default named.conf?There really isn't a default configuration which fits any site perfectly.』Short Answer: No. 
 如果真不知道怎麼開始可以參考:http://ostechnix.wordpress.com/2013/01/25/setup-dns-server-step-by-step-in-centos-6-3-rhel-6-3-scientific-linux-6-3-3/
 /etc/named.conf 裡就要指定每個 zone files 所要放的路徑跟名稱,所以下面三個動作,請依你自己的環境修改
- 
		sudo mkdir /var/named/domain 
- 
		sudo mkdir /var/named/reverse 
- 
		sudo mkdir /var/named/slaves 
- 
		sudo useradd named
 //步驟21,22 是為了將 named 的執行身份以特殊帳號 named 來執行,避免直接使用 root 身份,以免 BIND 漏洞造成系統整個權限淪陷,後面執行 named 也會以 /var/sbin/named -u named 來執行。
- 
		sudo groupadd named
 //新增 named 群組
- 
		sudo chown named:named -R /var/named
 //變更 /var/named 目錄的權限給 named 帳號,這樣做 zone transfer 時才有辦法寫入
- 
		sudo /var/sbin/named -u named
 //以 named 身份來執行
- 
		sudo tail -500 /var/log/messages
 //觀看系統LOG是否有什麼錯誤訊息
- 
		ps -elf | grep name
 //觀察 named 是否有執行,當 named.conf 或 /etc/init.d/named 有誤時,不見得畫面上會出現錯誤訊息,建議要多觀察 log 與觀看 process 是否有執行
- 
		---↑↑↑ 上面是安裝 BIND 所需要的步驟---
 ---↓↓↓ 下面是自動執行 named 所需要的設定 ---
- 
		chkconfig
 //先觀察 named 是否有在清單中
- 
		chkconfig named on 
 //觀察後,你可以以這種方式讓 named 在 system level 2,3,4,5 都會執行,當然你也可以單獨指定只有那個(些) level 再執行
- 
		service named start
 //這一步驟,如果你是用套件方式安裝,你根本不會遇到問題,但是使用自己 make 方式,就會很容易出錯。
 //原因在於目錄 /etc/init.d/ 裡 沒有預設 named 這個檔案,所以 service 也就不知道怎麼讓 named 啟動、停止、重新啟動。你必須給予一段 script 定義這個 service 在這三個動作的時候,各該怎麼辦?這裡「http://forum.directadmin.com/archive/index.php/t-30796.html」有 named script 的參考內容。
 //但是如果你跟我一樣,在 configure 時有去修改「--prefix=/var」,那麼一堆執行檔預設會裝在 /usr/sbin 的都會改安裝到 /var/sbin,也就會造成這個例子的 script 無法直接使用
 // 另外因為 named 的版本不同,這版 9.9.2 的 named 並沒有 -D (Enable dynamic management of the forwarding table with D-BUS messages.) 的參數用法,你也必須將 OPTIONS 做一些修改,不然你就無法以 service 的方式執行。(當然你還是可以用 rc.local 裡寫 /var/sbin/named -u named 的方式執行,但這畢竟是不好的。)
- 
		sudo vi /etc/init.d/named 
 // 那麼就依造你的環境來去修改這個檔案吧!!
- 
		service named start
 // 改好了,就可以以輕鬆的管理方式來啟用、停止 named 這項服務了。
- 
		sudo tail -100 /var/log/messages
 // 最後也再看一下 LOG 看是否還有錯誤存在。
- 
		dig +dnssec +multiline nctu.edu.tw @127.0.0.1 
 // 另都完成後,就可以測試網域名稱查詢,跟測試 DNSSEC 的簽章了。
列出了上面三十幾點,唉阿~還是沒辦法很清楚的交代整個處理的過程,有些小細節都藏在 vi 編輯檔案裡頭,而每個人的環境又不完全一樣,即使我全列出來也沒用,就提供這個自己 make 過程給大家參考囉~
MEMO:
- bind make 跟 安裝很簡單,問題在於寫自己需要的 /etc/named.conf 跟 zone files。
- 自己 make 服務的一些設定要自己來,所以 /etc/init.d/named 必須自己加上去,並依照環境做出些改。
- 建議使用獨立帳號來執行 named 服務(使用套件安裝會自動做這一塊)
- 
		前面沒寫~當你的DNS要提供對外服務時,記得開 53 port 的 tcp 跟 udp 唷!
 -A Firewall-Rule -p tcp --dport 53 -j ACCEPT
 -A Firewall-Rule -p udp --dport 53 -j ACCEPT
- 在我的環境下常常/每天 都有人在 try DNS 的服務(denied query),建議安裝 fail2ban來阻擋這一塊。
----fail2ban DNS 的設定 ------------------------------------------------------
Step 1: 修改 sudo vi /etc/named.conf 將 logging 的區塊改成
	 logging {
	     channel security_file {
	         file "/var/log/named/security.log" versions 3 size 30m;
	         severity dynamic;
	         print-time yes;
	     };
	     category security {
	         security_file;
	     };
	 };
註:versions 3 size 30m 意思為保留三份,每份 30MB
Step 2:修改 sudo vi /etc/fail2ban/jail.conf 然後修改底下標紅色字的地方
	[named-refused-udp]
	enabled  = true
	filter   = named-refused
	action   = iptables-multiport[name=Named, port="domain,953", protocol=udp]           sendmail-whois[name=Named, dest=you@example.com]
	logpath  = /var/log/named/security.log
	ignoreip = 168.192.0.1
	
	# This jail blocks TCP traffic for DNS requests.
	[named-refused-tcp]
	enabled  = true
	filter   = named-refused
	action   = iptables-multiport[name=Named, port="domain,953", protocol=tcp]           sendmail-whois[name=Named, dest=you@example.com]
	logpath  = /var/log/named/security.log
	ignoreip = 168.192.0.1
Step 3:觀察 sudo /sbin/iptables -L -n 防火牆的阻擋情形,例如
	Chain fail2ban-NAMED (2 references)
	target     prot opt source               destination
	DROP       all  --  1.160.182.131        0.0.0.0/0
	DROP       all  --  221.130.199.67       0.0.0.0/0
	....... 
-----------------------------------------------------------
~End
