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,实现策略访问功能。虽然有些功能是不太常用的,了解一下还是有益的。
来源:CSDN
作者:icquu
链接:https://blog.csdn.net/icquu/article/details/103802225