域名系统(Domain Name System, DNS)是互联网的核心应用层协议之一, 它用于查询域名对应的IP地址.在使用域名访问任何网络资源时都需要先进行域名解析.
www.cnblogs.com
是一个典型的域名, 在进行Http访问之前它会先被DNS转换为一个ip地址.
域名与目录树类似形成一个树状结构, 最右侧为顶级域, 向左域名级别降低.
所有域名都属于根域
. 根域由13组根域名服务器管理, 从A.ROOT-SERVERS.NET
到M.ROOT-SERVERS.NET
.
根域的下一级为顶级域(top level domain, TLD), 如通用顶级域名.com
, .net
, .gov
和地区顶级域名.cn
, .jp
等. 下一级为次级域名, 如cnblogs
, baidu
, google
.
最低级的为主机名, 如www
, mail
等.
根域下顶级域名的分配和使用由非营利性的互联网名称与数字地址分配机构
(Internet Corporation for Assigned Names and Numbers, ICNN)管理.
顶级域下次级域名由各地区的域名管理机构管理, 主机名则由域名拥有者自己管理.
域名解析
域名系统是一个典型的分布式数据库, 每个名称服务器(nameserver)只存储着部分数据. 当其无法解析某个域名时, 就向其它服务器请求解析直到成功解析或超时.
下面简单介绍DNS解析过程:
-
查询本地hosts文件, unix系操作系统一般在
/etc/hosts
-
若hosts文件不存在相关记录, 则检查本地DNS缓存.
-
若本地DNS缓存不存在相关记录则查询首选名称服务器.
若目标域名处在名称服务器的管理之下, 则名称服务器可以给出可靠的解析结果.
若目标域名不属于名称服务器管理但在它的缓存中, 名称服务器可以根据它的缓存给出一个不可靠的解析结果.
若首选名称服务器无法解析域名, 根据名称服务器的配置有两种策略:
-
若本地DNS配置了转发, 则请求转发给上一级DNS解析. 上级DNS将解析结果返回给本地DNS, 由本地DNS返回给客户端.
-
若本地DNS未配置转发, 则自顶向下查询:
- 本地DNS请求根服务器(共13台), 根服务器将顶级域名主名称服务器的IP地址返回给本地DNS.
- 本地DNS则请求顶级域名服务器. 若顶级域名服务器可以解析则将结果返回给本地DNS, 由本地DNS返回给客户端.
- 若顶级域名服务器无法解析则返回下一级主名称服务器地址, 直到某一级DNS成功解析.
DNS记录
DNS是一个分布式的数据库, 名称服务器使用DNS记录(dns record)保存域名和IP之间的关系.
名称服务器使用区域文件(zone file)保存自己的记录, 区域文件中除了DNS记录外还定义了一些环境变量.
-
$ORIGIN
表示本NS管理的域, 如$ORIGIN example.com.
表示本NS管理example.com
域. -
$TTL
表示解析记录在缓存中的默认过期时间.
这是一个区域文件的示例, 可以让我们更好地理解区域文件:
$ORIGIN example.com.
$TTL 1h
example.com. IN SOA ns.example.com. username.example.com. ( 2007120710 1d 2h 4w 1h )
example.com. IN NS ns
example.com. IN NS ns.somewhere.example.
example.com. IN MX 10 mail.example.com.
@ IN MX 20 mail2.example.com.
@ IN MX 50 mail3
example.com. IN A 192.0.2.1
IN AAAA 2001:db8:10::1
ns IN A 192.0.2.2
IN AAAA 2001:db8:10::2
www IN CNAME example.com.
wwwtest IN CNAME www
mail IN A 192.0.2.3
mail2 IN A 192.0.2.4
mail3 IN A 192.0.2.5
DNS记录有以下几种类型:
A记录和AAAA记录
A记录是IPv4主机记录, AAAA为IPv6主机记录, 如下面这一条:
example.com. IN A 192.0.2.1
IN AAAA 2001:db8:10::1
它表示主机example.com
对应的IPv4地址为192.0.2.1
, IPv6地址为2001:db8:10::1
.
第二个字段IN
表示Internet
, 这一字段会出现在很多记录中.
最后加.
表示采用绝对路径, 区域文件也可以用相对路径来配置.
下面两条记录的作用是一样的:
www.example.com. IN A 192.0.2.2
相对路径表示:
www IN A 192.0.2.2
@
为$ORIGIN
记录了IP地址, 下面这条记录配置了example.com
主机的IP地址:
@ IN A 192.0.2.1
SOA记录
授权开始(Start of Authority, SOA)记录是区域文件的第一条记录, 用于记录为本服务器授权的上级名称服务器.
example.com. IN SOA ns.example.com. username.example.com. (
2007120710 ; serial number
1d ; refresh interval
2h ; retry interval
4w ; expiry period
1h ; negative TTL
)
上述记录表示域example.com
的主名称服务器为ns.example.com
.
username.example.com.
表示管理员邮箱为username@example.com
, 注意@
被替换为.
.
后面的字段表示:
serial number
表示本服务器记录的版本号, 每次修改版本号就会加1. 通过比较本服务器版本号和上级服务器版本号已进行同步.refresh interval
表示向SOA服务器请求更新记录的间隔retry interval
表示向SOA服务器请求更新记录失败时的重试周期expiry period
表示SOA服务器若在此时间内不响应, 则不再将其作为SOA服务器negative ttl
表示当查询结果为无此记录
时, 缓存该结果的时间
NS记录
ns记录用于表示某个域的名称服务器:
example.com. IN NS ns
example.com. IN NS ns2.example.com.
上述两条记录表示example.com
域的名称服务器为ns.example.com
, 备用名称服务器为ns2.example.com
.
每个区域文件中至少定义两个名称服务器,以便在一个服务器出现问题时还能正确运行. 如果只有一个名称服务器,大多数 DNS 服务器软件都会认为区域文件无效.
在自顶向下查询过程中, 父域的名称服务器根据自己的ns记录确定子域的名称服务器.
MX记录
MX记录用于表示某个域的邮件服务器:
example.com. IN MX 10 mail.example.com.
上述记录表示mail.example.com
是example.com
域的邮件服务器.
也可以使用@
表示根域, 使用相对路径表示邮件服务器.
@ IN MX 20 mail2.example.com.
@ IN MX 50 mail3
记录中第4个字段的数字表示优先级, 数字越小优先级越高.
CNAME记录
CNAME记录用于记录域名别名:
www IN CNAME example.com.
wwwtest IN CNAME www
上述记录表示www.example.com
是example.com
的一个别名, wwwtest.example.com
又是www.example.com
的一个别名.
DNS工具
配置本地nameserver
在我们可以使用域名访问网络前, 需要先配置本地的名称服务器. 本地名称服务器可以由DHCP协议动态分配, 也可以手动配置.
Unix系列操作系统, 在/etc/resolv.conf
配置文件中设置nameserver:
nameserver 172.18.49.59
为自己的网站配置域名
首先, 自己网站的服务器需要拥有一个公网IP, 使得我们在互联网上可以直接访问该主机.
随后可以在域名提供商处购买自己的域名, 比如finley.cn
. 然后在域名提供商处添加A记录将域名解析到自己主机的公网ip.
查询所有者
whois
指令可以查询域名所有者的信息:
& whois cnblogs.com
Domain Name: cnblogs.com
Registry Domain ID: 866509_DOMAIN_COM-VRSN
Registrar WHOIS Server: whois.35.com
Registrar URL: http://www.35.com
Updated Date: 2016-10-23T22:59:39Z
Creation Date: 2003-11-11T04:00:00Z
Registrar Registration Expiration Date: 2021-11-11T04:00:00Z
Registrar: 35 Technology Co., Ltd.
...
DNS查询
host
命令可以查询某个域名的ip:
$ host cnblogs.com
cnblogs.com has address 42.121.252.58
cnblogs.com mail is handled by 30 aspmx2.googlemail.com.
cnblogs.com mail is handled by 30 aspmx3.googlemail.com.
cnblogs.com mail is handled by 30 aspmx4.googlemail.com.
cnblogs.com mail is handled by 30 aspmx5.googlemail.com.
cnblogs.com mail is handled by 10 aspmx.l.google.com.
cnblogs.com mail is handled by 20 alt1.aspmx.l.google.com.
cnblogs.com mail is handled by 20 alt2.aspmx.l.google.com.
nslookup
可以交互式查询:
$ nslookup
> cnblogs.com
Server: 172.18.49.59
Address: 172.18.49.59#53
Non-authoritative answer:
Name: cnblogs.com
Address: 42.121.252.58
dig
命令可以看到DNS解析过程:
dig cnblogs.cn
; <<>> DiG 9.8.3-P1 <<>> cnblogs.cn
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54154
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 4, ADDITIONAL: 0
;; QUESTION SECTION:
;cnblogs.cn. IN A
;; ANSWER SECTION:
cnblogs.cn. 600 IN CNAME fw1.22.cn.
fw1.22.cn. 973 IN CNAME 22url.lncdn.com.
22url.lncdn.com. 27 IN A 103.13.73.87
22url.lncdn.com. 27 IN A 162.251.94.12
22url.lncdn.com. 27 IN A 162.251.94.101
;; AUTHORITY SECTION:
lncdn.com. 112713 IN NS ns2.360dns.net.
lncdn.com. 112713 IN NS ns1.360dns.org.
lncdn.com. 112713 IN NS ns2.360dns.org.
lncdn.com. 112713 IN NS ns1.360dns.net.
;; Query time: 69 msec
;; SERVER: 172.18.49.59#53(172.18.49.59)
;; WHEN: Tue May 9 17:03:53 2017
;; MSG SIZE rcvd: 218