DNS原理介绍和具体搭建DNS

简介:

DNS (Domail Name Server,域名服务)

一、DNS概述

    DNS 是一种 C/S 架构,实现域名解析。服务端监听在 UDP/53 和 TCP/53 号端口。主要主机名与 IP 地址之间的名称解析。

    所谓的名称解析:简单的来说是将一种名称转换为另一种名称。通常是用户名和 IP 地址之间的转换。它们之间是通过解析库来实现的。像 /etc/passwd 文件就是一种用户名和UID之间的一种解析库。

    在 Linux 操作系统中,服务端协议的实现是 bind 软件,客户端通过调用 共享库 向服务端发出请求,通过查询解析库来获得解析结果。

二、DNS的树状结构

    DNS最主要的实现方式是FQDN(Full Qualified Domail Name,完全限定主机名)向IP地址的解析。例如:当我问访问在互联网里访问 www.goole.com 的时候,DNS 服务器就会将他解析成对应的 IP 地址来进行访问。

    实际在访问的主机名是 www.goole.com. ,它是由 根域,一级域,二级域,主机名组成的。

    根域:  “.”是DNS域名的最顶端的域。这样的域名服务器全球只有13个。

    一级域:.com .net .cn .gov。

    二级域:一般是公司和组织的名称,向 goole,baidu等。

    主机名:一般式是某台主机的名称。

三、DNS服务器类型

  • 主DNS服务器:

    主要负责 DNS 域名解析。本服务器可以使一个权威服务器,负责一个区域的域名解析。主要靠解析库文件来完成名称的解析。

  • 从DNS服务器:

    是主服务器的一个热备,当主服务器出现故障时,会通过从服务器来解析。实现主从复制最主要的是解析库文件的同步,即区域传送。

    区域传送有完全区域传送(AXFR)和增量区域传送(IXFR)。

  • 缓存服务器:

    一般都是在本地或者是在局域网内。一是为了提高解析速度,二是为了减轻服务端的压力。

  • 交换服务器:

    一般用在子域授权的机制中用到这种服务器。在子域中访问父域的主机名是需要用到这种机制。

四、DNS查询过程

    查询的方式有递归查询和迭代查询。

    递归查询是客户端只需要发出一次请求,最后直接返回结果的这种查询;迭代查询就是只要查询到结果就返回,然后在由客户端根据查询到的结果再次发出查询请求的过程。在实际的过程中是递归查询和迭代查询是结合在一起来使用的。

wKiom1Pg7VDBYjs_AAEQpb-qv-4339.jpg


    在进行域名解析的时候,DNS查询是真正的顺序是:本地的  /etc/hosts 文件 -->  本地的DNS缓存  -->  本地局域网的DNS服务器  -->  迭代查询公共的DNS服务器。

五、服务介绍

    在 Linux 中DNS服务是由 bind 这个开源软件来提供的。在安装这个软件后,有后台守护进程来 named 控制,运行此进程的用户是系统用户 named。为了安全考虑,named 进程一般运行于 chroot 环境中,模拟的根在 /var/named/chroot 目录下。

1、相关文件

  • 服务脚本: /etc/init.d/named 

  • 主配置文件: /etc/named.conf  /etc/named.rfc1912.zones

  • 区域配置(解析库)文件:/var/named/ZONE_NAME.zone

2、配置文件的说明

    主配置文件: /etc/named.conf  /etc/named.rfc1912.zones

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#  /etc/named.conf
# 在这个文件中主要定义(这些定义是全局范围内有效的):
# 监听的IP地址和端口号
# 区域文件的家目录
# 是否允许递归查询
# 查询请求
options {
       listen-on port 53 { 127.0.0.1; };
       listen-on-v6 port 53 { ::1; };
       directory        "/var/named" ;
       allow-query     { localhost; };
       recursion  yes ;
};
 
# /etc/named.rfc1912.zones
# 在这个文件安中主要定义的是 区域解析库文件
# 一般的格式如下:
zone  "ZONE_NAME"  IN {
         属性定义;
};
# 常见的属性定义有:
# type 指明服务器的类型 常见的有 master hint slave forword
# file 指明区域文件的名称
 
# masters 在 type 为 slave 一起使用,指明主服务器的地址,常见的还有 allow-transfer { IP; };
# 指明允许区域传送的地址,一般在主服务器端这是为从服务器端的 IP 地址,从服务器端设置为 none。
 
# forward only|first 指明转发服务器的类型,only 只做转发,转发后的查询结果狗接受;first 
# 指的是转发到的那台 DNS 服务器如果查询不到结果,自己会迭代查询。通常与 type 为forward时
# 一起使用。通常还有 forwarders { ip; }; 指定转发的DNS服务器的名称。
# 此时在服务端要设定 allow-recusion { ip; }; 允许递归的 IP 地址,此时 IP 地址是请求转发的 IP 地址,
# 这种情况下一般是在子域授权的时候会使用。
 
# 其他常见的参数有:
# all-update { ip; }; 允许更新 DNS 解析文件的 IP 地址
 
# file 来指明 zone 文件的名称。00
 
# ZNOE_NAME 一般是区域名,对于正向解析是 一般是域名,例如:guotign.com
# 对于反向解析时,一般是网络地址逆序.in-addr.arpa 例如:16.172.in-addr.arpa
 
# 其他常见的控制有 acl 和 view。
acl ACL_NAME { 
     ip;
     net; ...
};

    区域配置(解析库)文件:/var/named/ZONE_NAME.zone

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
# 这个文件中定义了资源记录,常见的资源记录有:SOA NS A A6(AAAA) MX CNAME PTR 
# 这些资源定义的格式如下:
 
Name     [TTL]     IN    RR_TYPE    RRDATA
 
# SOA(Start Of AuthOrity,起始授权记录),任何解析库文件的第一个记录必须是 SOA 
# Name值一般为区域名,通常我们用 @ 来代替。RRDATA 是主服务器的 FQDN,也可以是当前区域的名称 @。
# 例如:
 
@        IN        SOA        ns.guoting.com.  admin.guoting.com. (
             2014080601        ;serial number 解析库的序列号。主要用于主从复制
             2H                ;refresh  time   周期性同步时间间隔
             5M                ;retry   time    重试时间间隔
             1H                ;expire  time    过期时长
             1D                ;negetive answer ttl  否定答案同一缓存时长
 
 
# NS(Name Server)
# Name 是区域名称,一般也是 @ 来代替,如果此时是空白的话,就会继承上一个资源记录的 Name 的值
# RRDATA 的值是主 DNS 的FQDN
# 如果有多台 NS 服务器,每一台都必须有一个 NS 记录。
# 例如:
@    IN    NS    ns.guoting.com.
 
# MX(Mail eXchanger,邮件交换记录)
# Name 的值一般也是区域名称,RRDATA 邮件服务器的 FQDN 。
# 一台邮件服务器对应一个 MX 记录,每个 MX 记录还有优先级的设定。数值越小所代表的优先级越高。
# 例如:
# 这里说明一下:主机名书写的2种方式 mail 或者是 mail.guoting.com.
@    IN    MX    10    mail
 
# A AAAA(A6) Address记录 
# Name 一般是 FQDN;RRDATA 是对应的 IP 地址
# 例如:
mail    IN    A    192.168.10.23
 
 
# CNZME(Canonical Name正式名称)
# Name 和 RRDATA 的值一般都是 FQDN。表示的是 Name 是 RRDATA 的别名。
# 例如:
mail2    IN    CNAME    mail 等价于:
mail2.guoting.com.    IN    CNAME    mail.guoting.com.
 
# PTR(PoinTeR 记录)
# 这个记录主要是用于反向解析的时候
# Name 是逆向 IP 地址加后缀 .in-addr.arpa. 
# RRDATA 是 FQDN
# 例如:
9.10    IN    PTR    ns.guoting.com.
或者是:
9.10.16.172. in -addr.arpa.    IN    PTR    ns.guoting.com
 
# 常用到的 2 个内置变量
# $TTL(time-to-live of the RR)设置资源记录的生存周期
# $ORIGIN 设定默认区域名

 ORIGIN的用法通常如下:

wKiom1Ph74LCNrypAAGmLmqPsAw175.jpg

    上面是一些常见的资源记录,更多详细的的信息参照 http://www.isc.org/downloads/bind/doc/ 。

六、相关工具

1、named-checkconf  named-checkzone  named-compilezone 

    这几个命令的主要作用是检查配置文件和解析库文件的语法格式的。

  • named-checkconf是用来检查主配置文件的语法格式的。

        用法:

            named-checkconf 

  • named-checkzone、named-compilezone是用来检查 zone 文件的语法格式的。

    用法:

        named-checkzone  zonename filename

        named-compilezone -o filename zonename filename # -o 会对zone 文件做一个备份

    例如:

        named-checkzone  "guoting.com"  /var/named/guoting.com.zone

        named-compilezone -o  guoting.bck "guoting.com"  /var/named/guoting.com.zone

2、客户端查询工具

    常见的客户端的查询工具有 host,dig,nslookup。

host -t {A|NS|CNAME|PTR|MX} type_name dns_server 例如:

1
2
3
4
5
6
7
[root@server named] # host -t A www.guoting.com 172.16.10.9
Using domain server:
Name: 172.16.10.9
Address: 172.16.10.9 #53
Aliases: 
 
www.guoting.com has address 172.16.10.16

dig -t {A|NS|CNAME|MX}  type_name @dns_server

    逆向查询:dig -x IP @dns_server

    dig 查询的信息比较详细,是我们一般的首选查询工具

wKioL1Ph3_Gh_QvZAALZFehv_q0652.jpg


nslookup是一种交互式的查询工具,这个工具在 windows 操作系统上也可以使用。

wKiom1Ph03jRQnvlAADr34IFbuY587.jpg

    用server来指定DNS服务器的名称,set type=RR 来指定查询资源记录的名称,指定后直接查询对应的资源记录即可。

七、自建 DNS 服务器

    这里需要说明的是在这里所自建的DNS服务器实在本地局域网内的权威服务器。目的是解决本地局域网内的域名解析。

1、实现主从复制DNS服务器,实现正向和反向解析

    前提:主服务器和从服务器时间要同步,建议使用 ntp 服务器同步。

实验的拓扑图如下:

wKioL1Ph112yK1b0AADPMtQJS6c216.jpg

在 172.16.10.9 主dns服务器:

1、安装软件

# yum install bind -y

2、修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
# vim /etc/name.conf
# 主要的配置选向如下,其他的课根据自己需要添加:
 
options {
     directory  "/var/named" ;
};
 
zone  "."  IN {
     type  hint;
     file  "named.ca" ;
};
 
include  "/etc/named.rfc1912.zones" ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# vim /etc/named.rfc1912.zones
# 在这个文件中添加以下内容:
 
zone  "guoting.com"  IN {
     type  master;
     file  "guoting.com.zone" ;
     allow-transfer { 172.16.10.16; };
     allow-update { none };
};
zone  "16.172.in-addr.arpa"  IN {
     type  master;
     file  "172.16.zone" ;
     allow-transfer { 172.16.10.16; };
     allow-update { none; };
};

3、创建解析库文件

1
2
3
4
5
6
7
8
9
10
11
12
13
# vim /var/named/guoting.com.zone
 
$TTL 3600
$ORIGIN guoting.com.
@    IN    SOA    ns.guoting.com.    admin.guoting.com. (2014080501 2H 5M 1H 1D)
@   IN         NS     ns
@   IN         NS     ns2
@   IN         MX  10  mail
ns2      IN  A     172.16.10.16
ns      IN   A       172.16.10.9
mail     IN      A       172.16.10.16
www      IN  A       172.16.10.99
web  IN   CNAME  www
1
2
3
4
5
6
7
8
9
10
11
# vim /var/named/172.16.zone
$TTL 3600
$ORIGIN 16.172. in -addr.arpa.
@    IN    SOA    ns.guoting.com.    admin.guoting.com. (2014080501 2H 5M 1H 1D)
 
@  IN     NS     ns.guoting.com.
@   IN     NS     ns2.guoting.com.
9.10   IN     PTR    ns.guoting.com.
16.10   IN  PTR    ns2.guoting.com.
16.10   IN  PTR    mail.guoting.com.
99.10  IN     PTR    www.guoting.com.

编辑对应的解析库文件后,修改属组和权限:

1
2
3
4
  chmod  644  /var/named/guoting .com.zone
  chown  .named   /var/named/guoting .com.zone
  chmod  644  /var/named/172 .16.zone
  chown  .named   /var/named/172 .16.zone

4、启动服务

    启动服务之前需要对解析库文件进行对应的语法和完整性检查。

1
2
3
named-checkconfig
named-checkzone  "guoting.com"  /var/named/guoting .com.zone
named-checkzone  "16.172.in-addr.arpa"  /var/named/172 .16.zone

    完成这些之后,启动 named 进程。

1
/etc/init .d /named  start

    在启动过程中可能会遇到 "卡” 的情况。

1
2
3
4
5
6
7
8
9
# 原因是:named 进程在启动过程中会去读取 /etc/rndc.key 文件去读取随机数。
# rndc.key 这个文件时从 /dev/random 中取得随机数,虽有会卡。
# 解决办法:
# 1、修改 rndc.key 文件的读取随机数的方式为 /dev/urandom。
 
# 2、敲击键盘,获得足够的随机数到 /dev/randow 中去。
 
/dev/urandom :先返回熵池中的随机数,耗尽后会用软件算法生成随机数;进程不会阻塞;
/dev/random : 只返回熵池中的随机数; 随机数耗尽,进程会被阻塞;随机数取走一个就少一个。

    对于解决办法1,具体:修改 /etc/ini.d/named 脚本 

wKiom1Ph6lbQDjqgAAF-icWSAi8894.jpg

5、查询测试

wKiom1Ph7XGgrRjmAAF-8nlZACQ314.jpg

    测试成功后,主服务器配置完成。

在 172.16.10.16 从dns服务器:

1、安装软件

# yum install bind -y

2、修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
# vim /etc/name.conf
# 主要的配置选向如下,其他的课根据自己需要添加:
 
options {
     directory  "/var/named" ;
};
 
zone  "."  IN {
     type  hint;
     file  "named.ca" ;
};
 
include  "/etc/named.rfc1912.zones" ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# vim /etc/named.rfc1912.zones
# 在这个文件中添加以下内容:
 
zone  "guoting.com"  IN {
     type  slave;
     file  "slaves/guoting.com.zone" ;
     masters { 172.16.10.9; };
     allow-transfer { none; };
     allow-update { none; };
};
zone  "16.172.in-addr.arpa"  IN {
     type  slave;
     file  "slaves/172.16.zone" ;
     masters { 172.16.10.9; };
     allow-transfer { none; };
     allow-update { none; };
};

3、启动服务

1
2
3
/etc/init .d /named  start
 
# 启动完成后,检查 /var/named/slaves 目录下是否有对应的解析库文件

4、从服务器查询测试

wKioL1Ph-DLwXN5HAAGDbY2Z5Ko204.jpg

    到此,为止主从复制的搭建过程就完成。

补充:

    在以后,如果主服务器的解析文件改变的时候,每次都需要修改 SOA 资源记录的序列号,然后使用 rndc reload重读配置文件。

    rndc(Rmote Name Domain Contol,远端域名控制)监听在 tcp/953 端口,实现通过远端来控制解析可文件的重读,配置文件的重读等功能。一般情况下,只在本地使用。

    常用命令:

  • rndc reconfig  重读主配置文件

  • rndc reload  重读解析库文件

  • rndc flush    刷新缓存

  • rndc status    查看 DNS 服务器状态信息

2、在主从服务的基础上扩展子域授权功能(只实现正向解析)

    当一个公司某一部门需要自己独立的域名时候,会用到这种功能。要求“父域”与“子域”可以相互解析。

实验拓扑如下:

wKiom1PiAA7Qpdr1AADSFTZWjBc758.jpg

在 172.16.10.9 主dns服务器:

1、修改配置文件、区域解析文件为:

1
2
3
4
5
# vim /etc/name.conf
options {
     directory  "/var/named" ;
     allow-recusion { 172.16.10.22; };   # 允许172.16.10.22 递归查询
};


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# vim /var/named/guoting.com.zone
 
$TTL 3600
$ORIGIN guoting.com.
@    IN    SOA    ns.guoting.com.    admin.guoting.com. (2014080501 2H 5M 1H 1D)
@   IN     NS     ns
@   IN     NS     ns2
@   IN     MX  10  mail
ops     IN      NS      ns.ops  
ns.ops  IN      A       172.16.10.22
ns2      IN  A     172.16.10.16
ns      IN   A       172.16.10.9
mail     IN      A       172.16.10.16
www      IN  A       172.16.10.99
web  IN   CNAME  www

2、重读库解析文件

    rndc reload

在 172.16.10.22 子域dns服务器:

1、安装软件

# yum install bind -y

2、修改配置文件

1
2
3
4
5
6
7
8
9
10
11
# vim /etc/name.conf
options {
     directory  "/var/named" ;
};
 
zone  "."  IN {
     type  hint;
     file  "named.ca" ;
};
 
include  "/etc/named.rfc1912.zones" ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# vim /etc/named.rfc1912.zones
# 在这个文件中添加以下内容:
 
zone  "ops.guoting.com"  IN {
     type  master;
     file  "ops.guoting.com.zone" ;
     allow-update { none; };
};
zone  "guoting.com"  IN {
     type  forward;
     forward only;
     forwarders { 172.16.10.9 };
     allow-update { none; };
};

3、创建解析库文件

1
2
3
4
5
6
7
8
9
10
# vim /var/named/ops.guoting.com.zone
 
$TTL 3600
$ORIGIN ops.guoting.com.
@    IN    SOA    ns.ops.guoting.com.    admin.ops.guoting.com. (2014080501 2H 5M 1H 1D)
@   IN         NS     ns
@   IN         MX  10  mail
ns      IN   A       172.16.10.22
mail     IN      A       192.168.1.10
www      IN  A       192.168.1.90

编辑对应的解析库文件后,修改属组和权限:

1
2
  chmod  644  /var/named/ops .guoting.com.zone
  chown  .named   /var/named/ops .guoting.com.zone

4、启动服务

    /etc/init.d/named start

查询测试:

在 172.16.10.9:

wKiom1PiDKGzry8bAAJlp9rIE3Q361.jpg

在 172.16.10.22:

wKiom1PiDNmjXfEOAAEPoancOIU261.jpg

    至此,子域授权创建过程完毕。

3、实现视图功能

    视图主要的功能是当不同类的客户端解析不同的域名时,解析到的地址信息也是不同的。通常与acl一起使用。

实验拓扑图如下:

wKioL1PiHVnAFUFWAAC-lPPT1B8363.jpg

在 172.16.10.9 中配置:

    实验中采用 172.16.10.16 客户端来模拟内网用户,使用192.168.1.66来模拟外网用户。

1、编辑配置文件

wKiom1PiLNLzD9bBAAG36AqcJek677.jpg

wKioL1PiLnrzx9nsAAGE_k3ldW4147.jpg

2、修改文件属性,重新加载配置文件

1
2
3
4
5
6
7
# 这几项比较重要,记得修改
chmod  640  /var/named/guoting .com.zone.internal 
chmod  640  /var/named/guoting .com.zone.external 
chown  root.named  /var/named/guoting .com.zone.internal 
chown  root.named  /var/named/guoting .com.zone.external
 
rndc reload

3、查询测试

模拟内网测试:

wKiom1PiLjXw8ortAAJGNHtBdDA869.jpg

模拟外网测试: 说明:192.168.1.66 与 172.16.10.9 是同一台主机,不同网卡的地址。

wKioL1PiLzrDnDR3AADluSteFqQ871.jpg


    至此,本文全部完成。











本文转自 羊木狼 51CTO博客,原文链接:http://blog.51cto.com/guoting/1536612,如需转载请自行联系原作者
目录
相关文章
|
2天前
|
XML JavaScript 数据格式
Beautiful Soup 库的工作原理基于解析器和 DOM(文档对象模型)树的概念
Beautiful Soup 使用解析器(如 html.parser, lxml, html5lib)解析HTML/XML文档,构建DOM树。它提供方法查询和操作DOM,如find(), find_all()查找元素,get_text(), get()提取信息。还能修改DOM,添加、修改或删除元素,并通过prettify()输出格式化字符串。它是处理网页数据的利器,尤其在处理不规则结构时。
7 2
|
4天前
|
机器学习/深度学习 人工智能 数据可视化
号称能打败MLP的KAN到底行不行?数学核心原理全面解析
Kolmogorov-Arnold Networks (KANs) 是一种新型神经网络架构,挑战了多层感知器(mlp)的基础,通过在权重而非节点上使用可学习的激活函数(如b样条),提高了准确性和可解释性。KANs利用Kolmogorov-Arnold表示定理,将复杂函数分解为简单函数的组合,简化了神经网络的近似过程。与mlp相比,KAN在参数量较少的情况下能达到类似或更好的性能,并能直观地可视化,增强了模型的可解释性。尽管仍需更多研究验证其优势,KAN为深度学习领域带来了新的思路。
50 5
|
4天前
|
敏捷开发 测试技术 持续交付
极限编程(XP)原理与技巧:深入解析与实践
【5月更文挑战第8天】极限编程(XP)是一种敏捷开发方法,注重快速反馈、迭代开发和简单设计,以提高软件质量和项目灵活性。关键原则包括客户合作、集体代码所有权、持续集成等。实践中,使用故事卡片描述需求,遵循编程约定,实行TDD,持续重构,结对编程,并定期举行迭代会议。通过理解和应用XP,团队能提升效率,应对变化。
|
6天前
|
缓存 自然语言处理 JavaScript
万字长文深度解析JDK序列化原理及Fury高度兼容的极致性能实现
Fury是一个基于JIT动态编译的高性能多语言原生序列化框架,支持Java/Python/Golang/C++/JavaScript等语言,提供全自动的对象多语言/跨语言序列化能力,以及相比于别的框架最高20~200倍的性能。
|
12天前
|
存储 芯片
【期末不挂科-单片机考前速过系列P11】(第十一章:15题速过串行口的工作原理和应用)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P11】(第十一章:15题速过串行口的工作原理和应用)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P10】(第十章:11题中断系统的工作原理及应用)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P10】(第十章:11题中断系统的工作原理及应用)经典例题盘点(带图解析)
|
12天前
|
C语言 C++
【期末不挂科-单片机考前速过系列P1】(第一章:27题搞定单片机&其工作原理)经典例题盘点【选择题&判断题&填空题】(带图解析)
【期末不挂科-单片机考前速过系列P1】(第一章:27题搞定单片机&其工作原理)经典例题盘点【选择题&判断题&填空题】(带图解析)
|
12天前
|
JavaScript 前端开发 算法
vue生命周期函数原理解析,vue阻止事件冒泡方法实现
vue生命周期函数原理解析,vue阻止事件冒泡方法实现
|
13天前
|
芯片
EDA设计:原理、实践与代码深度解析
EDA设计:原理、实践与代码深度解析
26 2
|
13天前
|
算法 计算机视觉 Python
DSP技术深度解析:原理、实践与应用
DSP技术深度解析:原理、实践与应用
21 1

相关产品

  • 云解析DNS
  • 推荐镜像

    更多