DNS介绍
DNS (Domain Name System)域名解析系统,主要用来解析IP 和域名的对应关系。
DNS有这几种不同的记录类型:
SOA: 相当一个解释说明的标记
A记录:Adress记录,用来指定域名或主机名和IP的对应关系。域名对应的IP地址。
NS记录:Name Server ,域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析。
MX记录:Mail Exchanger,邮件服务器的域名记录,通过解析@后的域名将邮件发送到指定服务器。
CNAME记录:Canonical Name, 别名记录,允许将多个域名映射到同一台计算机上。
TXT记录:一般指主机名或域名的说明。
查看DNS三个命令: dig nslookup host
dig可以方便清晰的查看dns的解析过程,使用host可以比较准确的查看当前主机的DNS解析记录,在有缓存干扰的情况下使用host查看是比较准确的。
DNS默认使用的UDP协议,使用53端口。在生产的实际应用中,DNS会优先使用UDP协议,在一些防火墙的限制下,如果UDP传输不成功,会使用TCP协议,所以在部署DNS时,需要允许DNS的TCP和UDP的数据包通过网络。
DNS的域名解析过程:
客户端先在本地缓存查找有没有本地缓存,客户端发送DNS请求到DNS服务器。
DNS服务器接到请求后检查DNS服务器的缓存,如果查到请求的地址和名字,即向客户机发出应答信息。
如果没有请求的信息,则查询数据库,如果查询到请求的信息即向客户机发出应答消息。
若没有查到,则将请求发送给根域DNS服务器,并依次从根域查找顶级域,如果根域没有则查找二级域,二级域没有则查找三级域直到找到要解析的信息,然后向客户机所在的DNS发出应答消息。
客户机所在的DNS服务器收到应答消息之后将此信息在缓存中存储,然后将解析结果发送给客户机。
若没有找到,则返回错误信息。
DNS的分类:
主DNS服务器: 存储着原始资料的DNS服务器
从DNS服务器:使用自动更新的方式从主DNS服务器同步数据的DNS服务器,也称为辅助DNS。
缓存服务器:不负责本地解析,采用递归方式转发客户机查询请求,并返回结果给客户机的DNS服务器,同时缓存查询回来的结果,也叫缓存服务器。
转发器:将DNS请求转发给指定的一台或者多台服务器,自身并不缓存查询结果。
DNS的安装部署
配置主DNS
安装需要的组件:
1
<code># yum install -y bind-utils bind bind-devel bind-chroot</code>
首先需要利用脚本生成一个rndc的配置文件和 rndc的key:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<code>/sbin/rndc-confgen</code> <code>-r </code><code>/dev/urandom</code> <code>> </code><code>/etc/rndc</code><code>.conf</code>
<code>cat</code> <code>/etc/rndc</code><code>.conf </code>
<code># Start of rndc.conf</code>
<code>key </code><code>"rndc-key"</code> <code>{</code>
<code> </code><code>algorithm hmac-md5;</code>
<code> </code><code>secret </code><code>"zIGnSUO1Y8iBkw0jyJzGxA=="</code><code>; </code><code># 密钥要在所有的文件中保持一致</code>
<code>};</code>
<code>options {</code>
<code> </code><code>default-key </code><code>"rndc-key"</code><code>;</code>
<code> </code><code>default-server 127.0.0.1;</code>
<code> </code><code>default-port 953;</code>
<code># End of rndc.conf</code>
<code># Use with the following in named.conf, adjusting the allow list as needed:</code>
<code># key "rndc-key" {</code>
<code># algorithm hmac-md5;</code>
<code># secret "zIGnSUO1Y8iBkw0jyJzGxA==";</code>
<code># };</code>
<code># </code>
<code># controls {</code>
<code># inet 127.0.0.1 port 953</code>
<code># allow { 127.0.0.1; } keys { "rndc-key"; };</code>
<code># End of named.conf</code>
配置rndc.key的配置文件:
<code>cat</code> <code>/etc/rndc</code><code>.key</code>
<code> </code><code>secret </code><code>"zIGnSUO1Y8iBkw0jyJzGxA=="</code><code>;</code>
打开配置文件/etc/named.conf,修改其中的配置 :
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<code> </code><code>listen-on port 53 { any; }; </code><code># 监听的端口和IP</code>
<code> </code><code>directory </code><code>"/var/named"</code><code>; </code><code># 主配置文件目录</code>
<code> </code><code>dump-</code><code>file</code> <code>"/var/named/data/cache_dump.db"</code><code>; </code><code># 缓存的dumpDB文件路径,没有指定的情况下是在Directory目录</code>
<code> </code><code>statistics-</code><code>file</code> <code>"/var/named/data/named_stats.txt"</code><code>; </code><code># DNS解析状态统计,可以做监控</code>
<code> </code><code>memstatistics-</code><code>file</code> <code>"/var/named/data/named_mem_stats.txt"</code><code>;</code>
<code> </code><code>allow-query { any; }; </code><code>#允许访问DNS服务器的主机,可以是IP段和主机名</code>
<code> </code><code>recursion </code><code>yes</code><code>; </code><code># 开启递归查询</code>
<code> </code><code>pid-</code><code>file</code> <code>"/var/named/chroot/var/run/named/named.pid"</code><code>;</code>
<code> </code><code>forwarders { </code><code># DNS转发服务器,用于本地DNS无域名解析记录情况</code>
<code> </code><code>114.114.114.114;</code>
<code> </code><code>8.8.8.8;</code>
<code> </code><code>};</code>
<code>key </code><code>"rndc-key"</code> <code>{ </code><code># 值KEY进行验证</code>
<code> </code><code>secret </code><code>"zIGnSUO1Y8iBkw0jyJzGxA=="</code><code>; </code><code># 此处的KEY是使用rndc命令中生成的,要保持一致</code>
<code>controls {</code>
<code> </code><code>inet 127.0.0.1 port 953</code>
<code> </code><code>allow {127.0.0.1; } keys {</code><code>"rndc-key"</code><code>; };</code>
<code>logging { </code><code>#日志信息级别</code>
<code> </code><code>channel warning { </code><code>#告警日志,及日志存放的路径,单个文件大小</code>
<code> </code><code>file</code> <code>"/var/named/chroot/var/log/dns_warning"</code> <code>versions 10 size 10m;</code>
<code> </code><code>severity warning;</code>
<code> </code><code>print-category </code><code>yes</code><code>;</code>
<code> </code><code>print-severity </code><code>yes</code><code>;</code>
<code> </code><code>print-</code><code>time</code> <code>yes</code><code>;</code>
<code> </code>
<code> </code><code>};</code>
<code> </code><code>channel general_dns { </code><code># 访问日志 记录10个,每个大小最大为100m</code>
<code> </code><code>file</code> <code>"/var/named/chroot/var/log/dns_log"</code> <code>versions 10 size 100m;</code>
<code> </code><code>serverity info;</code>
<code> </code><code>print-category </code><code>yes</code><code>;</code>
<code> </code><code>print-severity </code><code>yes</code><code>;</code>
<code> </code><code>print-</code><code>time</code> <code>yes</code><code>;</code>
<code> </code><code>category default { </code><code>#默认使用warning日志配置</code>
<code> </code><code>warning;</code>
<code> </code><code>category queries { </code><code>#调用访问日志配置</code>
<code> </code><code>general_dns;</code>
<code>include </code><code>"/var/named/chroot/etc/view.conf"</code><code>; </code><code>#包含的一些配置文件</code>
配置主配置文件中指定的view 文件:
<code>cat</code> <code>/var/named/chroot/etc/view</code><code>.conf</code>
<code>view </code><code>"View"</code> <code>{ </code><code># view 名称</code>
<code> </code><code>zone </code><code>"test.com"</code> <code>{ </code><code># 域名</code>
<code> </code><code>type</code> <code>master; </code><code># 主 DNS</code>
<code> </code><code>file</code> <code>"test.com.zone"</code><code>; </code><code># 指定的域文件</code>
<code> </code><code>allow-transfer { </code><code># 允许进行数据同步的主机,这里是slave,从DNS</code>
<code> </code><code>192.168.1.11;</code>
<code> </code><code>notify </code><code>yes</code><code>; </code><code># 如果主DNS记录发生变化,则通知从DNS同步</code>
<code> </code><code>also-notify {</code>
配置域文件:
<code>[root@DNS-Server ~]</code><code># cat /var/named/chroot/etc/test.com.zone</code>
<code>$ORIGIN . </code><code># 文件生效的域 . 代表使用后面指定的配置</code>
<code>$TTL 3600 ; 1 hour </code><code># 域名的生存周期</code>
<code>test</code><code>.com IN SOA </code><code>op</code><code>.</code><code>test</code><code>.com dns.</code><code>test</code><code>.com. (</code>
<code> </code><code>2000 ; serial-number </code><code># 用于标记DNS记录是否发生了更改</code>
<code> </code><code>900 ; refresh (15 minutes) </code>
<code> </code><code>600 ; retry (10 minutes)</code>
<code> </code><code>86400 ; expire (1 day)</code>
<code> </code><code>3600 ; minimum (1 hour)</code>
<code> </code><code>)</code>
<code> </code><code>NS </code><code>op</code><code>.</code><code>test</code><code>.com. </code><code># NS 记录</code>
<code>$ORIGIN </code><code>test</code><code>.com.</code>
<code>shanks A 1.2.3.4</code>
<code>op</code> <code>A 1.2.3.4</code>
<code>t A 1.2.3.4</code>
修改目录权限,并加入开机自启动:
<code>cd</code> <code>/var</code> <code>&& </code><code>chown</code> <code>-R named.named named</code>
<code>systemctl start named</code>
<code>systemctl </code><code>enable</code> <code>named</code>
如果启动失败,显示PID无法读取,可以查看相关的配置文件和目录权限,同时,确认启动脚本中的PIDfile目录是否一致。
CentOS7 的服务管理脚本路径为: /usr/lib/systemd/system
启动成功后查看端口是否监听:
<code>[root@DNS-Server system]</code><code># netstat -lntp</code>
<code>Active Internet connections (only servers)</code>
<code>Proto Recv-Q Send-Q Local Address Foreign Address State PID</code><code>/Program</code> <code>name </code>
<code>tcp 0 0 192.168.1.10:53 0.0.0.0:* LISTEN 9972</code><code>/named</code>
<code>tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 9972</code><code>/named</code>
<code>tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 955</code><code>/sshd</code>
<code>tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 9972</code><code>/named</code>
<code>tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2057</code><code>/master</code>
<code>tcp6 0 0 :::22 :::* LISTEN 955</code><code>/sshd</code>
<code>tcp6 0 0 ::1:25 :::* LISTEN 2057</code><code>/master</code>
<code>[root@DNS-Server system]</code><code># netstat -lnup</code>
<code>udp 0 0 192.168.1.10:53 0.0.0.0:* 9972</code><code>/named</code>
<code>udp 0 0 127.0.0.1:53 0.0.0.0:* 9972</code><code>/named</code>
查看是否能够解析:
<code>[root@DNS-Server system]</code><code># dig @127.0.0.1 t.test.com</code>
<code>; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.4 <<>> @127.0.0.1 t.</code><code>test</code><code>.com</code>
<code>; (1 server found)</code>
<code>;; global options: +cmd</code>
<code>;; Got answer:</code>
<code>;; ->>HEADER<<- opcode: QUERY, status: NOERROR, </code><code>id</code><code>: 38617</code>
<code>;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2</code>
<code>;; OPT PSEUDOSECTION:</code>
<code>; EDNS: version: 0, flags:; udp: 4096</code>
<code>;; QUESTION SECTION:</code>
<code>;t.</code><code>test</code><code>.com. IN A</code>
<code>;; ANSWER SECTION:</code>
<code>t.</code><code>test</code><code>.com. 3600 IN A 1.2.3.4</code>
<code>;; AUTHORITY SECTION:</code>
<code>test</code><code>.com. 3600 IN NS OP.</code><code>test</code><code>.com.</code>
<code>;; ADDITIONAL SECTION:</code>
<code>OP.</code><code>test</code><code>.com. 3600 IN A 1.2.3.4</code>
<code>;; Query </code><code>time</code><code>: 0 msec</code>
<code>;; SERVER: 127.0.0.1</code><code>#53(127.0.0.1)</code>
<code>;; WHEN: Tue Dec 06 15:29:47 CST 2016</code>
<code>;; MSG SIZE rcvd: 88</code>
配置从DNS
在另外一台机器上安装从DNS,可以使用master-slave 模式来对主从进行同步。
安装好后,配置named.conf,和master上保持相同:
<code># cat /etc/named.conf</code>
<code> </code><code>listen-on port 53 {any;};</code>
<code> </code><code>directory </code><code>"/var/named/chroot/etc/"</code><code>;</code>
<code> </code><code>pid-</code><code>file</code> <code>"/var/named/chroot/var/run/named/named.pid"</code><code>;</code>
<code> </code><code>allow-query { any; };</code>
<code> </code><code>Dump-</code><code>file</code> <code>"/var/named/chroot/var/log/binddump.db"</code><code>;</code>
<code> </code><code>Statistics-</code><code>file</code> <code>"/var/named/chroot/var/log/named_stats"</code><code>;</code>
<code> </code><code>zone-statistics </code><code>yes</code><code>;</code>
<code> </code><code>memstatistics-</code><code>file</code> <code>"log/mem_stats"</code><code>;</code>
<code> </code><code>empty-zones-</code><code>enable</code> <code>no;</code>
<code> </code><code>forwarders {114.114.114.114;8.8.8.8; };</code>
<code> </code><code>inet 127.0.0.1 port 953</code>
<code> </code><code>allow { 127.0.0.1; } keys { </code><code>"rndc-key"</code><code>; };</code>
<code> </code><code>};</code>
<code>logging {</code>
<code> </code><code>channel warning {</code>
<code> </code><code>file</code> <code>"/var/named/chroot/var/log/dns_warning"</code> <code>versions 10 size 10m;</code>
<code> </code><code>severity warning;</code>
<code> </code><code>print-category </code><code>yes</code><code>;</code>
<code> </code><code>print-severity </code><code>yes</code><code>;</code>
<code> </code><code>print-</code><code>time</code> <code>yes</code><code>;</code>
<code> </code><code>};</code>
<code> </code><code>channel general_dns {</code>
<code> </code><code>file</code> <code>"/var/named/chroot/var/log/dns_log"</code> <code>versions 10 size 100m;</code>
<code> </code><code>severity info;</code>
<code> </code><code>category default {</code>
<code> </code><code>warning;</code>
<code> </code><code>category queries {</code>
<code> </code><code>general_dns;</code>
<code>include </code><code>"/var/named/chroot/etc/view.conf"</code><code>;</code>
rndc.key和rndc.conf 文件也与master保持一致。
配置从DNS上的view文件:
<code>[root@localhost ~]</code><code># cat /var/named/chroot/etc/view.conf</code>
<code>view </code><code>"Slave view"</code> <code>{ </code><code># view文件信息,可以自定义</code>
<code> </code><code>zone </code><code>"test.com"</code> <code>{ </code><code># 域名名称</code>
<code> </code><code>type</code> <code>slave; </code><code># 指定此服务器为slave</code>
<code> </code><code>masters {192.168.1.10;}; </code><code># 指定主DNS ip</code>
<code> </code><code>Masterfile-Format Text; </code><code># 使同步的文件为可读的文本,不加此参数文件显示乱码</code>
<code> </code><code>file</code> <code>"slave.test.com.zone"</code><code>; </code><code># 定义文件名称,可以自定义</code>
修改目录权限,并加入开机启动:
提示:如果服务已经启动的情况下,在修改了除named.conf 之外的配置文件时,只需要使用rndc reload 命令即可使配置生效。
当master和slave 同步之后,在指定的slave目录/var/named/chroot/etc 下生成 zone文件。
<code>[root@DNS-Slave ~]</code><code># ls -l /var/named/chroot/etc/</code>
<code>total 8</code>
<code>drwxr-x---. 2 named named 6 Sep 28 21:14 named</code>
<code>drwxr-x---. 3 named named 24 Dec 6 15:59 pki</code>
<code>-rw-r--r--. 1 named named 268 Dec 6 20:15 slave.</code><code>test</code><code>.com.zone </code><code># 同步生成的文件</code>
<code>-rw-r--r--. 1 named named 136 Dec 6 18:00 view.conf</code>
注意:这里生成的文件如果是不可读的,如果要让文件可读,需要在slave中的view.conf文件中加Masterfile-Format Text;这个参数才行。
通过本地测试文件是否正确:
<code>[root@DNS-Slave etc]</code><code># dig @127.0.0.1 t.test.com</code>
<code>;; ->>HEADER<<- opcode: QUERY, status: NOERROR, </code><code>id</code><code>: 16200</code>
<code>;t.</code><code>test</code><code>.com.INA</code>
<code>t.</code><code>test</code><code>.com.3600INA1.2.3.4</code>
<code>test</code><code>.com.3600INNSOP.</code><code>test</code><code>.com.</code>
<code>OP.</code><code>test</code><code>.com.3600INA1.2.3.4</code>
<code>;; WHEN: Tue Dec 06 20:32:53 CST 2016</code>
当从DNS需要强制与master同步时,直接重启slave的 named服务即可。
本文转自 酥心糖 51CTO博客,原文链接:http://blog.51cto.com/tryingstuff/1880144