1. DNS简介
网域名称(英语:Domain Name,简称:Domain),简称域名、网域,是由一串用点分隔的字符组成的互联网上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位。域名可以说是一个IP地址的代称,目的是为了便于记忆后者。例如,
wikipedia.org
是一个域名。人们可以直接访问wikipedia.org
来代替IP地址,然后域名系统(DNS)就会将它转化成便于机器识别的IP地址。这样,人们只需要记忆wikipedia.org
这一串带有特殊含义的字符,而不需要记忆没有含义的数字。
域名的核心是域名系统(英语:Domain Name System,缩写:DNS),域名系统中的任何名称都是域名。在域名系统的层次结构中,各种域名都隶属于域名系统根域的下级。域名的第一级是顶级域,它包括通用顶级域,例如.com、.net和.org;以及国家和地区顶级域,例如.us、.cn和.tk。顶级域名下一层是二级域名,一级一级地往下。现在,还有一些新兴的中文域名,例如.在线等。这些域名向人们提供注册服务,人们可以用它创建公开的互联网资源或运行网站。顶级域名的管理服务由对应的域名注册管理机构(域名注册局)负责,注册服务通常由域名注册商负责。
域名系统(英语:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。
参考文档:
2. DNS记录类型
域名与IP之间的对应关系,称为”记录”(record)。根据使用场景,”记录”可以分成不同的类型(type)。
常见的DNS记录类型如下:
- A:IPv4地址记录(IPv4 Address),返回域名指向的IP地址。
- NS:域名服务器记录(Name Server),返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。
- MX:邮件记录(Mail eXchange),返回接收电子邮件的服务器地址。
- CNAME:规范名称记录(Canonical Name),返回另一个域名,即当前查询的域名是另一个域名的跳转,详见下文。
- PTR:逆向查询记录(Pointer Record),只用于从IP地址查询域名,详见下文。
- AAAA:IPv6地址记录(IPv6 Address),返回域名指向的IPv6地址。
一般来说,为了服务的安全可靠,至少应该有两条NS记录,而A记录和MX记录也可以有多条,这样就提供了服务的冗余性,防止出现单点失败。
3. DNS解析流程
DNS解析流程,简单来说就是分级查询。
- 用户请求本地域名服务器(DNS),如果有结果就直接返回;如果没有结果,就请求根域名服务器
- 请求根域名服务器,拿到顶级域名(一级域名)服务器的NS记录和A记录
- 请求顶级域名服务器,拿到二级域名服务器的NS记录和A记录
- 请求二级域名服务器,拿到三级或四级域名的NS记录和A记录
查看分级查询过程:
1 | dig +trace www.baidu.com |
本地DNS服务器,还可以配置上游DNS服务器。如果本地DNS服务器无法解析,那么会将该查询请求转发到指定的上游DNS服务器。上游DNS服务器将尝试解析该查询,并返回答案给自建DNS服务器。自建DNS服务器接收到上游DNS服务器的响应后,将答案返回给发起原始查询的客户端。
这样就可以让上游DNS服务器进行递归查询,从而减少本地自建DNS服务器的递归查询数量,提高性能。
注意:本地DNS是否请求了上游DNS,通过dig或者nslookup命令是看不出来的,一般需要通过本地DNS的日志来验证。
4. DNS配置
4.1. 配置文件
主机上,我们通过配置文件 /etc/resolv.conf
指定DNS服务器。
例如:
1 | nameserver 10.96.0.10 |
4.2. search和ndots
举个例子:
1 | nameserver 10.96.0.10 |
当域名的点的数量小于ndots的数量时会依次加上后缀(search)去DNS服务器查找,如果都找不到再直接去DNS服务器查找域名。
4.3. nsswitch.conf
nsswitch全称为: network service switch,是一个通用框架,是各种类型存储交互的公共实现,实现名称解析服务。
nsswitch.conf 决定系统获取解析的顺序。
例如:
1 | hosts: files dns |
以上配置,在域名解析时,就会先读取本地 /etc/hosts
,再请求dns服务器。
4.4. ubuntu20
对于ubuntu20,dns的配置方法是比较特殊的。参考文档Ubuntu20.04 系统中设置dns并生效
1、修改dns的配置
/etc/systemd/resolved.conf 中修改
1 | DNS=180.76.76.76 114.114.114.114 |
2、重启systemd-resolved
1 | systemctl enable systemd-resolved |
3、使用新的resolv.conf
1 | cat /run/systemd/resolve/resolv.conf |
5. DNS解析查询命令
5.1. 查询顺序说明
- nslookup/dig会直接查询DNS服务器
- ping、host、curl等命令实际上会查看本地hosts,再根据resolv.conf中的配置查询域名。
5.2. dig
查看域名解析记录
1 | dig www.voidking.com |
指定DNS查看域名解析记录
1 | dig @180.76.76.76 www.voidking.com |
指定DNS查看域名指定类型的解析记录
1 | dig @180.76.76.76 www.voidking.com A |
查看每一级域名的NS记录
1 | dig ns com |
5.3. nslookup
查看域名解析记录
1 | nslookup www.voidking.com |
指定DNS查看域名解析记录
1 | nslookup www.voidking.com 180.76.76.76 |
指定DNS查看域名指定类型的解析记录
1 | nslookup -type=A www.voidking.com 180.76.76.76 |
5.4. host
查看域名解析记录
1 | host www.voidking.com |
6. 公共DNS服务器
6.1. 百度DNS
1 | 180.76.76.76 |
6.2. GoogleDNS
1 | 8.8.8.8 |
6.3. 114DNS
1 | 114.114.114.114 |
6.4. 阿里DNS
1 | 223.5.5.5 |
6.5. OneDNS
1 | 112.124.47.27 |
6.6. DNS派
1 | 101.226.4.6 |
6.7. OpenDNS
1 | 208.67.222.222 |