網域名稱服務(Domain Name Service, DNS)是建立伺服器服務的基本功能,雖然說一般的網站管理人員可以選擇把DNS交給ISP或是域名管理單位進行代管,不過大多數的代管單位都有數目上的限制,而且只限於簡單的 A 及 MX Record,如果有多個domain需要管理,然後又常常需要變更DNS的名稱,通常自行管理是一個比較好的選擇,不過如果您只有一個網站,或是很單純的機器是在外部的機器代管,那麼只需使用簡單的代管服務或是工具管理即可,不需要那麼麻煩又管理一個服務~
如果要自行管理您的DNS,那麼請在自已的域名管理單位(筆者是亞太)將其設定為「自行架設DNS」,並設定二組不同的DNS位置(可以設定同一組IP,兩組不同名字),如下圖所示:
接下來請在自已的主機上安裝二個RPM,由於我們等會要設定chroot的環境,那什麼是chroot?又為何要設定chroot呢?簡單來說就是要增加系統的安全性,把運行的根目錄用chroot限制於特定的目錄下,減少被存取到 /etc/目錄下內容的機會,所以一般來說都會建議採用chroot的環境~DNS在Linux的環境上,預設都是用Bind,安裝指令為:
#yum install bind bind-chroot -y
由於系統預設會使用mount –bind的指令,將bind的環境掛在chroot環境中,以下的目錄和檔案,在啟用bind-chroot後就會被mount至/var/named/chroot下:
/etc/named /etc/pki/dnssec-keys /run/named /var/named /usr/lib64/bind or /usr/lib/bind (視平台而定)
以下的檔案也會被掛載到/var/named/chroot中:
/etc/named.conf /etc/rndc.conf /etc/rndc.key /etc/named.rfc1912.zones /etc/named.dnssec.keys /etc/named.iscdlv.key /etc/named.root.key
編輯(請使用vim指令)/etc/named.conf,編輯內容如下:
options { listen-on port 53 { xxx.xxx.xxx.xxx; }; #設定成你的主機IP listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { any; }; recursion no; dnssec-enable yes; dnssec-validation yes; dnssec-lookaside auto; bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key"; zone "yourdomain" { #例:kevinlinul.idv.tw type master; file "/etc/named/yourdomain.hosts"; #一般是設定成您的「domain.hosts」 };
接下編輯(請用vim)/etc/named/yourdomain.hosts這個檔案,在此我們以kevinlinul.idv.tw這個domain為例,設定2組A Record。
$ttl 38400 kevinlinul.idv.tw. IN SOA kevinlinul.idv.tw. kevin\.linul.gmail.com. ( 2014091101 #serial,代表序號,可以設定一個你覺得有意義的數字, #數字愈大愈新,若有架設slave DNS,則此序號比slave大 #時,會將資料更新到slave上。 10800 #Refrest,設定slave(若有架設的話)多久更新一次記錄 3600 #Retry,設定slave(若有架設的話),在更新失敗後多久 #後再試一次 604800 #Expire,設定slave(若有架設的話),在更新失敗後多久 #中止更新動作 38400 ) #minimun,TTL,也就是其他DNS Cache這個DNS資料不會 #超過這個時間 kevinlinul.idv.tw. IN NS kevinlinul.idv.tw. #指定服務該domain的DNS主機名稱 kevinlinul.idv.tw. IN A xxx.xxx.xx.xxx #指定kevinlinul.idv.tw.的IP位 #址,請注意後面要加「.」 blog.kevinlinul.idv.tw. IN A xxx.xxx.xx.xxx #新指定一台主機 #blog.kevinlinul.idv.tw,請注 #意後面要加「.」 www IN A xxx.xxx.xx.xxx #新指定一台主機 #www.kevin.idv.tw,只設定主機名 #稱,系統會自動加上後面的domain
第一行「kevinlinul.idv.tw. IN SOA kevinlinul.idv.tw. kevin\.linul.gmail.com.」中,kevinlinul.idv.tw是代表domain,也可以用「@」符號取代,SOA代表開始後面的認證授權資料,「kevin\.linul.gmail.com.」就是email,等同於「kevin.linul@gmail.com」請注意最後要加一個「.」,沒加的話,系統會自動把domain加上,就會變成「kevin.linul@gmail.com.kevinlinul.idv.tw」,這樣就錯了。
存檔後離開,用以下指令啟動DNS服務:
#systemctl restart named-chroot.service #systemctl enable named-chroot.service #systemctl disable named.service
啟動成功後,您可以至/var/named/chroot/etc 及 /var/named/etc/named 目錄中,可以發現剛剛設定的檔案都被掛載上去了~這就代表啟動成功。
接下來可以用nslookup這個指令來測試剛剛兩筆記錄是不是正確:
#nslookup > server xxx.xxx.xx.xxx #你架設的dns IP位置 Default server: xxx.xxx.xx.xxx Address: xxx.xxx.xx.xxx#53 > www.kevinlinul.idv.tw Server: xxx.xxx.xx.xxx Address: xxx.xxx.xx.xxx#53 > blog.kevinlinul.idv.tw Server: xxx.xxx.xx.xxx Address: xxx.xxx.xx.xxx#53
如果都有出現,代表你的DNS已架設完成囉!