运维笔记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







  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值