[Network]DNS,A,CNAME和其他

一直想写一篇关于DNS的文章,无奈琐事缠身,拖拖拉拉。现在借这个机会,梳理一下,同时输出倒逼理解。

  • A Records
  • AAAA Records(quad A)
  • NS Records
  • CNAME Records
  • ANAME Records
  • MX Records
  • SOA Records
  • PTR Records

A Records

最被普遍使用的。Most basic form of a DNS record, 其他record type都是基于A record functionality.

When you set up an A record, you will specify an FQDN (Fully Qualified Domain Name) to be pointed to an IP address.A记录就是把一个域名解析到一个IP地址。

A records also have the ability to be pointed to the root of a domain. For example: if your website is at www.example.com, then the root of your domain would be example.com. The root can also be called a “naked domain” and is usually represented by an @ symbol when you are configuring a record.

AAAA Records(quad A)

很像A records,但指向IPv6地址。

NS Records

域名服务器记录(Name Server),返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。

NS记录此记录指定负责此DNS区域的权威名称服务器。

A记录和NS记录的区别是,A记录直接给出目的IP,NS记录将DNS解析任务交给特定的服务器,NS记录中记录的IP即为该特定服务器的IP地址。

NS记录优先于A记录。即,如果一个主机地址同时存在NS记录和A记录,则A记录不生效。这里的NS记录只对子域名生效。

CNAME Records

CNAME记录就是把域名解析到另外一个域名。Point a hostname to another hostname or FQDN. 可以允许将多个名字映射到同一台计算机。规范名称记录(Canonical Name),返回另一个域名,即当前查询的域名是另一个域名的跳转。

ANAME Records

域名注册商针对Paas应用的一条特别的记录,相当顶级域名(root/base/apex domain, or top level domain)的CNAME,是私有实现。

We needed a record that could point a hostname to another hostname or FQDN but could also represent to root record. Essentially a CNAME record for the root of a domain. RFC requirements wouldn’t allow this, so instead we developed our very own ANAME records.

These records allow you to point the root of your domain to a hostname or FQDN. This functionality has also allowed ANAME records to work seamlessly with CDNs (Content Delivery Network) because they allow for multiple dynamically updated IP addresses to be authoritative for a domain in many different locations.

创建PaaS(Platform-as-a-Service: 平台即服务)应用的时候,我们经常会使用自定义域名。这时候我们一般会用CNAME把自己的域名指向PaaS提供的一个域名。而这个域名一般是会有智能DNS解析,会把离用户最近的CDN(Content Delivery Network 内容分发网络)服务器IP返回给用户,提高访问速度。这样无论用户在世界哪个角度,都能获得比较理想的访问速度。例如把应用放在Amazon上,然后把自己注册的域名www.xxx.com指向Amazon提供的域名,然后用户访问www.xxx.com域名,实际服务由Amazon提供。这样很好很强大,对吧?那如果我们想把xxx.com也指向Amazon的应用呢?加一条xxx.com的CNAME记录?这是不可行的,因为RFC1912有如下规定:

2.4 CNAME records

   A CNAME record is not allowed to coexist with any other data.  In
   other words, if suzy.podunk.xx is an alias for sue.podunk.xx, you
   can't also have an MX record for suzy.podunk.edu, or an A record, or
   even a TXT record.  Especially do not try to combine CNAMEs and NS
   records like this!:


           podunk.xx.      IN      NS      ns1
                           IN      NS      ns2
                           IN      CNAME   mary
           mary            IN      A       1.2.3.4

也就是说有了CNAME记录之后,不能再有其他记录,而apex domain如上是需要有NS记录的,这样的话就不能用CNAME记录。这种情况下就诞生了ALIAS和ANAME这样的记录。由于现在没有统一的标准,所以不同的域名注册商用了不同的名字,是私有实现。当然,如果域名注册商不支持这样的记录,我们可以只用www.xxx.com这样的次级域名,也可以强制xxx.com重定向到www.xxx.com,但ALIAS和ANAME记录感觉要方便一些。现在,对于ALIAS和ANAME这样的记录的使用实际上也有些争议,大家可以了解一下。

MX Records

Mail eXchange Records

SOA Records

SOA记录: SOA叫做起始授权机构记录,NS用于标识多台域名解析服务器,SOA记录用于在众多NS记录中那一台是主服务器

PTR Records

PTR记录: PTR记录是A记录的逆向记录,又称做IP反查记录或指针记录,负责将IP反向解析为域名

一些知识点

  1. TTL值
    TTL-生存时间(Time To Live),表示解析记录在DNS服务器中的缓存时间,TTL的时间长度单位是秒,一般为3600秒。比如:在访问www.itbilu.com时,如果在DNS服务器的缓存中没有该记录,就会向某个NS服务器发出请求,获得该记录后,该记录会在DNS服务器上保存TTL的时间长度,在TTL有效期内访问www.itbilu.com,DNS服务器会直接缓存中返回刚才的记录。

  2. 一般来说,为了服务的安全可靠,至少应该有两条NS记录,而A记录和MX记录也可以有多条,这样就提供了服务的冗余性,防止出现单点失败。

  3. CNAME记录主要用于域名的内部跳转,为服务器配置提供灵活性,用户感知不到。

一些工具

  1. dig可以显示整个DNS查询过程
    eg. dig math.stackexchange.com


2. host命令可以看作dig命令的简化版本,返回当前请求域名的各种记录


4. nslookup命令用于互动式地查询域名记录


6. whois命令用来查看域名的注册情况。

References:
http://www.ruanyifeng.com/blog/2016/06/dns.html
https://itbilu.com/other/relate/EyxzdVl3.html
http://www.yanglp.com/posts/2014/04/16/dnsde-aliashe-anameji-lu.html
https://help.ns1.com/hc/en-us/articles/360017511293-What-is-the-difference-between-CNAME-and-ALIAS-records-