文檔說明:
本文檔以一個案例來介紹如何在CentOS 7系統上部署DNS服務。該案例僅是我對如何部署DNS服務的知識總結,並非是生產環境中存在的案例。並且,該案例中用到的CentOS系統均是安裝在VMware虛擬機內的,雖然一般情況下這不會有什麼不妥,但還是特別說明一下。
案例說明:
本案例使用了兩臺VMware虛擬機。兩臺虛擬機上均安裝CentOS 7(詳細版本號爲7.0.1406,核心版本號爲3.10.0-123.el7.x86_64),其中一臺虛擬機用於模擬Master DNS服務器(假設IP爲172.31.2.2),另一臺虛擬機用於模擬Slave DNS服務器(假設IP爲172.31.2.3)。
並且,假設DNS服務器所在園區網有自己的合法域名,爲speedsnail.com,允許所有來源的主機對該域名進行解析。而當園區網內的主機要訪問外網域名時,DNS服務器會先查本地緩存,查不到則將該解析請求轉發給ISP的DNS服務器(假設IP爲202.96.128.86和202.96.128.166),而不是轉發給.(root)服務器。並且,只會對內網主機的解析請求進行轉發(假設內網網段範圍爲172.31.0.0/16),而不會對外網主機的解析請求進行轉發。
DNS服務簡要介紹:
DNS服務由BIND軟件提供,啓動後服務名爲named,管理工具爲rndc,debug工具爲dig。主要配置文件爲/etc/named.conf。
要架設本案例中DNS服務,可按照如下步驟進行:
1. 在chroot環境下安裝BIND軟件
要安裝BIND軟件,並讓它運行在chroot環境下。那麼只需安裝bind-chroot軟件,其它軟件(包括BIND軟件本身)也會自動進行安裝,也即只需執行命令:
[root@localhost~]# yum install bind-chroot
執行上述命令後,yum程序就提示安裝/升級下述軟件了:
安裝完成後,就需要啓動named-chroot服務,並將它設置爲開機啓動:
[root@localhost ~]# systemctl start named-chroot
[root@localhost ~]# systemctl enablenamed-chroot
上述命令執行完後,如果沒什麼問題,可使用下述命令來驗證named-chroot服務的狀態:
[root@localhost ~]# systemctl status named-chroot
2. 設定主DNS服務器上的配置文件/etc/named.conf
在修改主DNS服務器上的配置文件/etc/named.conf之前,先對其備份:
[root@localhost~]# cp –a /etc/named.conf/etc/named.conf.raw
然後將其內容修改成如下所示:
-------------------------------------------------------------------------------------------------------------------------------------
options {
listen-on port 53 { any; }; //偵聽來自任意源IP對端口53的訪問
listen-on-v6 port 53 { ::1; }; //設定IPv6偵聽端口的,因爲沒有用到,所以保持默認
directory "/var/named"; //該項設定工作目錄
dump-file "/var/named/data/cache_dump.db"; //執行命令rndcdumpdb後會把database保存到該指定檔案
statistics-file "/var/named/data/named_stats.txt"; //執行命令rndcstats後會把統計數據保存到該指定檔案
memstatistics-file "/var/named/data/named_mem_stats.txt"; //記錄內存使用數據的文檔路徑
allow-query { 172.31.0.0/16; }; //指定只有內網網段主機才能進行DNS查詢(authoritative data)
recursion yes; //這個選項控制是否開啓服務器的遞歸查詢功能
allow-recursion { 172.31.0.0/16; }; //指定只有內網網段主機才能進行遞歸查詢
forward first; //接收到查詢請求時,會先轉發到forwarders指定的DNS,查不到再執行遞歸
forwarders { //(接上面)當然,在轉發之前,還會先查本地緩存
202.96.128.86;
202.96.128.166;
};
dnssec-enable no; //這部分是設置DNSSEC的。把它關掉,默認爲yes。
dnssec-validationno; //關掉,默認爲yes。
dnssec-lookaside no; //關掉,默認爲auto
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
pid-file"/run/named/named.pid"; //named服務的PID文件存放位置,保持默認。
session-keyfile "/run/named/session.key"; //TSIG會話密鑰存放文件路徑,保持默認。
};
logging { //設置日誌的語句
channel default_debug {
file"data/named.run";
severity dynamic;
};
};
zone "." IN { //設定root zone的語句
type hint; //hint類型專門用於root域
file "named.ca"; //root域的配置文件爲/var/named/named.ca
};
zone "speedsnail.com" IN { //設定域speedsnail.com的語句
type master; //指明本服務器是這個域的主DNS服務器
file "speedsnail.com.zone"; //指定這個域的配置文件爲/var/named/speedsnail.com.zone
allow-transfer { 172.31.2.3; }; //指定這個域的從DNS服務器的IP
allow-query { any; }; //允許來自任意IP對這個域的解析請求
};
include"/etc/named.rfc1912.zones"; //zone語句也可以寫在這個文件裏面
include "/etc/named.root.key"; //root域的key文件,與DNSSEC有關
-------------------------------------------------------------------------------------------------------------------------------------
3. 設定主DNS服務器上的zone配置文件
在上面的配置文件named.conf中,因爲有定義一個正向解析的域speedsnail.com,所以也要設定這個域的配置文件speedsnail.com.zone。在工作目錄/var/named下創建這個配置文件,並將它的內容修改成如下所示:
-------------------------------------------------------------------------------------------------------------------------------------
$ORIGIN speedsnail.com.
$TTL 86400
;
;在zone的配置文件中,它是以分號來作爲批註語句標識符的。
;修改這個配置文件時,要注意,名稱最後面沒有加句點的是主機名,最後面加了句點的是FQDN(除了$ORIGIN那裏)。
;$ORIGIN那裏填域名。下面的@符號會引用這裏填寫的值。如果不填,則會引用主配置文件中zone語句後面的值。
;$TTL表示timeto live值,表示當其它DNS查詢到本zone的DNS記錄時,這個記錄能在它的DNS緩存中存在多久,單位爲秒。
;
@ IN SOA dns1.speedsnail.com. xie.speedsnail.com. (
2015040101
21600
3600
604800
86400 )
;
;SOA後面的兩個參數分別是主DNS服務器主機名和管理者郵箱([email protected])。因爲@符號有特殊含義,所以寫成這樣。
;括號內的第一個參數是序號,代表本配置文檔的新舊,序號越大,表示越新。每次修改本文檔後,都要將這個值改大。
;第二個參數是刷新頻率,表示slave隔多久會跟master比對一次配置檔案,單位爲秒。
;第三個參數是失敗重新嘗試時間,單位爲秒
;第四個參數是失效時間,單位爲秒。
;在BIND9中,第五個參數表示其它DNS服務器能緩存negative answers的時間,單位爲秒。
;
@ IN NS dns1.speedsnail.com.
IN NS dns2.speedsnail.com.
dns1 IN A 172.31.2.2
dns2 IN A 172.31.2.3
;
;類型NS定義指定域的DNS服務器主機名(如dns1.speedsnail.com),不管是主DNS還是從DNS。
;類型A定義指定主機(如dns1)的IP地址。如果是使用的IPv6地址,則需使用類型AAAA。
;
@ IN MX 10 mail1.speedsnail.com.
IN MX 20 mail2.speedsnail.com.
mail1 IN A 172.31.2.4
mail2 IN A 172.31.2.5
;
;類型MX定義指定域的郵件服務器主機名(如mail1.speedsnail.com)。
;MX後面的數字爲優先級,越小越優先。同樣的優先級值則可以在多臺郵件服務器之間進行負載分擔。
;
www IN CNAME servs.speedsnail.com.
ftp IN CNAME servs.speedsnail.com.
servs IN A 172.31.2.6
;
;類型CNAME用於定義別名。通常用於同一臺主機提供多個服務的情況。
;以這裏的設定爲例,當要解析ftp.speedsnail.com的IP時,它會解析成主機servs.speedsnail.com的IP。
;
forum IN A 172.31.2.7
travel IN A 172.31.2.8
IN A 172.31.2.9
;
;如上面所示,也可以直接設定某一臺主機(如forum.speedsnail.com)的IP。
;同一臺主機(如travel.speedsnail.com)也可以設定多個IP。
-------------------------------------------------------------------------------------------------------------------------------------
4. 設置從DNS服務器
重複第1個步驟,給從DNS服務器安裝bind-chroot軟件,然後設置開機啓動並將它開啓。做好後,就修改從DNS服務器的主配置文件/etc/named.conf。從DNS的主配置文件與主DNS的基本相同,因此直接把配置複製過去就行,但zone語句需要進行修改。如下所示,從DNS的named.conf配置文件中的zone語句:
-------------------------------------------------------------------------------------------------------------------------------------
zone "speedsnail.com" IN {
type slave; //指明本服務器是這個域的從DNS服務器
file "slaves/speedsnail.com.zone"; //從DNS的zone配置文件一定要放置在工作目錄下的slaves目錄中
masters { 172.31.2.2; }; //指定這個域的主DNS服務器的IP
allow-query { any; }; //允許來自任意IP對這個域的解析請求
};
-------------------------------------------------------------------------------------------------------------------------------------
與主DNS不同的是,從DNS上的zone配置文件不需要手動建立,它會通過同步自動建立。因此,從DNS上的配置文件這樣就設置好了。
5. 放通端口
在主DNS和從DNS服務器上放通tcp和udp端口53:
[root@localhost~]# firewall-cmd --zone=public--add-port=53/tcp --permanent
[root@localhost~]# firewall-cmd --zone=public--add-port=53/udp --permanent
重啓防火牆以讓更改立刻生效:
[root@localhost~]# firewall-cmd –reload
可使用以下命令檢查配置是否成功:
[root@localhost~]# firewall-cmd --list-all
6. 設置named服務
在主DNS和從DNS服務器上,啓動named服務,並將它設置爲開機啓動:
[root@localhost~]# systemctl start named
[root@localhost~]# systemctl enable named
上述命令執行完後,如果沒什麼問題,可使用下述命令來驗證named服務的狀態:
[root@localhost~]# systemctl status named
7. 測試與驗證
默認情況下,DNS服務的日誌信息會放置到/var/log/messages文檔中。如果有修改配置文件,並啓動或重啓named服務的話,建議第一時間先查看這個日誌文檔,看有沒有報錯:
從DNS服務器中關於zone配置文件更新的日誌:
檢查DNS服務的端口(端口53)是否有開啓:
使用dig命令在從DNS上測試主DNS能否正常解析外網網址:
使用dig命令在從DNS上測試主DNS能否正常解析自己定義的網址:
驗證DNS Forwarders是否有正常工作:
從上面的截圖可以看出,當我在主DNS服務器(172.31.2.2)上指定DNS爲自己去解析jilupian.youku.com時,抓包結果顯示,服務器確實將DNS查詢轉發給了我所配置的ISP的DNS中的一個(202.96.128.166),這表明Forwarders有配置成功。
在本文檔最前面的案例說明部分,有提到允許內網主機的解析請求而不允許外網主機的解析請求,並且允許所有主機對域speedsnail.com的解析請求。爲了驗證這種限制機制是否能生效,先將主DNS服務器上的named.conf配置文件修改成如下所示:
這樣修改的話,仍然是所有主機能對域speedsnail.com進行解析,但只有主DNS服務器(172.31.2.2)自身能解析其它的域。重啓主DNS上的named服務以讓修改生效。然後,在從DNS服務器(172.31.2.3)上進行測試:
可以看到,以172.31.2.2爲DNS,外網網址(www.baidu.com)無法解析,而內網網址(www.speedsnail.com)仍然可以解析,這說明,限制解析請求來源IP的設定是正確的。主DNS服務器上的日誌也驗證了這一點:
總結:
從DNS軟件自身的設定方面來說,在CentOS 7上部署DNS與在更早的系統上部署DNS並沒有太大差別,不過底層機制可能有所改變。從系統方面來說,CentOS 7的應用程序服務管理和防火牆管理有所改變,如這篇文章裏面使用了systemctl和firewall-cmd,而沒有使用chkconfig和iptables。
可用資料:
named.conf(5):說明/etc/named.conf中各語句格式的man文檔
/usr/share/doc/bind*/sample/etc/named.conf:/etc/named.conf的配置範例
/usr/share/doc/bind*/sample/etc/named.rfc1912.zones:與文檔/etc/named.rfc1912.zones的默認內容是一樣的
/usr/share/doc/bind*/Bv9ARM.pdf或Bv9ARM.html:BIND 9管理參考手冊
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux:Networking Guide手冊中有關於DNS服務器架設和配置的介紹。
附件是我這篇文章裏使用到的幾個配置文件,有需要可下載。