鳥哥的私房菜 http://linux.vbird.org/linux_server/0350dns.php#DNS_Zones
對了,除了鳥哥,還有個地方可以去看看:TWNIC的dns教學計畫 http://dns-learning.twnic.net.tw/
確定電腦能上網了後,如果是要弄內部虛擬機器互連之類的,記得先進入/etc/resolv.conf 修改nameserver的IP變成你準備設置Dns主機的位置喔!這個檔案一般來說剛把主機設定好就會順帶寫好,如果忘記了就自己快點加上吧~以下整理內容僅獻給健忘症的自己~ 2010.10.19後記:剛好學校的dns server掛掉,結果上網google關鍵字centos dns,赫然發現自己很久以前寫下的那篇居然比鳥哥還前面!真是太神奇了! 所以,也把那篇連結放進來這裡囉,呵呵! http://blog.xuite.net/zoro00000/blog/20712222 還有還有,這篇寫得真好! http://blog.weithenn.org/2009/04/centosbind9-domain-nameip.html ----------------------------------------------------------1.預設環境---------------------------------------------------------------------- vi /etc/resolv.conf nameserver 163.19.1.1 簡單說明一下:nameserver 168.95.1.1 domain jges.edu.tw search jges.edu.tw nameserver就是上層單位的Dns位置,最多三個,從上而下進行逐層的搜尋,都找不到就不能dns啦~要設對才能上網喔! domain則是當輸入的名稱例如www無法被解析時,自動會被加入後面字串再嘗試解析,也就是在這邊會變成www.jges.edu.tw search的功能基本上和domain相似,不過domain是本地端有優先權,其他想自動加入的就都可以掛在search底下發揮囉. ----------------------------------------------------------------------------------------------------------------------------------- 還有還有,像ubuntu之類沒有預設開啟DNS的機器上記得要先輸入service bind9 start開啟bind的功能啦~(bind後的數字自己看看版本吧,建議使用Bind9,bind的維護網站:http://www.isc.org/software/bind ) 1.設定檔傳統上是/etc/named.conf ,CentOS現在為了安全性放在/var/named/chroot 2.一般來說, CentOS 的預設目錄是這樣的:
* /var/named/chroot/etc/named.conf :這就是我們的設定檔啦! * /etc/named.conf :這也是我們的設定檔啦!
* /etc/sysconfig/named :是否啟動 chroot 及額外的參數,就由這個檔案控制;
* /var/named/ :資料庫檔案預設放置在這個目錄
* /var/run/named :named 這支程式執行時預設放置 pid-file 在此目錄內。
順帶一提,ubuntu底下的檔案都是放在/etc/bind喔~ 3. DNS 伺服器的架設需要上層 DNS 的授權才可以成為合法的 DNS 伺服器。
4. named 是否啟動成功務必要查閱 /var/log/messages 內的資訊!
一個完整的DNS設定案例內容需包含六個檔案,例如dns1位於163.19.1.1的整個class c領域jges.edu.tw:
底下預設幾台主機來對應:
163.19.1.1 163.19.1.2 dns1和dns2 163.19.1.3 163.19.1.4 www.jges dns.jges linux.jges 163.19.1.30 mail 163.19.1.31 imap(第二台mail主機) 163.19.1.50 dept1.jges.edu.tw網域的第一台dns 163.19.1.51 dept1.jges.edu.tw網域的第二台dns ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
Bind這個DNS程式的設定檔named.conf 主要的作用在於定義 named的功能項目 內容可包含4個部分,分別為: *options *關於 .(root) 的內容 *關於 localhost 的正反解 *關於其他 domain 的正反解 然後,在named.conf當中,可設定的伺服器型態有5種: (也就是等一下會看到的type) master: 主要伺服器,在網域中負責名稱解析。 slave: 避免master發生故障時影響網路上的名稱解析工作,可以安裝其他的DNS伺服器,並會定期複製master中的資料。 stub: 與slave類似,但只會複製master的NS紀錄,而非所有區域(zone)資訊。 hint: 表示為root伺服器。 forward: 可將來自用戶端的名稱解析要求代為轉送至其他伺服器。 (本文未提,流量大時比較好用喔!) vi /var/named/chroot/named.conf
(這個檔案中註解寫法是//)(;代表到此為止,每行都要加喔!) options {
directory "/var/named"; //指定Server中有關的zone file的設定檔儲存路徑
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
pid-file "/var/run/named/named.pid"; //代表dns服務的pid名稱,通常用預設
forwarders { 163.19.1.1;168.95.1.1; };
allow-query { any; }; // 是否允許被查詢?當然要可以被查詢;
allow-transfer { none; }; // 一定要寫,定義哪些IP可與此DNS做AXFR,是否允許傳送 zone ,預設為none,不寫就是被看光啦~
};
include "/etc/rndc.key"; // 關於 DNS 伺服器的一些加密資料,看不懂就先忽略!
// 關於 root (.) 的設定喔:
zone "." {
type hint; // 特殊的類別!專給 root (.) 用的,表示如果沒有資料就可以到根伺服器查詢
file "named.root"; // 就是檔名的定義啦!
};
// 關於本機 localhost 的正反解
zone "localhost" {
type master;
file "localhost.fwd";
};
zone "0.0.127.in-addr.arpa" {
type master;
file "localhost.rev";
};
// 這裡規範出我們的 jges.edu.tw 領域名正反解,in-addr.arpa是固定的反解格式,不可改
zone "jges.edu.tw" {
type master;
file "jges.fwd";
allow-transfer {163.19.1.2/32;}; //可加可不加,看有沒有slave的需求. };
zone "1.19.163.in-addr.arpa" {
type master;
file "jges.rev";
allow-transfer {163.19.1.2/32;}; };
zone "jges.edu.tw" { //這串字只是為了做slave的例子才加入的,請寫入在163.19.1.2這第二台dns上 type slave; masters { 163.19.1.1; }; file "slave.jges.fwd"; //這邊是指slave這台電腦的dns備份檔要放哪邊 allow-transfer {none;}; }; zone "1.19.163.in-addr.arpa" { //這串字只是為了做slave的例子才 加入的,請寫入在 163.19.1.2這第二台dns上 type slave; masters { 163.19.1.1; }; file "slave.jges.rev"; allow-transfer {none;}; }; allow-transfer參數可以在單一的zone內設定定義喔! 還有上面的file"檔名"當中的檔名都可以自己亂取,不過要記得就一定要做好相對名稱的檔案就是啦~ 反解的例子:163.19.1.xx這個區段的反解寫法就一定是1.19.163.in-addr.arpa,不能亂改喔! arpa 是美國國防部計畫的縮寫,in-addr是Internet Address的意思,如果是用於ipv6的反解,請將in-addr改成ip6 ----------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------
接下來是named.root這個檔,大家都用一樣的就好了,下載網址:ftp://rs.internic.net/domain/named.root ,這個檔很重要,DNS解析查詢都會先到這個檔案裡! ----------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------- 呃,底下會看到一個萬惡的@符號,這其實就是您自己在named.conf當中定義的那個領域啦!就是$ORIGIN後面接的東西,也就是說在這裡是zone"xxxx"當中那個xxxx的意思!
這個符號花了我很久很久很久的時間我才看懂..........奇怪了...除了自己笨之外,可能都要怪鳥哥沒有寫$ORIGIN.......冏 還有IN,代表的是internet類別的意思.(目前除了IN,也別無其他類型囉) ------------------------------------------------------------分隔線上面是重要的說明-------------------------------------------------
典型的SOA RR如下: xxx.edu.tw 1D IN SOA ns1.xxx.edu.tw HostMaster.xxx.edu.tw ------------------------------------------------------------------------------- vi /var/named/chroot/var/named/jges.fwd (這種檔案中註解寫法是;)
$TTL 86400 ;整個程式的宣告時間,以秒為單位的資源記錄時間喔 $ORIGIN jges.edu.tw. ;整個程式的宣告開頭網域,也可以不用設定,說明底下沒有使用.而省略的網域為何,可以在不同段落改變宣告成自己需要的子網域,沒設定就以named.conf中的zone為準.建議一定加上. ;下面這行請照抄,翻譯成文字也就是 jges.edu.tw. IN SOA jges.edu.tw. 後面接上root的email位址.(據說SOA後面接的jges.edu.tw.是給做slave dns的機器看的,所以在這邊應該改成dns1.jges.edu.tw.或更偷懶的dns1 @ IN SOA dns1.jges.edu.tw. root.jges.edu.tw.
;這邊有個該死的 " . " ,這東西一定要加喔!如果忘記加後面會自動加上zone的名稱!例如localhost忘記加.就自動被變成 了localhost.localhos.啦!當然,底下可以看到例如www之類後面不加點的也是這個.的妙用~請參照前幾行寫的$ORIGIN ( 20100705001 ;Serial , 僅作為序號而已,不過一更新請記得就要做調整,不然slave可是不會來抓的喔!
28800 ; Refresh slave 伺服器的更新時間
14400 ; Retry 當 slave 主機更新失敗,多久再重新更新一次
720000 ; Expire 重複 retry 多久後就宣告不治....不再更新
86400 ) ; Minimum 可視為 TTL ,尤其是你沒有設定 $TTL 時
@ IN NS localhost. ;這邊看@不順眼可以改成localhost.或想寫成 @ IN NS @ 也行!
localhost. IN A 127.0.0.1
;(這邊的意思是此zone的DNS伺服器主機名稱與 IP 的相互對應,確保localhost可以正確解出127.0.0.1) 應該要有的對應模式如下(有NS就有A) jges.edu.tw. IN NS dns1.jges.edu.tw. ;<==這邊的dns1.jges.edu.tw.就是您用來登記在上層單位DNS的名字喔!不能亂改 jges.edu.tw. IN NS dns2.jges.edu.tw. dns1.jges.edu.tw. IN A 163.19.1.1 dns2.jges.edu.tw. IN A 163.19.1.2 ;-----------循序負載分攤功能(round robin),可以用來減輕單一server被查詢到的負擔,也可以做多個異地備援喔!--------- www IN A 163.19.1.3 www IN A 163.19.1.4 www IN A 140.113.40.35 ;<====這邊假設是放到交大做備援 ;------------------別名CNAME的用法(盡量用 A來代替CNAME),這邊的3600是獨立的TTL的意思-------------------- www2.jges.edu.tw. 3600 IN A 163.19.1.1 ftp.jges.edu.tw. 3600 IN CNAME www2.jges.edu.tw. ;--Mail Server的用法,不加也可以,不過寄信查詢一定會先查MX,再查A,所以可以用來過濾信件,而不掛MX也會影響效能--- @ IN MX 10 mail ;<====這邊的10和20是收寄信順位喔~數字小的會先收到信,如果數字相同就二選一收到 @ IN MX 20 imap mail IN A 163.19.1.30 imap IN A 163.19.1.31 ;-----------------------底下是加上子網域dns伺服器的寫法,這邊的子網域是dep1.jges.edu.tw------------------- $ORIGIN dep1.jges.edu.tw. IN NS dns1 IN NS dns2 dns1 IN A 163.19.1.50 dns2 IN A 163.19.1.51 ;*正解檔裡面好多個A,後面的IP到底能不能重覆呢?根據老師的說法是可以的,不過聽說最好不要. ------以上就是基本正解常用的囉,非寫反解檔不可的請看底下直接依樣畫葫蘆囉,差別最大的是PTR和ORIGIN後面接的東東------
vi /var/named/chroot/var/named/jges.rev $TTL 86400 $ORIGIN 1.19.163.in-addr.apra. @ IN SOA dns1.jges.edu.tw. root.jges.edu.tw. ( 2010072901 ; Serial 28800 ; Refresh 14400 ; Retry 3600000 ; Expire 86400 ) ; Minimum IN NS dns1.jges.edu.tw. 1 IN PTR dns1.jges.edu.tw. ;這裡有個"1" 也有個PTR ,都是這個反解檔必備的,自己想想為什麼要用1..(提示:反推回來,想想之前那該死的點) *還有,如果沒有開起來的機器請不要亂弄正反解....會抓不到...冏 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 呃,上面的說明太長了,簡單來說,正解寫出來會變成底下這樣: vi /var/named/chroot/var/named/jges.fwd
------------底下是樣品的例子,加不加就看情況啦-------
----------------------------------------------------------------------------------------------------------------
特別加映!
關於SOA Start of Authority。
這個標誌代表著 master/slave 相關的認證、授權資料。 不論你的 DNS 系統有沒有設定 master/slave 的架構,都需要含有這個設定才好。 SOA 後面共帶有三個參數,所以該行為: [zone] IN SOA [主機名] [管理員 email] ([五組更新時間參數])
每個設定項目可以這樣看:
* 主機名:就是 master DNS 的主機名稱,通常填寫本身主機名即可。還是要注意那個小數點的存在與否喔!非常重要!
* 管理員 email:本來應該是 "root@localhost." 的,不過因為 @ 已經被作為特殊代號 (zone), 所以就用小數點來取代,因此 email 就成為 "root.localhost." 囉!
* (五組數字):這五個數字分別代表 serial, refresh, retry, expire, ttl。
至於那五個數字的意義是這樣的:
1. Serial :是一個序號,但這個序號可被用來作為 slave 與 master 更新的依據。 舉例來說, master 序號為 100 但 slave 序號為 90 時,那麼這個 zone file 的資料就會被傳送到 slave 來更新了。 由於這個序號代表新舊資料,通常建議可以利用日期來設定!
2. Refresh :除了根據 Serial 來判斷新舊之外,我們可以利用這個 refresh(更新) 命令 slave 多久進行一次主動更新;
3. Retry :如果到了 Refresh 的時間,但是 slave 卻無法連接到 master 時, 那麼在多久之後,slave 會再次的主動嘗試與主機連線;
4. Expire :如果 slave 一直無法與 master 連接上,那麼經過多久的時間之後, 則命令 slave 不要再連接 master 了! 也就是說,此時我們假設 master DNS 可能遇到重大問題而無法上線,則等待系統管理員處理完畢後, 再重新來到 slave DNS 重新啟動 bind 吧!
5. Minimun :這個就像是 TTL 啦!
另外,這幾個數字的大小是有限制的!要瞭解:
* Serial <= 2^32 = 4294967296
* Refresh >= Retry * 2
* Refresh + Retry < Expire
* Expire >= Retry * 10
* Expire >= 7Days
-------------------------------------------------------------------------------------------------------------------------------
其他符號一覽表:
------------------------------------------------------------------------------------------------------------------------------------------
寫在最後面,一般單位到這裡就做完正解了,反解就丟給上層單位那些領更多錢或更厲害的人去做吧!(攤手)
呃,當然,如果很不幸的網管人員,還是有空弄一下反解比較好囉~ 啟動DNS很簡單,輸入
/etc/init.d/named start (或restart)
但是這個啟動可不見得是成功的!因為dns的上層更新速度和設定的TTL有極大關係,所以可能真要等半天一天的才能看到實際的後果!還有,我們除了用nslookup和dig指令可以檢測外,鳥哥說:『務必』要去 /var/log/messages 觀察過才行!
dig 網址 any <===追蹤,找出與該網址查詢結果有關的dns紀錄都丟出來 dig +trace 網址 <===追蹤,找出與該dns查詢經過的路徑 dig @網址 網址 <===指定在第二個網址上查詢第一個網址的dns紀錄 traceroute 網址 <===追蹤,找出經過路徑,並顯示正反解(只寫出IP卻沒名字就是沒設反解啦~) 呃,還有一個很棒的套件叫做「dnstop」,長得很像內建用來觀察系統流量的「top」,可以用來做出多種不同的觀測喔!要裝!網址:http://dns.measurement-factory.com/tools/--------------------------DNS其他的應用,SPF(需要重新編譯),請參考http://phorum.study-area.org/viewtopic.php?t=18000------------SPF(Sender Policy Framework): 主要使用dns的TXT記錄說明此網域的發信來源有哪些 詳情請查閱RFC 4408 |