dns理论
dns的出现
网络出现的早期是使用IP地址通讯的,那时就几台主机通讯。但是随着接入网络主机的增多,这种数字标识的地址非常不便于记忆,UNIX上就出现了建立一个叫做hosts的文件(Linux和Windows也继承保留了这个文件)。这个文件中记录着主机名称和IP地址的对应表。这样只要输入主机名称,系统就会去加载hosts文件并查找对应关系,找到对应的IP,就可以访问这个IP的主机了。
但是后来主机太多了,无法保证所有人都能拿到统一的最新的hosts文件,就出现了在文件服务器上集中存放hosts文件,以供下载使用。互联网规模进一步扩大,这种方式也不堪重负,而且把所有地址解析记录形成的文件都同步到所有的客户机似乎也不是一个好办法。这时DNS系统出现了,随着解析规模的继续扩大,DNS系统也在不断的演化,直到现今的多层架构体系。
dns的解析过程
首先,客户端先在本地缓存查找有没有域名缓存,如果没有,客户端发出DNS请求翻译IP地址或主机名。DNS服务器在收到客户机的请求后:
(1)检查DNS服务器的缓存,若查到请求的地址或名字,即向客户机发出应答信息;
(2)若没有查到,则在数据库中查找,若查到请求的地址或名字,即向客户机发出应答信息;
(3)若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机 所在网络的DNS服务器发出应答信息,DNS服务器收到应答后现在缓存中存储,然后,将解析结果发给客户机。
(4)若没有找到,则返回错误信息。
用户访问网站流程
第一步:客户端用户从浏览器输入www.baidu.com网站网址后回车,系统会查询本地hosts文件及DNS缓存信息,查找是否存在网址对应的IP解析记录。如果有就直接获取到IP地址,然后访问网站,一般第一次请求时,DNS缓存是没有解析记录的;
第二步:如果客户端没有DNS缓存或hosts没有对应www.baidu.com网站网址的域名解析记录,那么,系统会把浏览器的解析请求,交给客户端本地设置的DNS服务器地址解析(此DNS为LDNS,即Local DNS),如果LDNS服务器的本地缓存有对应的解析记录,就会直接返回IP地址;如果没有,LDNS会负责继续请求其它的DNS服务器;
第三步:LDNS会从DNS系统的“.”根开始请求www.baidu.com域名的解析,经过一系列的查找各个层次DNS服务器,最终会查找到www.baidu.com域名对应的授权DNS服务器,而这个授权DNS服务器,正是该企业购买域名时用于管理域名解析的服务器。这个服务器有www.baidu.com对应的IP解析记录,如果此时都没有,就表示企业的运维人员么有给www.baidu.com域名做解析;
第四步:baidu.com域名对应的授权DNS服务器会把www.baidu.com对应的最终IP解析记录发给LDNS;
第五步:LDNS把收到来自授权DNS服务器关于www.baidu.com对应的IP解析记录发给客户端浏览器,并且在LDNS本地把域名和IP的对应解析缓存起来,以便下一次更快的返回相同的解析请求的记录;
第六步:客户端浏览器获取到了www.baidu.com的对应IP地址,接下来浏览器会请求获得的IP地址对应的Web服务器,Web服务器接收到客户的请求并响应处理,将客户请求的内容返回给客户端浏览器;
至此,一次访问浏览网页的完整过程就完成了
dns的分类
主DNS服务器:就是一台存储着原始资料的DNS服务器。
从DNS服务器:使用自动更新方式从主DNS服务器同步数据的DNS服务器。也称辅助DNS服务器。
缓存服务器:不负责本地解析,采用递归方式转发客户机查询请求,并返回结果给客户机的DNS服务器。同时缓存查询回来的结果,也叫递归服务器。
转发器:这台DNS发现非本机负责的查询请求时,不再向根域发起请求,而是直接转发给指定的一台或者多台服务器。自身并不缓存查询结果。
dig解析详解
[root@xinlibao xlb1.com]# dig -t A baidu.com
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.4 <<>> -t A baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37773
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 5, ADDITIONAL: 6
;; QUESTION SECTION: #查询的内容
;baidu.com. IN A
;; ANSWER SECTION: #相应的内容,一般会得到至少一条A 记录,否则就还没有定义。
baidu.com. 347 IN A 111.13.101.208
;; AUTHORITY SECTION: #授权信息
baidu.com. 22823 IN NS ns7.baidu.com.
baidu.com. 22823 IN NS ns4.baidu.com.
baidu.com. 22823 IN NS ns3.baidu.com.
baidu.com. 22823 IN NS ns2.baidu.com.
baidu.com. 22823 IN NS dns.baidu.com.
;; ADDITIONAL SECTION: #每个授权服务器的IP
dns.baidu.com. 22823 IN A 202.108.22.220
ns2.baidu.com. 22823 IN A 61.135.165.235
ns3.baidu.com. 22823 IN A 220.181.37.10
ns4.baidu.com. 22823 IN A 220.181.38.10
ns7.baidu.com. 22823 IN A 119.75.219.82
caishikou.redirect. 3600 IN A 127.0.0.1
;; Query time: 35 msec
;; SERVER: 114.114.114.114#53(114.114.114.114) #查询的dns服务器
;; WHEN: Sun Nov 26 21:23:41 2017
;; MSG SIZE rcvd: 247
智能dns解析原理
DNS智能解析简单的来说就是根据DNS服务器根据客户端请求IP的不同来给客户端返回不同的服务器地址,比如说电信用户访问www.baidu.com的时候DNS服务器会返回给用户电信服务器,网通用户访问www.baidu.com的时候DNS服务器会返回给用户网通服务器,这样就解决了南北用户访问过慢或电信用户访问网通服务器过慢的问题,国内著名的DNSpod实现的也是这样的一个功能,而BIND9自带的VIEW视图功能就可以完全实现这个功能。VIEW视图可以说是BIND9一个最强大的功能之一,他可以完全按照你要求来实现DNS服务器对不同IP、不同网段的智能解析工作。
学习Bind
Bind是一款开放源码的DNS服务器软件,Bind由美国加州大学Berkeley分校开发和维护的,全名为Berkeley Internet Name Domain它是目前世界上使用最为广泛的DNS.
环境准备
配置yum源。
我用的系统是centos6.8,使用centos6.8自带的yum源即可,同时确保机器可以解析外网域名,并能连接公网。
部署单dns
Yum安装bind
yum install bind-utils bind bind-devel bind-chroot -y
检查:
[root@dns ~]# rpm -qa|grep bind
bind-9.8.2-0.62.rc1.el6_9.4.x86_64
bind-chroot-9.8.2-0.62.rc1.el6_9.4.x86_64
bind-devel-9.8.2-0.62.rc1.el6_9.4.x86_64
bind-libs-9.8.2-0.62.rc1.el6_9.4.x86_64
bind-utils-9.8.2-0.62.rc1.el6_9.4.x86_64
编辑主配置文件之前copy一份cp /etc/named.conf{,.bak}
编辑主配置文件vi /etc/named.conf(配置文件,定义bind进程的工作属性,区域的定义。)
options {
version "1.1.1";
listen-on port 53 {any;}; #表示监听任何ip对53端口的请求
directory "/var/named/chroot/etc/";
pid-file "/var/named/chroot/var/run/named/named.pid";
allow-query { any; }; #表示接收任何来源查询dns
Dump-file "/var/named/chroot/var/log/binddump.db";
Statistics-file "/var/named/chroot/var/log/named_stats";
zone-statistics yes;
memstatistics-file "log/mem_stats";
empty-zones-enable no;
forwarders {202.106.196.115;8.8.8.8; };
};
key "rndc-key" {
algorithm hmac-md5;
secret "Eqw4hClGExUWeDkKBX/pBg==";
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
logging {
channel warning {
file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m;
severity warning;
print-category yes;
print-severity yes;
print-time yes;
};
channel general_dns {
file "/var/named/chroot/var/log/dns_log" versions 10 size 100m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default {
warning;
};
category queries {
general_dns;
};
};
include "/var/named/chroot/etc/view.conf";
编辑/etc/rndc.key(实现让远程工作的密钥文件)
key "rndc-key" {
algorithm hmac-md5;
secret "Eqw4hClGExUWeDkKBX/pBg==";
};
编辑/etc/rndc.conf(rndc的配置文件)
key "rndc-key" {
algorithm hmac-md5;
secret "Eqw4hClGExUWeDkKBX/pBg==";
};
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
编辑/var/named/chroot/etc/view.conf
view "View" {
zone "xlb.com" {
type master;
file "xlb.com.zone";
allow-transfer {
10.255.253.211;
};
notify yes;
also-notify {
10.255.253.211;
};
};
};
编辑/var/named/chroot/etc/xlb.com.zone
$ORIGIN .
$TTL 3600 ; 1 hour
xlb.com IN SOA op.xlb.com. dns.xlb.com. (
2000 ; serial
900 ; refresh (15 minutes)
600 ; retry (10 minutes)
86400 ; expire (1 day)
3600 ; minimum (1 hour)
)
NS op.xlb.com.
$ORIGIN xlb.com.
shanks A 1.2.3.4
op A 1.2.3.4
修改权限
[root@dns ~]# cd /var && chown -R named.named named/
[root@dns var]# /etc/init.d/named start
Starting named: [ OK ]
域名解析验证
[root@dns var]# dig @127.0.0.1 shanks.xlb.com
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.4 <<>> @127.0.0.1 shanks.xlb.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18531
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;shanks.xlb.com. IN A
;; ANSWER SECTION:
shanks.xlb.com. 3600 IN A 1.2.3.4
;; AUTHORITY SECTION:
xlb.com. 3600 IN NS op.xlb.com.
;; ADDITIONAL SECTION:
op.xlb.com. 3600 IN A 1.2.3.4
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Nov 23 17:34:15 2017
;; MSG SIZE rcvd: 81
[root@dns ~]# dig @172.16.1.128 shanks.xlb.com
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.4 <<>> @172.16.1.128 shanks.xlb.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39717
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;shanks.xlb.com. IN A
;; ANSWER SECTION:
shanks.xlb.com. 3600 IN A 1.2.3.4
;; AUTHORITY SECTION:
xlb.com. 3600 IN NS op.xlb.com.
;; ADDITIONAL SECTION:
op.xlb.com. 3600 IN A 1.2.3.40
;; Query time: 0 msec
;; SERVER: 172.16.1.128#53(172.16.1.128)
;; WHEN: Thu Nov 23 18:04:51 2017
;; MSG SIZE rcvd: 81
配置智能dns(view视图)
编辑主配置文件vim /etc/named.conf ##直接复制粘贴即可
options {
listen-on port 53 {any;};
allow-recursion {"none";};
recursion yes;
allow-query {any;};
max-cache-ttl 900;
directory "/var/named";
pid-file "/var/named/named.pid";
dump-file "/var/named/named_dump.db";
statistics-file "/var/named/named.status";
};
include "/var/named/view/test1_view/ip";
include "/var/named/view/test1_view/view.conf";
编辑配置文件/var/named/view/test1_view/ip
##文件test1_view是没有的需要手动创建
mkdir /var/named/view/test1_view/ -p
##编辑配置文件ip
acl test1_view{
192.168.1.110;
};
acl test2_view{
172.16.1.50;
};
##编辑view.conf文件
view "test1" {
match-clients { test1_view;};
zone "xlb.com" in {
type master;
file "/var/named/xlb.com/zone.xlb.com";
allow-update{none;};
};
};
view "test2" {
match-clients { test2_view;};
zone "xlb.com" in {
type master;
file "/var/named/xlb.com/zone.xlb1.com";
allow-update{none;};
};
};
编辑/var/named/xlb.com/zone.xlb.com
##创建目录:
mkdir /var/named/xlb.com/ -p
##编辑 /var/named/xlb.com/zone.xlb.com
$ORIGIN .
$TTL 3600 ; 1 hour
xlb.com IN SOA op.xlb.com. dns.xlb.com. (
2000 ; serial
900 ; refresh (15 minutes)
600 ; retry (10 minutes)
86400 ; expire (1 day)
3600 ; minimum (1 hour)
)
NS op.xlb.com.
$ORIGIN xlb.com.
shanks A 1.2.3.5
op A 1.2.3.6
##编辑 /var/named/xlb.com/zone.xlb1.com
$ORIGIN .
$TTL 3600 ; 1 hour
xlb.com IN SOA op.xlb.com. dns.xlb.com. (
2005 ; serial
900 ; refresh (15 minutes)
600 ; retry (10 minutes)
86400 ; expire (1 day)
3600 ; minimum (1 hour)
)
NS op.xlb.com.
$ORIGIN xlb.com.
op A 192.168.122.2
shanks A 192.168.122.2
编辑master节点vim /var/named/chroot/etc/group2.viewlnh.com.zone
$ORIGIN .
$TTL 3600 ; 1 hour
viewlnh.com IN SOA op.viewlnh.com. dns.viewlnh.com. (
2005 ; serial
900 ; refresh (15 minutes)
600 ; retry (10 minutes)
86400 ; expire (1 day)
3600 ; minimum (1 hour)
)
NS op.viewlnh.com.
$ORIGIN viewlnh.com.
op A 192.168.122.2
view A 192.168.122.2
配置完成后可以检查语法
named-checkconf
修改文件所属,加载配置。
chown named.named /var/named/*
rndc reload
验证IP地址192.168.1.110
验证 IP地址192.168.1.110
[root@xinlibao xlb.com]# dig -t A op.xlb.com @192.168.1.110 #这是我本机ip就是dns服务器ip
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.4 <<>> -t A op.xlb.com @192.168.1.110
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 418
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;op.xlb.com. IN A
;; ANSWER SECTION:
op.xlb.com. 3600 IN A 1.2.3.6
;; AUTHORITY SECTION:
xlb.com. 3600 IN NS op.xlb.com.
;; Query time: 0 msec
;; SERVER: 192.168.1.110#53(192.168.1.110)
;; WHEN: Mon Nov 27 09:54:38 2017
;; MSG SIZE rcvd: 58
[root@xinlibao xlb.com]# dig -t A shanks.xlb.com @192.168.1.110
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.4 <<>> -t A shanks.xlb.com @192.168.1.110
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12427
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;shanks.xlb.com. IN A
;; ANSWER SECTION:
shanks.xlb.com. 3600 IN A 1.2.3.5
;; AUTHORITY SECTION:
xlb.com. 3600 IN NS op.xlb.com.
;; ADDITIONAL SECTION:
op.xlb.com. 3600 IN A 1.2.3.6
;; Query time: 0 msec
;; SERVER: 192.168.1.110#53(192.168.1.110)
;; WHEN: Mon Nov 27 09:56:14 2017
;; MSG SIZE rcvd: 81
验证ip地址172.16.1.50
[root@xinlibao xlb.com]# dig -t A shanks.xlb.com @172.16.1.50
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.4 <<>> -t A shanks.xlb.com @172.16.1.50
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20873
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;shanks.xlb.com. IN A
;; ANSWER SECTION:
shanks.xlb.com. 3600 IN A 192.168.122.2
;; AUTHORITY SECTION:
xlb.com. 3600 IN NS op.xlb.com.
;; ADDITIONAL SECTION:
op.xlb.com. 3600 IN A 192.168.122.2
;; Query time: 0 msec
;; SERVER: 172.16.1.50#53(172.16.1.50)
;; WHEN: Mon Nov 27 09:58:20 2017
;; MSG SIZE rcvd: 81
[root@xinlibao xlb.com]# dig -t A op.xlb.com @172.16.1.50
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.4 <<>> -t A op.xlb.com @172.16.1.50
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23688
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;op.xlb.com. IN A
;; ANSWER SECTION:
op.xlb.com. 3600 IN A 192.168.122.1
;; AUTHORITY SECTION:
xlb.com. 3600 IN NS op.xlb.com.
;; Query time: 0 msec
;; SERVER: 172.16.1.50#53(172.16.1.50)
;; WHEN: Mon Nov 27 10:00:06 2017
;; MSG SIZE rcvd: 58