運維筆記19 (DNS服務器bind的相關配置,主從DNS服務器,動態域名解析的簡單配置)

概述:

DNS在互聯網上是一個相當重要的應用層協議,他的功能很簡單,就是將點分十進制ip地址,轉化成我們比較好記憶的字符串,比如www.baidu.com,既然這個這麼有用,那麼這次我們就來看一下DNS服務器如何搭建。


1.dns高速緩存服務器

這個服務器應該是日常生活中接觸最多的一個服務器,因爲我們的無線路由器就具有這個功能,將你訪問過的網頁的鏈接和ip有一個對應,記錄在緩存中,這樣下次打開同一個網頁的時候速度就會快很多。

首先做服務器要有相應的軟件,對於DNS這個軟件就是bind

bind.x86_64 : The Berkeley Internet Name Domain (BIND) DNS (Domain Name System) server
軟件下好後只要進行簡單的配置就能成爲一個高速緩存DNS了,但是配置文件有哪些呢?

[root@localhost ~]# rpm -qc bind
/etc/logrotate.d/named
/etc/named.conf
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
/etc/named.root.key
/etc/rndc.conf
/etc/rndc.key
/etc/sysconfig/named
/var/named/named.ca
/var/named/named.empty
/var/named/named.localhost
/var/named/named.loopback

紅色部分就是配置文件了,讓我們打開它看一下。

options {
        listen-on port 53 { 127.0.0.1; };	#DNS監聽在本機的哪個套接字上
        listen-on-v6 port 53 { ::1; };		#ipv6相關的選項
        directory       "/var/named";				#dns域文件所在的目錄
        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     { localhost; };				#允許哪些來人來詢問這臺DNS服務器
	forwarders { 192.168.1.1 };				#雖然我是緩存DNS不負責查詢,但是總要有個人告訴我DNS#解析的答案是什麼,這裏的設置就是那臺告訴我答案的服務器ip,看到forwarders後的‘s’了嗎,代表不只可以添加一個ip
	forward only;						#我們都知道,每臺DNS都會如果找不到域名的解析,一定
#會詢問根服務器,但是加上這個參數,他連根也不會訪問,變成了一個完全的緩存服務器。
	省略。。。
        recursion yes;

        dnssec-enable yes;
        dnssec-validation no					#是否合法,也就是可以充當公網上的DNS嗎,如果你沒有申請的話,請寫NO
        dnssec-lookaside auto;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};

接下來重啓服務,高速緩存DNS服務器就可以使用了。


2.真正的DNS服務器

我們肯定留意過自己的主機名字

[root@localhost ~]# 
就是放括號最後的部分那個字符串就是主機名字。

或者使用命令查找

[root@localhost ~]# hostname
localhost
用命令設置主機名

[root@localhost ~]# hostnamectl set-hostname mo
將我的主機名設置成"mo"

關閉一個shell然後再打開一個shell後,你的主機名就修改好了

[root@mo ~]# 

這個主機名什麼用處呢?其實是用來在局域網中區分每臺主機用的,即使是局域網,動輒也有可能100多臺主機吧,讓大家去自己記憶100多臺主機和人名的關係,着實不是很容易。既然和ip相關,那我們ping一下這個名字,看下有什麼效果。

[root@mo ~]# ping mo
PING mo (127.0.0.1) 56(84) bytes of data.
64 bytes from mo (127.0.0.1): icmp_seq=1 ttl=64 time=0.055 ms
64 bytes from mo (127.0.0.1): icmp_seq=2 ttl=64 time=0.046 ms
ping通了,而且根據輸出顯示,我們ping的主機是本地迴環,那麼這個對應關係放在哪裏呢,爲什麼主機名對應的是本地迴環。大家應該都聽說過host文件,這個文件就是在沒有DNS服務器的時代,人們如何將主機名和ip對應的一個文件,Windows有,linux一樣也有,我們來看下這個文件。

127.0.0.1   mo localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

裏面正好就有我們剛纔的主機名和ip的對應,至於第二行是ipv6的ip與主機名的對應,我們先不管他。

現在我們大概理解主機名的作用了。然後我們討論下域名,其實域名是主機名的一部分,因爲隨着互聯網的發展,主機數量越來越多,我們不能每個人胡亂想一個字符串就作爲主機名吧,那樣也不是很好記,比如這家叫absgh.kioh另一家叫hjug什麼的。需要有個規範,就出現了.com .net .org這樣的頂級域名,再後來出現了baidu.com linux.org等次級域名,最後纔到www.baidu.com www.linux.org這樣的主機名。說了這麼多讓我們來自己搭建DNS服務器吧。

搭建DNS服務器,還是使用bind軟件,從新打開配置文件

options { 
    listen-on port 53 { any; }; 
    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 yes;

    dnssec-enable yes;
    dnssec-validation no;
    dnssec-lookaside auto;

    /* Path to ISC DLV key */
    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就是域的意思,“.”代表的是根域的意思,所以type的值爲hint,文件是named.ca,那麼這個named.ca在哪個文件呢,在配置文件的第一部分是不是有一個directory選項,那個選項後面的目錄就是放置這些域的具體要求的目錄。

;; ADDITIONAL SECTION:
a.root-servers.net. 3600000 IN  A   198.41.0.4
a.root-servers.net. 3600000 IN  AAAA    2001:503:ba3e::2:30
b.root-servers.net. 3600000 IN  A   192.228.79.201
c.root-servers.net. 3600000 IN  A   192.33.4.12
d.root-servers.net. 3600000 IN  A   199.7.91.13
d.root-servers.net. 3600000 IN  AAAA    2001:500:2d::d
e.root-servers.net. 3600000 IN  A   192.203.230.10
f.root-servers.net. 3600000 IN  A   192.5.5.241
f.root-servers.net. 3600000 IN  AAAA    2001:500:2f::f
g.root-servers.net. 3600000 IN  A   192.112.36.4
h.root-servers.net. 3600000 IN  A   128.63.2.53
省略。。。

這裏放置的就是全球13臺根服務器的地址,有ipv4的也有ipv6的。


繼續看配置文件發現還有include,看下第一個include包含的文件。

zone "localhost.localdomain" IN {
    type master;
    file "named.localhost";
    allow-update { none; };
};

zone "localhost" IN {
    type master;
    file "named.localhost";
    allow-update { none; };
};

可以看到這裏都是域的定義。我們如果想要自己定義一個域,那麼只要在這裏添加就好了。

zone "momo.com" IN {
    type master;
    file "named.momo.com";
    allow-update { none; };
};

寫下來後,發現這裏又出來了一個文件選項,這個文件代表的意思是域的詳細設置,那肯定就屬於數據文件了,在/var/named下

$TTL 1D
@   IN SOA  dns.momo.com. rname.invalid. (
                    0   ; serial
                    1D  ; refresh
                    1H  ; retry
                    1W  ; expire
                    3H )    ; minimum
    NS  dns.momo.com.
www A   172.25.254.3
dns A   172.25.254.3
按照這樣編寫,就基本完成了。但是有幾個注意事項,首先是關於主機名的書寫,一定不要按照自己的平時習慣只寫成"www.momo.com"要寫成"www.momo.com."否則named會認爲你最後沒有加上.寫的是一個主機名,所以建議出現寫主機名的地方,一定要寫全,或者直接寫主機的名字,比如www,dns等,因爲系統會爲你補全後面的域名。

重啓服務器,這樣你的DNS服務器就搭建好了。

好的現在重啓服務器

[root@mo named]# systemctl restart named
測試一下可以查詢嗎
[root@mo named]# dig www.momo.com

; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> www.momo.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 5948
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.momo.com.			IN	A

;; Query time: 1 msec
;; SERVER: 172.25.254.104#53(172.25.254.104)
;; WHEN: Wed Nov 23 14:57:19 EST 2016
;; MSG SIZE  rcvd: 41
。。。爲什麼沒有查詢到

難道做錯了什麼嗎?這時請冷靜的分析日誌

Nov 23 14:56:41 mo named[401]: zone momo.com/IN: loading from master file named.momo.com f
Nov 23 14:56:41 mo named[401]: zone momo.com/IN: not loaded due to errors.

發現了這樣的一條,很奇怪,我的域文件就放在/var/named下好好的呀,怎麼會load失敗呢,我進入了/var/named

[root@mo named]# ll
total 20
drwxrwx---. 2 named named   22 Nov 23 14:19 data
drwxrwx---. 2 named named   30 Nov 23 14:20 dynamic
-rw-r-----. 1 root  named 2076 Jan 28  2013 named.ca
-rw-r-----. 1 root  named  152 Dec 15  2009 named.empty
-rw-r-----. 1 root  named  152 Jun 21  2007 named.localhost
-rw-r-----. 1 root  named  168 Dec 15  2009 named.loopback
-rw-r-----. 1 root  root   184 Nov 23 14:51 named.momo.com
drwxrwx---. 2 named named    6 Jan 29  2014 slaves
發現了什麼問題?

那個文件的權限呀,屬組竟然是root,當然就讀不到了。

趕快改回來

[root@mo named]# dig www.momo.com

; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> www.momo.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7652
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.momo.com.			IN	A

;; ANSWER SECTION:
www.momo.com.		86400	IN	A	172.25.254.3

;; AUTHORITY SECTION:
momo.com.		86400	IN	NS	dns.momo.com.

;; ADDITIONAL SECTION:
dns.momo.com.		86400	IN	A	172.25.254.104

;; Query time: 0 msec
;; SERVER: 172.25.254.104#53(172.25.254.104)
;; WHEN: Wed Nov 23 15:00:31 EST 2016
;; MSG SIZE  rcvd: 91
好啦終於查詢成功了。

我們現在只設置了A記錄,其實還有很多種比如CNAME記錄,MX記錄。但其實都是大同小易(只設定的方式)


現在我們設置下DNS反解,也就是ip找域名。


首先改寫配置文件

zone "254.25.172.in-addr.arpa" {
        type master;
        file "named.254.25.172";
        allow-update { none; };
}
接下來修改域文件
[root@mo named]# cp -a named.momo.com named.254.25.172
爲了防止出現這個
$TTL 1D
@       IN SOA dns.momo.com. root.momo.com.  (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      dns.momo.com.
3       PTR     www.momo.com.

這裏的@也有其他意思,代表254.25.172.in-addr.arpa,所以一定要在主機名加上.

現在試試可以反解成功了嗎?

[root@mo named]# dig -x 172.25.254.3

; <<>> DiG 9.9.4-RedHat-9.9.4-14.el7 <<>> -x 172.25.254.3
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64288
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;3.254.25.172.in-addr.arpa.	IN	PTR

;; ANSWER SECTION:
3.254.25.172.in-addr.arpa. 86400 IN	PTR	www.momo.com.254.25.172.in-addr.arpa.

;; AUTHORITY SECTION:
254.25.172.in-addr.arpa. 86400	IN	NS	dns.momo.com.

;; ADDITIONAL SECTION:
dns.momo.com.		86400	IN	A	172.25.254.104

;; Query time: 0 msec
;; SERVER: 172.25.254.104#53(172.25.254.104)
;; WHEN: Wed Nov 23 15:28:18 EST 2016
;; MSG SIZE  rcvd: 123
反解也成功了。


3.主從DNS服務器

一臺主DNS服務器都會有一臺從服務器,當需要查詢的時候,這兩臺的任意一臺都可以服務,提供了一種負載均衡的作用。

首先快速搭建好一臺主dns服務器,步驟如上。

[root@localhost named]# systemctl status named
named.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named.service; disabled)
   Active: active (running) since Mon 2016-11-28 04:26:10 EST; 17min ago
  Process: 1155 ExecStart=/usr/sbin/named -u named $OPTIONS (code=exited, status=0/SUCCESS)

上面談到過DNS服務器主要要修改三個文件,分別是/etc/named.conf /etc/named.rfc1912.zones /var/named/**

這次主服務器的配置與上面不同的只有/etc/named.rfc1912.zones這個文件

zone "momo.com" IN {
        type master;
        file "named.momo.com";
        allow-update { none; };
        allow-transfer { 172.25.254.103; };
};
加入了allow-transfer{ 172.25.254.103; };的參數

從服務器的配置,也是隻修改了/etc/named.rfc1912.zones這個文件

zone "momo.com" IN {
        type slave;
        masters { 172.25.254.104; };
        file "slaves/named.momo.com";
        allow-update { none; };
};

類型改爲slave,再規定他的主服務器未172.25.254.104,注意這個文件是在/var下的slaves,而且不需要你自己創建,但是要修改這個slaves目錄的權限,因爲這個域文件需要主服務器傳送給你,服務器以named這個身份傳送給你。

重啓服務器,發現slaves下多了那個域文件,就同步成功了。

但是現在主服務器如果對ip和域名的對應做出了修改,還不能讓從服務器立刻修改,從服務器只能自己刪除從服務器曾經傳輸過來的文件,再重啓服務器,才能完成數據的更新,實在是太麻煩。


但其實只要在主服務器添加一個參數從服務器就會自動修改

zone "momo.com" IN {
        type master;
        file "named.momo.com";
        allow-update { none; };
        allow-transfer { 172.25.254.103; };
        also-notify { 172.25.254.103; };
};
接下來我們修改主服務器的域文件。

$TTL 1D
@       IN SOA  dns.momo.com. root.momo.com. (
                                2016112801      ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      dns.momo.com.
dns     A       172.25.254.104
www     A       172.25.254.4
原來是這個樣子

$TTL 1D
@       IN SOA  dns.momo.com. root.momo.com. (
                                2016112802      ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      dns.momo.com.
dns     A       172.25.254.104
www     A       172.25.254.5
現在是這個樣子,而且修改完還要對第三行的serial修改纔會生效哦!

重啓主服務器。

查看從服務器的日誌

Nov 28 06:15:42 station named[6878]: transfer of 'momo.com/IN' from 172.25.254.104#53: connected using 172.25.254.103#45735
Nov 28 06:15:42 station named[6878]: zone momo.com/IN: transferred serial 2016112802
Nov 28 06:15:42 station named[6878]: transfer of 'momo.com/IN' from 172.25.254.104#53: Transfer completed: 1 messages, 5 records, 157 bytes, 0.001 secs (157000 bytes/sec)
發現傳送成功的信息。

再用dig查詢一下。

;www.momo.com.			IN	A

;; ANSWER SECTION:
www.momo.com.		86400	IN	A	172.25.254.5
從服務器已經自動同步完成。

4.遠程修改DNS配置文件

通過這種方式修改會立刻生效,比如刪除一條域名的A記錄

[root@foundation3 ~]# nsupdate << EOF
server 172.25.254.104
update delete www.momo.com
send
EOF
這時主服務器,從服務器均不可查詢到www.momo.com。

但是主從服務器的配置文件暫時不會更新,等到下次主服務器重啓便會更新。

想達到這個效果只要修改/etc/named.rfc1912.zone這個文件即可。

 allow-update { any; };

將以前的no改爲某個ip或者any即可從其他上面修改。

記得selinux要控制好。

這個遠程修改的方式雖然很方便,但是有些不安全的因素,比如,有人和我允許修改的主機的ip一致怎麼辦,這就需要一種驗證機制了。一般我們使用公鑰私鑰的方式,就像ssh一樣。

[root@localhost ~]# dnssec-keygen -a HMAC-MD5 -b 128 -n HOST mo
Kmo.+157+20505
通過這種方式生成密鑰
建立公鑰文件,就像/etc/rndc.key一樣

key "mo" {
        algorithm hmac-md5;
        secret "QxSfwF2pJ2t1dly8UJS/yw==";
};
文件修改成這樣,可以直接cp -p /etc/rndc.key /etc/mo.key,然後修改省去了修改權限的問題。

zone "." IN {
        type hint;
        file "named.ca";
};
include "/etc/mo.key";
修改/etc/named.conf文件將這個密碼文件include進來。

zone "momo.com" IN {
        type slave;
        masters { 172.25.254.104; };
        file "slaves/named.momo.com";
        allow-update { key mo; };
};
再修改/etc/named.rfc1912.conf文件
選擇我所生成的key作爲驗證,這時即可通過密鑰遠程修改。
[root@station slaves]# nsupdate -k /mnt/Kmo.+157+20505.private << EOF
server 172.25.254.104
update add www.momo.com 86400 A 172.25.254.4
send
EOF

5.動態域名解析

假如我在自己的主機上做了一個網站,想讓外網訪問,方法一是可以將電信分給你的ip公佈出去,讓別人通過這個ip來訪問你的網站,但是有經驗的小夥伴一定知道,ISP分給我們的ip是動態的,可能過一段時間ip就更改了,這樣你難道又要發佈一次嗎?我們是不是想到了DNS,如果給我們一個固定的域名,就算ip再改變也沒事了,但是ip如果是變的我們/var/named/named.**.com那個文件ip與域名的對應關係又怎樣寫,難道我每修改一次ip就再改一次呢,這就非常麻煩了,所以就該到我們的動態域名解析上場了。


先設想一種ip會動態改變的狀態,我們日程接觸的,應該就是DHCP服務了,我們的動態DNS正是基於這個。

所以只要上一部分的遠程密鑰更改做好後,這步就只要更改DHCP服務的配置即可

# Use this to enble / disable dynamic dns updates globally.
ddns-update-style interim;

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
#authoritative;

# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
log-facility local7;

# No service will be given on this subnet, but declaring it helps the 
# DHCP server to understand the network topology.


# This is a very basic subnet declaration.

subnet 172.25.3.0 netmask 255.255.255.0 {
  range 172.25.3.100 172.25.3.105;
  option routers 172.25.3.10;
}
key mo {
         algorithm hmac-md5;
         secret QxSfwF2pJ2t1dly8UJS/yw==;
       };

       zone momo.com. {
         primary 127.0.0.1;
         key mo;
       }

紅色部分就是配置修改部分,之後重啓dhcp服務器,dns服務器,之後就重啓局域網內另一臺主機,已經分到ip,但是發現還是無法爲這臺叫做music的主機添加A記錄,日誌報錯爲

Nov 28 08:32:46 localhost dhcpd: Unable to add forward map from music.mo.com to 172.25.3.100: not found







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章