互联网那些事——DNS

独自空忆成欢 提交于 2020-01-04 00:27:58

DNS是互联网基础服务,没有DNS,互联网就几乎进入瘫痪状态了。DNS对于很多非计算机专业的同学来说,了解程度可能仅限于一个网址,但你要跟他们说域名,很多人就不知所云了,这就是DNS作为互联网基础设施,作为底层基础服务带来透明化,虽然带给了大家极大的方便,人们几乎时时刻刻都在用这个服务,可很少有人知道自己在用这个服务,跟不会关心这个服务是如何搭建和工作的。

作为计算机专业人员,如果不知道DNS就很麻烦了,至少在某些时候,出现的问题会让你丈二和尚摸不着头脑,因为和DNS相关的网络问题时常会不经意的跳出来和你不期而遇,如果你不知道有DNS这个玩意,或者对DNS知之甚少,说不定会让你兜个大圈子还不一定找到解决的办法。

DNS是域名服务的缩写,提供域名服务的服务器就是域名服务器,我们访问的网站所对应的IP地址就是由DNS解析后,把对应的IP返回给浏览器的,这可能是大家使用DNS最多的方式吧,那这个DNS是在哪里呢,我怎么从来不知道我在用DNS,我用的DNS是谁提供的呢,其实回答这个问题很简单,看下面这张图,你就明白了:

 上面圈定的地方可以查看自己所用DNS的IP地址。

如果你想对DNS了解的更多一些,仅仅知道这些是不够的,DNS是运行在互联网上的基础服务,全世界仅有几十台根域名服务器,这还是最近几年新增了N台根域名服务器后的数量。在几年前,全世界仅有13台根域名服务器,大部分都分布在美国境内,当时,我国境内没有一台根域名服务器。我们前面已经知道,如果DNS不能访问所带来的影响,如果分布在国外的这些根服务器全都不能访问,问题是非常严重的。所以,各国都在努力争取建立本国境内的根域名服务器,降低在信息安全和资源垄断方面的风险。自己足够强大是客观要求,各位一直在努力的同学,为我们互相点个赞吧。

DNS是域名服务器,我们常见的网站地址是域名的一种广为人知的展现形式,作为互联网上的基础设施,域名是标准的互联网设备名称,每台联网的计算机都可以用域名来命名。我们完全可以把www.google.com做为一台连接到互联网的计算机,这台计算机的名字就叫www.google.com,而谷歌的其他计算机也可以用类似的名字来命名,可以叫web1.google.com, web10.google.com, nginx1.google.com, nginxN.google.com......这样命名的好处大家看出来了吗,这就像一个树形的数据结构,只要后面是google.com我们就知道这台计算机是属于google.com的,不管google有多少台计算机,都可以采用这样的命名规则,有条理的给自己的计算机命名。

我们知道联网的计算机都是有IP地址的,(为什么要使用IP地址呢,这个问题的处理方案也同样洋溢着人类的智慧,这里暂且不谈。)这个计算机的命名方式也很好,那我如何方便的通过网络访问网络上另一个计算机上的资源呢,早期的时候,大家使用文本文件一行一行的来记录IP地址和域名的对应关系,这个方式直至今日也是可以用的,这个文件就是我们系统中的hosts文件,但这个方式的弊端非常明显,如果只是一个范围很小的网络,这样的方式完全没有问题,但如果是互联网,这种方式的问题就非常多了,这个时候一个新的解决方案,DNS就诞生了,互联网世界也因此而改变。DNS方案是一种分布式的数据存储方案,每个节点保存着和上个节点的关系,每个节点拥有所属节点下域名的完整管理权限。从此IP和计算机名的解析服务就统一了。DNS服务延续至今。

在Linux系统中,提供DNS服务的软件包是bind,配置好bind,并开启服务,就可以提供完整的DNS服务。配置DNS也并不十分复杂,只要理解DNS处理请求的方式和过程,配置起来也很容易,安装bind软件包后,配置/etc/named.conf,写好自己的域名解析数据,就可以提供DNS服务了。只不过DNS服务的选项还是比较多的,zone文件的格式和每列的意义也各有不同,下面就给出一个配置文件,和一个zone的示例文件:/etc/named.conf,详细了解named.conf的各种选项,可以查看man文档。

options {
        listen-on port 53 { 192.168.1.34; };
        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";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { 192.168.1.0/24; };

        recursion yes;
        forward first;
        forwarders { 8.8.8.8; };

        dnssec-enable no;
        dnssec-validation no;

        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";
};

zone "localdb." IN {
        type master;
        file "named.localdb";
        forwarders {};
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

 这里面的zone文件是"named.localdb",该文件的内容:

$TTL 1D
@    IN  SOA  @ fw-data4.localdb ( 0 1H 10M 1D 3H)
        A    192.168.1.34
        PTR     fw-data4.localdb.
        NS   @
fw-data4.localdb  IN  A  192.168.1.34
fang-data1      A       192.168.1.91
fang-data2      A       192.168.1.53
fang-data3      A       192.168.1.52
fw-data4        A       192.168.1.34
data3.fang      CNAME   fang-data3

再给一个反向解析的zone文件示例:

$TTL 1D  
@ IN SOA 1.168.192.in-addr.arpa. root.fw-data4.localdb. (  
        0
        1H
        14400  
        3600000  
        86400  
)  
  
@ IN NS fw-data4.localdb.  
52 IN PTR fang-data3.localdb.
53 IN PTR fang-data2.localdb.
91 IN PTR fang-data1.localdb.

下面详细说明一下zone文件的格式:


注意,zone文件的注释是以分号";"开始的。  

 
$TTL 1D                ; 生存期, 默认单位为秒,另可设定为[W|D|H|M]  
; [zone] IN SOA [主机名] [管理员email] ([五组更新时间参数])  
; @=>zone IN SOA @=>主机名 rname.invalid.=>email  
; @代表根域  
; rname.invalid.解析为rname@invalid,第一个"."为"@"的替代,尾部的"."为根域,表明其为绝对URL。  
@       IN SOA  @ rname.invalid. (  
                                        0       ; serial  
                                        1D      ; refresh  
                                        1H      ; retry  
                                        1W      ; expire  
                                        3H )    ; minimum  
        NS      @          ; 直接输入域名,访问@  
        A       127.0.0.1  ; 直接输入域名,解析到的IPV4的IP  
        AAAA    ::1        ; 直接输入域名,解析到的IPV6的IP 


DNS服务支持主备模式;一个域名也可以对应多条不同的IP地址,默认是轮询方式给出该域名对应的不同IP地址。使用这种方式可以实现比较简陋的负载均衡功能;还可以针对不同的客户端地址返回不同的IP,实现策略访问功能。虽然有些功能是不太常用的,了解一下还是有益的。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!