概述:
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