DNS服务
DNS介绍
DNS(Domain Name System)域名解析服务,用于提供主机名到IP地址映射服务。作为将域名和IP地址相互映射的一个分布式数据库,DNS协议运行在UDP上,默认使用53号端口。
DNS主要服务
- 实现主机名到IP地址转换的目录服务
- 主机别名:通过DNS服务获取主机别名对应的复杂规范主机名
- 邮件服务器别名:类似于主机别名
- 负载分配:对于一个拥有很大流量的站点,其可能部署在多个服务器上,它们所有的IP构成一个IP集合,这个IP集合与同一个规范主机名相联系。DNS提供了相应的映射服务,使得不同的客户端请求可以轮流访问各个服务器。
域名结构
域名的命名采用层次树状结构的命名方法,任何一个连接在因特网上的主机或路由器,都有一个唯一的层次结构的名字,既域名(domain name)。“域”(domain)是名字空间中一个可被管理的划分。
域名只是逻辑概念,并不代表计算机所在的物理地点。域名可分为三大类:
- 国家顶级域名:采用ISO3166的规定。如:cn代表中国,uk代表美国,等等。国家域名又常记为ccTLD(country code top-level domains,cc代表国家代码country code)
- 通用顶级域名:最常见的通用顶级域名有七个,即:com(公司企业),net(网络服务机构),org(非营利组织),int(国际组织),gov(美国的政府部门),mil(美国的军事部门)。
- 基础结构域名:这种顶级域名只有一个,即arpa,用于反向域名解析,因此称为反向域名。
DNS服务器结构
在了解DNS的查询流程之前,我们需要知道为什么我们现在的DNS服务器并不是集中式DNS服务,而是采用了一个树状的层次结构————分布式层次式数据库。
集中式DNS的缺点
- 单点故障:如果DNS服务器崩溃,整个网络将会陷入瘫痪
- 通信容量:单个的DNS服务器需要处理大数量级的请求
- 远距离的集中式数据库:链路会导致较长的时延
- 维护成本高:单个DNS服务器需要为所有主机保留记录,数据库庞大,维护成本高
分布式层次式数据库
分布式层次式数据库中,分布式指的是其分布在全世界范围内,层次式指的是其按照树状层次方式组织。其按照层次可将DNS服务器划分为三种类型:根DNS服务器、顶级域DNS服务器和权威DNS服务器。
🚀 在以上三种类型之外,这里还要提到一个本地域名解析服务器。该服务器不严格属于层级体系。每个ISP(互联网服务提供商)有一个本地域名服务器(也叫默认域名解析服务器)。
🚀 当主机进行DNS查询时,查询被发送到本地域名服务器,其作为代理(proxy),将查询转发给域名解析服务器系统,具体查询流程细节在下一小节。
DNS查询流程
这里以本地主机想要访问www.bilibili.com的IP地址为例
- 在浏览器中输入www.bilibili.com域名,浏览器缓存、操作系统会首先检查自己本地的hosts文件是否有这个域名的映射关系,如果有就先调用这个缓存里的IP地址,完成域名解析。
ipconfig/displaydns //查windows中的DNS缓存
ipconfig/flushdns //清空缓存 - 如果hosts缓存中没有这个域名的映射,那么就查找本地DNS解析器缓存,是否有这个网址映射关系,如果有直接返回,完成域名解析。
- 如果hosts以及本地DNS解析器都没有相应的缓存,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫他本地DNS服务器,此服务器收到查询时
- 如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
- 如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
- 如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,
- 如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理bilibili.com的DNS服务器地址给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找bilibili.com域服务器,重复上面的动作,进行查询,直至找到www.bilibili.com主机。
- 如果用的是转发模式,本地DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把请求转至上上级,以此循环。找到最后把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。
🚀 从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间使用的交互查询就是迭代查询。hosts文件在C:\WINDOWS\system32\drivers\etc目录中
🚀 114.114.114.114是国内移动、电信和联通通用的DNS,手机和电脑端都可以使用,干净无广告,解析成功率相对来说更高,国内用户使用的比较多,而且速度相对快、稳定,是国内用户上网常用的DNS。8.8.8.8是GOOGLE公司提供的DNS,该地址是全球通用的,相对来说,更适合国外以及访问国外网站的用户使用。
DNS解析方式
正向解析:将FQDN----->IP
反向解析:将IP----->FQDN
DNS服务的配置文件
提供DNS服务的软件叫bind,服务名为named
[root@localhost ~]# yum install bind -y [root@localhost ~]# rpm -ql bind /etc/named.conf # bind主配置文件 /etc/named.rfc1912.zones # 定义zone的文件 /etc/rndc.conf # rndc配置文件 /usr/sbin/named-checkconf # 检测/etc/named.conf文件语法 /usr/sbin/named-checkzone # 检测zone和对应zone文件的语法 /usr/sbin/rndc # 远程dns管理工具 /usr/sbin/rndc-confgen # 生成rndc密钥 ***\*/var/named/named.ca #\**** ***\*根解析库\**** /var/named/named.localhost # 本地主机解析库 /var/named/slaves # 从ns服务器文件夹
/named.conf主配置文件
options { listen-on port 53 { 127.0.0.1; }; //53号端口、监听IP listen-on-v6 port 53 { ::1; }; //ipv6 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"; //分配统计目录 secroots-file "/var/named/data/named.secroots"; recursing-file "/var/named/data/named.recursing"; //递归文件 allow-query { localhost; }; //只允许本地主机进行查询 recursion yes; //允许递归查询 dnssec-enable yes; dnssec-validation yes; managed-keys-directory "/var/named/dynamic"; //密钥存储位置 pid-file "/run/named/named.pid"; //进程PID文件 session-keyfile "/run/named/session.key"; //会话密钥 include "/etc/crypto-policies/back-ends/bind.config"; }; logging { //指定日志记录分类和他们的目标位置 channel default_debug { file "data/named.run"; severity dynamic; }; }; #IN:internet #zone "区域" IN{ # type:hint、master、slave、file # hint:提示,一般用作根域的配置 # master:当前区域类型是master---主 # slave:当前区域类型是slave---从 # file:指定这个域的数据解析文件位置 zone "." IN { type hint; file "named.ca"; }; #包含:应如下面两个文件 #/named.rfc1912.zones :配置的默认的一些域 # include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";
区域文件配置
正向解析
zone "example.com" IN { type master; file example.zone; } $TTL 1D #TTL: DNS记录的缓存时间。是其他域名服务器将数据存放在缓存中的时间, 1D: 代表一天。 #如果一个域名和来源相同的话,那么g名称就可以被表示为”@“ @ IN SOA root.example.com. test.163.com ( #SOA记录后面的root.example.com.代表域的权威服务器,test.163.com是管理员邮箱@在数据文件中代表特殊含义,使用.来代表@符号 0 ; serial 1D ; refresh 1H ; retry #SOA可以跨多行,使用括号 1W ; expire 3H ) ; minimum #可以添加多条NS记录,但每个NS记录 #serial: 序号,代表数据库文件的新旧,需要越大代表越新。如果你修改了数据库文件,需要将这个数据放大 #refresh: 更新频率,定义slave多久向Master请求更新数据 #retry: 失败重新尝试,如果slave无法对Master实现连接,多长时间内,slave会尝试重新连接到Master。 #expire: 失效时间,如果一直尝试失败,持续连接到这个设置值时限,那么slave将不在继续尝试连接,并且尝试删除这份下载的zone file信息 #Minimum: 缓存时间,如果这个数据库zone file中,每笔RR记录都没有写到TTL缓存时间的话,那么就以这个SOA的设置值为主 #TTL的意思是当这笔记录被其他DNS服务器查询到后,这个记录会被在对方的DNS服务器的缓存中,保持多长时间。 IN NS root.example.com. #nameserver;NS记录代表域名服务器记录,如果有多个域名服务器, 可以添加多条NS记录,每个NS记录在下都需要有对应的A记录。 IN MX 10 mail.example.com. #使用MX记录指定邮件服务器时,我们给mail.example.com服务器设置优先级为10 A 127.0.0.1 #A记录为正向解析记录,格式为在域名后面输入响应的IP地址, IN代表Internet, A代表正向解析记录。 AAAA ::1 root.example.com. IN A 172.16.0.254 www.example.com. IN A 172.16.0.200 IN A 172.16.0.200 ftp.example.com. IN A 172.16.0.100 mail IN A 172.16.0.25 web IN CNAME www #CNAME记录为别名,可以使用web.example.com来代表www.example.com
正向解析文件资源记录(Resource Record,RR)
domain | IN | RR type | RR data |
主机名. | IN | A | IPv4的IP地址 |
主机名. | IN | AAAA | IPv6的IP地址 |
域名. | IN | NS | 管理这个域名的服务器主机名字,即由哪一台主机去解析当前所定义的域主机 |
域名. | IN | SOA起始授权记录 | 管理这个域名的七个重要参数 |
域名. | IN | MX | 顺序数字,接收邮件的服务器主机名字 |
主机别名. | IN | CNAME | 实际代表这个主机别名的主机名字 |
反向解析
主配置文件
[root@localhost ~]# vim /etc/named.conf zone "133.168.192.in-addr.arpa" IN { type master; file "133.168.192.zone"; };
区域配置文件
[root@localhost ~]# vim /var/named/133.168.192.zone $TTL 1D @ IN SOA dns.openlab.com. test.163.com ( 333333323 1D 1H 1W 3H ) IN NS dns.openlab.com. IN NS dns2.openlab.com. dns.openlab.com. IN A 192.168.133.150 dns2.openlab.com. IN A 192.168.133.143 150 IN PTR dns.openlab.com. 151 IN PTR dhcp.openlab.com