首页 » 网络 » DNS - 域名系统

DNS

DNS(Domain Name System,域名系统)是一个分布式数据库,提供互联网上主机名和IP地址之间的转换,以及电子邮件的选路信息。对应用程序而言,通过gethostbyname和gethostbyaddr来访问DNS地址解析器(resolver);而解析器则通过名字服务器来完成这种转换。

DNS拥有一个层次结构的名字空间,与Unix的文件系统类似,只是Unix文件系统写法是从根到节点,而DNS则正好相反,从节点到根。DNS的层次结构如下:

+ (未命名树根)
    + 顶级域:arpa 
        + in-addr
        + ...
    + 顶级域:普通域 
        + com
        + net
        + org
        + ...
    + 顶级域:国家域
        + us
        + cn
        + ...

arpa是一个用作地址到名字转换的特殊域。普通域有时也称组织域。国家域则基于ISO3166中定义的国家代码,都为2字符长的域。

以"."结尾的域名被称作绝对域名完全合格的域名(FQDN,Full Qualified Domain Name)。由NIC分配顶级域和委派其他地域的授权机构。一个独立管理的DNS子树则被称为一个区域(zone),一旦一个区域的授权机构被委派后,它就必须向该区域提供多个名字服务器。每个名字服务器都必须知道如何同根的名字服务器联系。可以从这里ftp://ftp.rs.internic.net/domain/named.root获取根服务器信息。

我们可以通过/etc/resolv.conf查看离我们最近的名字服务器的信息:

$ cat /etc/resolv.conf 
; generated by /sbin/dhclient-script
search members.linode.com com
nameserver 106.187.34.20
nameserver 106.187.35.20
nameserver 106.187.36.20

通过域名查找IP很好理解,但相反地通过IP查找域名则比较费解,这就是所谓的指针查询,DNS中的in-addr.apra分支就是用来处理地址-名字的转换。简单测试:

# 查询百度的MX记录
$ dig MX baidu.com +short
20 mx50.baidu.com.
10 mx.mailcdn.baidu.com.
20 mx1.baidu.com.
20 jpmx.baidu.com.

# 获取百度邮件服务器IP地址(A记录)
$ dig A mx50.baidu.com +short
220.181.50.208

# 通过IP查询域名
$ dig -x 220.181.50.208 +short
mx50.baidu.com.
$ host 220.181.50.208
208.50.181.220.in-addr.arpa domain name pointer mx50.baidu.com.

通过域名查找IP通常成为正向DNS解析(forward DNS resolution),而通过IP地址查找域名,则称为逆向/反向DNS解析(rDNS, reverse DNS lookup/resolution)。rDNS数据库位于arpa顶级域,IPv4用in-addr.arpa,IPv6用ip6.arpa。而rDNS的解析将用到PTR记录。

资源记录

资源记录(RR,Resource Record)格式:

[name] [ttl] [class] type data
字段说明
name通常即一个域名。
ttl超时时间。
class网络类型,通常是IN,表示Internet。
type记录类型。
data数据。data的内容取决于type的值。

常见的type:

DNS记录类型说明
A(Address Record)域名到地址的转换。
PTR(Pointer Record)地址到域名的转换。
MX(Mail Exchange Record)转换邮件中的域名。
CNAME(Canonical Name Record) 权威域名记录,视为域名赋予别名的方式。
NS(Name Server Record)域名服务器记录,标识一个区(Zone)的权威服务器。
SOA(Start of Authority Record)标识一个DNS Zone开始的记录。
TXT记录文本记录。

MX记录

MX(Mail Exchange)记录用在通过用户电子邮箱查找邮箱服务器。例如发邮件给"user@berlinix.com"时,邮件客户端将对"berlinix.com"进行DNS/MX解析。如果MX存在,则根据MX记录的优先级,将邮件发送到与该MX相对应的邮件服务器上。如果给"user@berlinix.com"发邮件,为什么不通过A记录来获取"berlinix.com"的IP地址呢?缘故是邮件服务器未必与域名所在的主站(berlinix.com)在同一个IP上 ;-)

MX记录指向的主机名,不必非得是挂在主域名下的子域名,例如berlinix.com的MX记录不必非得是如mail.berlinix.com.或mailhost.berlinix.com.,它可以是如mxbiz1.qq.com.(腾讯企业邮箱)或qiye163mx01.mxmail.netease.com.(网易企业邮箱)等。

MX记录的优先级。MX记录有一个代表优先级的值,取值范围在[0,1000]。数值越小,优先级越高。

查询MX记录:

58同城使用了QQ企业邮箱:

$ dig mx 58.com +short
10 mxbiz2.qq.com.
5 mxbiz1.qq.com.

知乎使用了Google邮箱:

$ dig mx zhihu.com +short
5 ALT1.ASPMX.L.GOOGLE.com.
5 ALT2.ASPMX.L.GOOGLE.com.
10 ASPMX2.GOOGLEMAIL.com.
10 ASPMX3.GOOGLEMAIL.com.
10 ASPMX4.GOOGLEMAIL.com.
10 ASPMX5.GOOGLEMAIL.com.
1 ASPMX.L.GOOGLE.com.

以上可见Google邮箱服务器有很多,通过Postfix的输出查看优先级的作用:

Jul 30 15:19:01 vps950 postfix/smtp[6741]: connect to ASPMX.L.GOOGLE.com[2607:f8b0:400e:c01::1a]:25: Network is unreachable
Jul 30 15:19:22 vps950 postfix/smtp[6741]: connect to ASPMX.L.GOOGLE.com[74.125.129.26]:25: Connection timed out
Jul 30 15:19:22 vps950 postfix/smtp[6741]: connect to ALT1.ASPMX.L.GOOGLE.com[2607:f8b0:4002:c02::1a]:25: Network is unreachable
Jul 30 15:19:22 vps950 postfix/smtp[6741]: connect to ALT2.ASPMX.L.GOOGLE.com[2607:f8b0:400d:c01::1a]:25: Network is unreachable
Jul 30 15:19:27 vps950 postfix/smtp[6741]: 787D0100BA4: to=, relay=ALT2.ASPMX.L.GOOGLE.com[173.194.74.26]:25, delay=33, delays=6.3/0.03/25/1.7, dsn=2.0.0, status=sent (250 2.0.0 OK 1375169027 j8si17642194qec.94 - gsmtp)
Jul 30 15:19:27 vps950 postfix/qmgr[5668]: 787D0100BA4: removed

可见选取的顺序为:

  1. 尝试连接 1 ASPMX.L.GOOGLE.com的IPv6,网络不可达(Network is unreachable)。
  2. 尝试连接 1 ASPMX.L.GOOGLE.com的IPv4,连接超时(Connection timed out)。
  3. 尝试连接 5 ALT1.L.ASPMX.L.GOOGLE.com的IPv6,网络不可达。
  4. 尝试连接 5 ALT2.L.ASPMX.L.GOOGLE.com的IPv6,网络不可达。
  5. 尝试连接 5 ALT2.L.ASPMX.L.GOOGLE.com的IPv4,发送成功。

163企业邮箱的配置说明,来看如何设置MX记录。

1. 设置MX记录:

10 qiye163mx01.mxmail.netease.com.
50 qiye163mx02.mxmail.netease.com.

2. 修改CNAME记录

mail.berlinix.com CNAME qiye.163.com.

3. (可选)设置TXT记录:

v=spf1 include:spf.163.com ~all

4. (可选)设置更多的CNAME记录:

pop.berlinix.com CNAME pop.qiye.163.com
smtp.berlinix.com CNAME smtp.qiye.163.com

CNAME记录

查询Google邮箱的CNAME记录:

$ dig CNAME mail.google.com

;; QUESTION SECTION:
;mail.google.com.               IN      CNAME

;; ANSWER SECTION:
mail.google.com.        591116  IN      CNAME   googlemail.l.google.com.

这条记录读作:mail.google.com.是权威记录googlemail.1.google.com的一个别名。

rDNS

IPv4逆向解析是通过in-addr.arpa域完成的。例如逆向查询74.125.31.19,将返回:19.31.125.74.in-addr.arpa.

TXT记录

SPF(Sender Policy Framework)

SPF(发件人策略框架)是一种TXT记录,可确定允许哪些邮件服务器可以代表你来发送邮件。SPF记录的用途是阻止垃圾邮件发件人发送假冒你的域中的“发件人”的电子邮件(如有人冒充user@berlinix.com来发邮件)。而收件人可参考SPF记录来确定来自user@berlinix.com的邮件是否来自授权邮件服务器。

对自建邮箱服务器(用sendmail/Postfix等)而言,配置SPF可在一定程度上解决自己发送的邮件被当作垃圾邮件的问题。

解析SPF

$ dig TXT 163.com +short 
"v=spf1 include:spf.163.com -all"

v=spf1 版本号说明。这里之SPF的第一个版本。

include:spf.163.com 表示读取这个域名上的SPF,然后把它们加入信任列表。以下我们按图索骥,看下163邮箱的可信任列表:

$ dig TXT 163.com +short 
"v=spf1 include:spf.163.com -all"

$ dig TXT spf.163.com +short
"v=spf1 include:a.spf.163.com include:b.spf.163.com -all"

$ dig TXT a.spf.163.com +short
"v=spf1 ip4:220.181.12.0/22 ip4:220.181.31.0/24 ip4:123.125.50.0/24 ip4:220.181.72.0/24 ip4:123.58.178.0/24 ip4:123.58.177.0/24 ip4:42.99.128.0/28 ip4:113.108.225.0/24 ip4:218.107.63.0/24 -all"

-all 如果遇到不在信任列表里的IP,则强制拒绝。

拒绝方式说明
-all强制拒绝(hard fail)。
~all柔性拒绝(soft fail)。温柔地拒绝。
?all表示由收件方决定如何处理。

DNS工具

dig

dig(Domain Information Groper)是最常用的DNS工具之一。

dig默认查找A记录,也可以指定查找记录类型(type):

$ dig baidu.com
;; QUESTION SECTION:
;baidu.com.                     IN      A

$ dig A baidu.com
;; QUESTION SECTION:
;baidu.com.                     IN      A

$ dig MX baidu.com
$ dig NS baidu.com

@server - 指定DNS服务器查询:

$ dig facebook.com +short         
203.98.7.65
$ dig @8.8.8.8 facebook.com +short
93.46.8.89
$ dig @4.4.4.4 facebook.com +short
243.185.187.39

下面这个查询,由于缓存获取了旧地址,再尝试用@8.8.8.8获取:

$ dig mx berlinix.com +short
50 mail-fwd.mx.g19.rapidsite.net.
$ dig @8.8.8.8 mx berlinix.com +short   
50 mail.berlinix.com.

参考

Openspf上的SPF语法说明文档。

分享

0