說來接觸Linux也有一年了,BIND是我曾經學習RH系Linux接觸的第一個服務,對我有着莫大的意義,當初差點由於這個服務難以配置而放棄Linux,今天學完馬哥的bind相關係列視頻以後,寫一篇DNS and BIND的基礎到進階。
linux
DNS是什麼?數據庫
DNS(Domain Name System)是Internet發展多年以來最重要的服務之一,它做爲將域名和IP地址相互映射的一個分佈式數據庫,可以令人更方便地訪問互聯網。DNS使用TCP和UDP端口53
vim
域名解析緩存
簡單來講,DNS就像是一個通信錄,AnyISalIn的電話是1829888****,有了通信錄,咱們只需經過輸入AnyISalIn這個名字就可以自動撥打其電話。DNS主要是用來定義IP地址和域名的關係。安全
DNS資源記錄類型bash
SOA:起始受權記錄,一個區域的解析庫中有且只能有一條SOA記錄,必須爲解析庫中的第一條記錄,定義主DNS服務器地址和相關事件時間定義。服務器
A:實現FQDN ==> IP 負載均衡
MX:標明提供郵件服務的主機dom
NS:標明當前域內的DNS服務器分佈式
AAAA:FQDN ==> IPv6
CNAME:Canonical Name,別名記錄
PTR:IP ==> FQDN
DNS解析答案類型
確定答案:正確解析了請求的內容
否認答案:請求的條目不存在等緣由沒法返回結果
權威答案:經過迭代的方式從所查詢域名的所在域的DNS服務器返回的結果
非權威答案:請求的DNS服務器緩存的結果
DNS資源記錄定義方法
A記錄:IP IN A Value ; 示例:192.168.1.1 IN A www.anyisalin.com.
NS記錄:domain IN NS Value; 示例:anyisalin.com. IN NS ns1.anyisalin.com. #一條NS記錄必需要有一條與之對應的A記錄
MX記錄:domain IN NS priority Value; 示例:anyisalin.com. IN MX 10 mail1.anyisalin.com. #一條MX記錄必需要有與之對應的A記錄, 優先級0-99,越低優先級越高
PTR記錄:IP.in-addr.arpa. IN PTR Value; 示例:1.1.168.192.in-addr.arpa. IN PTR www.anyisalin.com. #PTR記錄的寫法比較詭異,咱們在後面進行敘述
AAAA記錄:和A記錄類似,只是將IPv4地址換爲IPv6
上圖爲當今Internet中的DNS的結構,最多可分達127層,朋友們別看上圖中的www.anyisalin.com.和ns.anyisalin.com.相距很近,其實他們可能各自在天南地北。DNS的各層只是邏輯上的關係,不存在物理上的界定 。
在DNS各域中只包含其子域的信息,例如 "."域中的解析庫只包含全球全部頂級域對對應的NS服務器的信息、 而且不知道父域的位置,例如:www.anyisalin.com. 不知道anyisalin.com.的具體位置(NS服務器的IP)
主從DNS:
一個域的DNS通常狀況下都有兩個,主DNS提供解析庫中信息,從DNS進行"區域傳送"來同步其解析庫,來達到負載均衡和高可用的效果。區域傳送分爲全量傳送和增量傳送,相信你們應該可以見名思意,這裏不作過多敘述。
DNS解析過程:
DNS查詢分別有兩種方式,"迭代"和"遞歸"。
遞歸:DNS客戶端使用的DNS服務器通常都是遞歸服務器,負責全權處理客戶端的查詢請求直至返回結果
迭代:DNS服務器之間的查詢方式,從根服務器開始向下級查詢
前面咱們介紹了DNS的一些基礎知識,可是DNS是一種模型,須要使用軟件去實現。BIND(Berkeley Internet Name Domain)就是一伴隨着DNS出生到如今的軟件,本文使用bind9.8。
安裝bind
[root@localhost ~]# yum install -y bind bind-utils Loaded plugins: fastestmirror, security Setting up Install Process Loading mirror speeds from cached hostfile * base: mirrors.opencas.cn * extras: mirrors.pubyun.com * updates: mirrors.163.com updates | 3.4 kB 00:00 Package 32:bind-utils-9.8.2-0.37.rc1.el6_7.7.x86_64 already installed and latest version Resolving Dependencies --> Running transaction check ---> Package bind.x86_64 32:9.8.2-0.37.rc1.el6_7.7 will be installed --> Finished Dependency Resolution Dependencies Resolved ============================================================================================================================================================================================= Package Arch Version Repository Size ============================================================================================================================================================================================= Installing: bind x86_64 32:9.8.2-0.37.rc1.el6_7.7 updates 4.0 M Transaction Summary ============================================================================================================================================================================================= Install 1 Package(s) Total download size: 4.0 M Installed size: 7.3 M Downloading Packages: bind-9.8.2-0.37.rc1.el6_7.7.x86_64.rpm | 4.0 MB 00:03 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : 32:bind-9.8.2-0.37.rc1.el6_7.7.x86_64 1/1 Verifying : 32:bind-9.8.2-0.37.rc1.el6_7.7.x86_64 1/1 Installed: bind.x86_64 32:9.8.2-0.37.rc1.el6_7.7 Complete!
查看生成的關鍵文件
[root@localhost ~]# rpm -ql bind /etc/NetworkManager/dispatcher.d/13-named /etc/logrotate.d/named /etc/named /etc/named.conf #bind主配置文件 /etc/named.iscdlv.key /etc/named.rfc1912.zones #定義zone的文件 /etc/named.root.key /etc/portreserve/named /etc/rc.d/init.d/named #bind腳本文件 /etc/rndc.conf #rndc配置文件 /etc/rndc.key /etc/sysconfig/named /usr/lib64/bind /usr/sbin/arpaname /usr/sbin/ddns-confgen /usr/sbin/dnssec-dsfromkey /usr/sbin/dnssec-keyfromlabel /usr/sbin/dnssec-keygen /usr/sbin/dnssec-revoke /usr/sbin/dnssec-settime /usr/sbin/dnssec-signzone /usr/sbin/genrandom /usr/sbin/isc-hmac-fixup /usr/sbin/lwresd /usr/sbin/named /usr/sbin/named-checkconf #檢測/etc/named.conf文件語法 /usr/sbin/named-checkzone #檢測zone和對應zone文件的語法 /usr/sbin/named-compilezone /usr/sbin/named-journalprint /usr/sbin/nsec3hash /usr/sbin/rndc #遠程dns管理工具 /usr/sbin/rndc-confgen #生成rndc密鑰 #過長省略 /var/log/named.log /var/named /var/named/data /var/named/dynamic /var/named/named.ca #根解析庫 /var/named/named.empty /var/named/named.localhost #本地主機解析庫 /var/named/named.loopback /var/named/slaves #從文件夾 /var/run/named
[root@localhost ~]# rpm -ql bind-utils #bind-utils包主要提供了一些檢測工具 /usr/bin/dig /usr/bin/host /usr/bin/nslookup /usr/bin/nsupdate /usr/share/man/man1/dig.1.gz /usr/share/man/man1/host.1.gz /usr/share/man/man1/nslookup.1.gz /usr/share/man/man1/nsupdate.1.gz
手動建立bind主配置文件
[root@localhost etc]# vim named.conf #不熟悉的能夠直接經過修改原始的配置文件 options { directory "/var/named"; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";
定義一個zone
[root@localhost etc]# cat >> /etc/named.rfc1912.zones << EOF #這裏使用Here Document,不懂得能夠搜素 > zone "anyisalin.com" IN { #定義區域爲anyisalin.com > type master; #設置類型爲master > file "anyisalin.com.zone"; #解析庫文件名稱爲anyisalin.com.zone > }; > EOF
建立區域解析庫文件
[root@localhost etc]# vim /var/named/anyisalin.com.zone $TTL 600 #定義全局默認超時時間 $ORIGIN anyisalin.com. #定義後綴 @ IN SOA ns1.anyisalin.com. admin.anyisalin.com. ( 20160321 #序列號 1H #刷新時間 5M #重試時間 1W #超時時間 10M ) #否認答案緩存TTL值 IN NS ns1 ns1 IN A 192.168.192.150 IN MX 10 mail1 mail1 IN A 192.168.192.1 www IN A 192.168.192.2 cname IN CNAME www #別名, 將cname.anyisalin.com. 解析到 www.anyisalin.com.的地址 * IN A 192.168.2.1 #泛域名解析,以上都不是的解析到192.168.2.1
檢查、啓動並測試
[root@localhost etc]# named-checkconf #檢查主配置文件語法 [root@localhost etc]# named-checkzone "anyisalin.com" /var/named/anyisalin.com.zone #檢查anyisalin.com zone所對應的解析庫文件 zone anyisalin.com/IN: loaded serial 20160321 OK [root@localhost etc]# service named start Starting named: [ OK ]
解析域名
[root@localhost etc]# host -t A www.anyisalin.com 192.168.192.150 #解析www.anyisalin.com 對應的主機IP Using domain server: Name: 192.168.192.150 Address: 192.168.192.150#53 Aliases: www.anyisalin.com has address 192.168.192.2 #得出ip爲192.168.192.2
[root@localhost etc]# host -t NS anyisalin.com 192.168.192.150 #查詢anyisalin.com域內的NS記錄 Using domain server: Name: 192.168.192.150 Address: 192.168.192.150#53 Aliases: anyisalin.com name server ns1.anyisalin.com. #ns1.anyisalin.com. 爲其dns服務器
上面咱們已經講過,一個域內的DNS服務器通常都須要兩個,咱們這裏就進行主從配置和區域傳送
在從服務器安裝bind並建立bind主配置文件
[root@localhost etc]# vim named.conf #不熟悉的能夠直接經過修改原始的配置文件 options { directory "/var/named"; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";
定義zone
[root@localhost named]# cat >> /etc/named.rfc1912.zones <<EOF #這裏定義方式和主服務器的配置略有不一樣 > zone "anyisalin.com" IN { > type slave; > masters { 192.168.192.150; }; #定義主服務器的IP地址 > file "slaves/anyisalin.com.zone"; #定義傳送文件的存放位置,必需要和源文件相同 > }; > EOF
在主服務器的解析庫中添加一條NS記錄指向從服務器的地址
[root@localhost etc]# vim /var/named/anyisalin.com.zone #在主服務上執行!!! $TTL 600 $ORIGIN anyisalin.com. @ IN SOA ns1.anyisalin.com. admin.anyisalin.com. ( 20160321 1H 5M 1W 10M ) IN NS ns1 IN NS ns2 #添加ns2記錄 ns1 IN A 192.168.192.150 ns2 IN A 192.168.192.147 #添加ns2對應的A記錄 IN MX 10 mail1 mail1 IN A 192.168.192.1 www IN A 192.168.192.2 cname IN CNAME www * IN A 192.168.2.1 [root@localhost etc]# rndc reload #重載配置文件 server reload successful
啓動bind服務
從下面的動態圖能夠看傳送過程
增量傳送, #增量傳送須要修改序列號!
子域受權
在主dns服務器添加兩條記錄
vim /var/named/anyisalin.com.zone $TTL 600 $ORIGIN anyisalin.com. @ IN SOA ns1.anyisalin.com. admin.anyisalin.com. ( 20160324 1H 5M 1W 10M ) IN NS ns1 IN NS ns2 ns1 IN A 192.168.192.150 ns2 IN A 192.168.192.147 IN MX 10 mail1 mail1 IN A 192.168.192.1 www IN A 192.168.192.2 cname IN CNAME www * IN A 192.168.2.1 new IN A 192.168.1.1 ops IN NS ns1.ops #添加一條NS記錄將ops.anyisalin.com. 域受權給ns1.ops.anyisalin.com.進行管理 ns1.ops IN NS 192.168.192.151 #對應上條的NS記錄的A記錄
在ns1.ops.anyisalin.com.主機上進行配置
vim /etc/named.conf #配置bind主配置文件 options { directory "/var/named"; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";
[root@localhost ~]# cat >> /etc/named.rfc1912.zones <<EOF #定義zone > zone "ops.anyisalin.com" IN { > type master; > file "ops.anyisalin.com.zone"; > }; > EOF
[root@localhost named]# cat ops.anyisalin.com.zone #定義解析庫 $TTL 600 $ORIGIN ops.anyisalin.com. @ IN SOA ns1.ops.anyisalin.com. admin.ops.anyisalin.com. ( 20160321 1H 5M 7D 1H ) IN NS ns1 ns1 IN A 192.168.192.151 www IN A 192.168.1.1
測試
[root@localhost named]# service named start Starting named: [ OK ] 經過本機解析本域主機名 [root@localhost named]# host -t A www.ops.anyisalin.com 192.168.192.151 Using domain server: Name: 192.168.192.151 Address: 192.168.192.151#53 Aliases: www.ops.anyisalin.com has address 192.168.1.1 經過父域DNS解析本域下的主機名 [root@localhost named]# host -t A www.ops.anyisalin.com 192.168.192.150 Using domain server: Name: 192.168.192.150 Address: 192.168.192.150#53 Aliases: www.ops.anyisalin.com has address 192.168.2.1 經過本機DNS解析父域中的主機名 [root@localhost named]# host -t A www.anyisalin.com 192.168.192.151 ;; connection timed out; trying next origin Using domain server: Name: 192.168.192.151 Address: 192.168.192.151#53 Aliases: Host www.anyisalin.com not found: 3(NXDOMAIN)
可是咱們可能會發現一個問題,若是我須要解析父域中的主機名,只能經過遞歸到根域去解析,這是很是不便的,因此咱們要設置轉發器。
[root@localhost named]# cat >> /etc/named.rfc1912.zones <<EOF #定義轉發器 > zone "anyisalin.com" IN { > type forward; > forward only ; > forwarders { 192.168.192.150; }; > }; > EOF
重載、測試
[root@localhost named]# rndc reload #重載配置文件 server reload successful [root@localhost named]# host -t A www.anyisalin.com 192.168.192.151 #使用本機進行解析 Using domain server: Name: 192.168.192.151 Address: 192.168.192.151#53 Aliases: www.anyisalin.com has address 192.168.192.2 #如今可以得出結果
你們都知道,中國的運營商之間的帶寬是很是低,可是不管咱們是哪一個運營商的寬帶,訪問那些大型電商站點都是很是的快,那是由於在dns服務器中定義了來自哪些IP的請求解析成哪些地址,這就是視圖的功能。
配置視圖:
一、一旦啓動了view, 全部的zone都只能在view中定義 二、僅有必要在匹配到容許遞歸請求的客戶所在view定義根區域 三、客戶端請求到達, 是自上而下檢查每一個view所服務器的客戶端列表 [root@localhost etc]# vim /etc/named.conf #修改主配置文件 acl mynet { 192.168.192.150; 127.0.0.0/8; }; acl other { 192.168.192.1; }; options { directory "/var/named"; dnssec-enable no; dnssec-validation no; }; view "." { match-clients { mynet; }; zone "." IN { type hint; file "named.ca"; }; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key"; vim /etc/named.rfc.1912.zones #配置主配置文件 view mynet { match-clients { mynet; }; zone "localhost.localdomain" IN { type master; file "named.localhost"; allow-update { none; }; }; zone "localhost" IN { type master; file "named.localhost"; allow-update { none; }; }; zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN { type master; file "named.loopback"; allow-update { none; }; }; zone "1.0.0.127.in-addr.arpa" IN { type master; file "named.loopback"; allow-update { none; }; }; zone "0.in-addr.arpa" IN { type master; file "named.empty"; allow-update { none; }; }; zone "anyisalin.com" IN { type master; file "anyisalin.com.zone"; }; }; view other { match-clients { other; }; zone "anyisalin.com" IN { type master; file "anyisalin.com.other"; }; };
驗證
編譯安裝相關博客==> 教你使用rpm、yum、編譯等方式安裝軟件
咱們經過isc.org下載bind9.9.5的安裝包
yum groupinstall "Development Tools" "Server Platform Development" --nogpgcheck #安裝開發環境
tar xf bind-9.9.5.tar.gz #解壓源碼包 cd bind-9.9.5 ./configure --prefix=/usr/local/bind9 --sysconfdir=/etc/named/ --disable-ipv6 --disable-chroot --enable-threads #配置config文件 useradd -u 53 named -r ; groupadd -g 53 named -r #建立named用戶和組 make && make install #編譯和配置 export PATH=/usr/local/bin9/bin:/usr/local/bin9/sbin:$PATH #將bind的執行路徑加入PATH中 source /etc/bashrc #重讀bash配置文件 echo "/usr/local/bind9/lib" > /etc/ld.so.conf.d/bind.conf #導入庫文件路徑 echo "MANPATH /usr/local/bind9/share/man" >> /etc/man.config #導入manual文件路徑 新建主配置文件 vim /etc/named/named.conf options { directory "/var/named"; }; zone "." IN { type hint; file "named.ca"; }; zone "localhost" IN { type master; file "localhost.zone"; }; zone "0.0.127.in-addr.arpa { type master; file "name.local"; }; [root@localhost bind9]# /usr/local/bind9/sbin/named-checkconf #檢查配置文件,提示沒有文件夾 /etc/named/named.conf:2: change directory to '/var/named' failed: file not fou nd /etc/named/named.conf:2: parsing failed [root@localhost bind9]# mkdir /var/named #建立/var/named [root@localhost bind9]# /usr/local/bind9/sbin/named-checkconf #檢測經過 手動建立zone文件 [root@localhost bind9]# cd /var/named/ [root@localhost named]# dig -t NS . @192.168.1.1 #經過dig命令獲取根服務器地址 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -t NS . @192.168.1.1 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43106 ;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;. IN NS ;; ANSWER SECTION: . 12787 IN NS m.root-servers.net. . 12787 IN NS d.root-servers.net. . 12787 IN NS i.root-servers.net. . 12787 IN NS k.root-servers.net. . 12787 IN NS a.root-servers.net. . 12787 IN NS e.root-servers.net. . 12787 IN NS c.root-servers.net. . 12787 IN NS b.root-servers.net. . 12787 IN NS h.root-servers.net. . 12787 IN NS g.root-servers.net. . 12787 IN NS f.root-servers.net. . 12787 IN NS l.root-servers.net. . 12787 IN NS j.root-servers.net. ;; Query time: 78 msec ;; SERVER: 192.168.1.1#53(192.168.1.1) ;; WHEN: Mon Mar 21 19:29:53 2016 ;; MSG SIZE rcvd: 228 [root@localhost named]# dig -t NS . @192.168.1.1 > named.ca #將根服務器解析庫重定向到named.ca文件中 建立localhost.zone文件 [root@localhost named]# vim localhost.zone $TTL 600 @ IN SOA localhost. admin.localhost. ( 20160321 1H 5M 7D 1H ) IN NS localhost. localhost. IN A 127.0.0.1 建立named.local文件 $TTL 600 @ IN SOA localhost. admin.localhost. ( 20160321 1H 5M 7D 1H ) IN NS localhost. 1 IN PTR localhost. 修改屬主和權限 [root@localhost named]# chown root:named /var/named/ -R [root@localhost named]# chmod 770 /var/named/ -R [root@localhost named]# chown root:named /etc/named/ -R 運行bind程序 [root@localhost bind9]# /usr/local/bind9/sbin/named -u named 查看監聽端口 [root@localhost ~]# ss -unlp | grep 53 UNCONN 0 0 192.168.192.152:53 *:* users:(("named", 6949,513))UNCONN 0 0 127.0.0.1:53 *:* users:(("named", 6949,512)
bind安全配置:
訪問控制命令: allow-query {}; 容許查詢的主機, 白名單 allow-transfer {}; 容許區域傳送主機, 白名單 allow-recursion {}; 容許遞歸的主機 allow-update {}; 容許更新區域數據庫中的內容
allow-query 測試:
allow-transfer測試:
還有不少沒有寫,本文寫了大概5小時,前面還行,後面有些偷工減料,總的來講還行,理論的東西很少。
參考資料:wiki百科,馬哥Linux 2016視頻,相關筆記,百度圖庫
歡迎你們加我QQ交流:1449472454