
网络上的所有主机,从只能手机到笔记本电脑个人PC到为大量零售网站提供内容服务的服务器,都是通过IP的形式定位找到彼此并互相通信。然而IP地址对于人类来说比较不易于记忆且复杂,所以当我们打开浏览器浏览网站时,我们不再需要通过这些冗长复杂的IP进行访问,而是通过像 example.com 这样的域名就可以连接到正确的主机位置。
使用DNS进行访问控制有以下好处:
当然,任何事物都会有他的两面性,DNS的主要问题可能有:

一个Message的基本组成:
    +---------------------+
    |        Header       |
    +---------------------+
    |       Question      | the question for the name server
    +---------------------+
    |        Answer       | RRs answering the question
    +---------------------+
    |      Authority      | RRs pointing toward an authority
    +---------------------+
    |      Additional     | RRs holding additional information
    +---------------------+                                    1  1  1  1  1  1
      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                      ID                       |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |QR|   Opcode  |AA|TC|RD|RA|   Z    |   RCODE   |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                    QDCOUNT                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                    ANCOUNT                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                    NSCOUNT                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                    ARCOUNT                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+                                    1  1  1  1  1  1
      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                                               |
    /                     QNAME                     /
    /                                               /
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                     QTYPE                     |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                     QCLASS                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+| 6 | w | w | w | 5 | b | a | i | d | u | 3 | c | o | m | 0 | 
|---|
                                    1  1  1  1  1  1
      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                                               |
    /                                               /
    /                      NAME                     /
    |                                               |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                      TYPE                     |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                     CLASS                     |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                      TTL                      |
    |                                               |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                   RDLENGTH                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
    /                     RDATA                     /
    /                                               /
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+请求包

结果回包

资源记录是用于答复DNS客户端请求的DNS数据库记录,每一个DNS服务器包含了它所管理的DNS命名空间的所有资源记录。资源记录包含和特定主机有关的信息,如IP地址、提供服务的类型等等。常见的资源记录类型有:SOA(起始授权结构)、A(主机)、AAAA(IPV6主机)、NS(名称服务器)、CNAME(别名)和MX(邮件交换器)。
我们可以通过 dig 命令快速获取域名的解析情况。
 $ dig 689259.p23.tc.cdntip.com
; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.2 <<>> 689259.p23.tc.cdntip.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63346
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;689259.p23.tc.cdntip.com.	IN	A    # 要查询的记录类型
;; ANSWER SECTION:
689259.p23.tc.cdntip.com. 180	IN	A	58.251.150.72    # 域名的A记录
689259.p23.tc.cdntip.com. 180	IN	A	58.251.150.80    # 域名的A记录
;; Query time: 63 msec
;; SERVER: 10.112.65.55#53(10.112.65.55)
;; WHEN: Mon Jan 20 19:42:36 CST 2020
;; MSG SIZE  rcvd: 85
 
 $ dig jwlchina.cn CNAME
; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.2 <<>> jwlchina.cn CNAME
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41582
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;jwlchina.cn.			IN	CNAME    # 要查询的记录类型
;; ANSWER SECTION:
jwlchina.cn.		555	IN	CNAME	jwlchina.cn.cdn.dnsv1.com.    # 别名域名
;; Query time: 11 msec
;; SERVER: 10.112.65.55#53(10.112.65.55)
;; WHEN: Mon Jan 20 20:06:22 CST 2020
;; MSG SIZE  rcvd: 79$ dig jwlchina.cn MX
; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.2 <<>> jwlchina.cn MX
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34364
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;jwlchina.cn.			IN	MX    # 要查询的记录类型
;; ANSWER SECTION:
jwlchina.cn.		600	IN	MX	7 mxdomain.qq.com.    # 委托指向的DNS服务器
;; Query time: 88 msec
;; SERVER: 10.112.65.55#53(10.112.65.55)
;; WHEN: Mon Jan 20 20:05:52 CST 2020
;; MSG SIZE  rcvd: 71$ dig jwlchina.cn NS   
; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.2 <<>> jwlchina.cn NS
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53303
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;jwlchina.cn.			IN	NS    # 要查询的记录类型
;; ANSWER SECTION:
jwlchina.cn.		86400	IN	NS	f1g1ns2.dnspod.net.    # 域名解析服务器地址
jwlchina.cn.		86400	IN	NS	f1g1ns1.dnspod.net.    # 域名解析服务器地址
;; Query time: 24 msec
;; SERVER: 10.112.65.55#53(10.112.65.55)
;; WHEN: Mon Jan 20 20:06:45 CST 2020
;; MSG SIZE  rcvd: 94EDNS就是在遵循已有的DNS消息格式的基础上增加一些字段,来支持更多的DNS请求业务。
需要注意的是,像DNS服务器这样一个大型且广泛应用的系统软件,新增加扩展协议的时候一定要考虑到向后兼容性(backward compatibility),即你增加了你这个特性的消息传输给未支持该特性的服务器时,后者依然能正确处理。
RFC2671中指出EDNS被提出来的几个理由:
1)DNS协议头部的第二个16字节中都已经被用的差不多了,需要添加新的返回类型(RCODE)和标记(FLAGS)来支持其他需求;
2)只为标示domain类型的标签分配了两位,现在已经用掉了两位(00标示字符串类型,11表示压缩类型),后面如果有更多的标签类型则无法支持;
3)当初DNS协议中设计的用UDP包传输时包大小限制为512字节,现在很多主机已经具备重组大数据包的能力,所以要有一种机制来允许DNS请求方通知DNS服务器让其返回大包;
以后我们会看到,DNSSEC机制和edns-client-subnet机制等都需要有EDNS的支持。
怎样在DNS消息协议的基础上再增加一些字段呢?为了保持向后兼容性,更改已有的DNS协议格式是不可能的,所以只能在DNS协议的数据部分中做文章。
所以,EDNS中引入了一种新的伪资源记录OPT(Resource Record),之所以叫做伪资源记录是因为它不包含任何DNS数据,OPT RR不能被cache、不能被转发、不能被存储在zone文件中。OPT被放在DNS通信双方(requestor和responsor)DNS消息的Additional data区域中。
OPT pseudo-RR中的内容包含固定部分和可变部分。它的结构如下:
       +------------+--------------+------------------------------+
       | Field Name | Field Type   | Description                  |
       +------------+--------------+------------------------------+
       | NAME       | domain name  | MUST be 0 (root domain)      |
       | TYPE       | u_int16_t    | OPT (41)                     |
       | CLASS      | u_int16_t    | requestor's UDP payload size |
       | TTL        | u_int32_t    | extended RCODE and flags     |
       | RDLEN      | u_int16_t    | length of all RDATA          |
       | RDATA      | octet stream | {attribute,value} pairs      |
       +------------+--------------+------------------------------+
                               OPT RR Format
需要注意的是,每个DNS 消息中只能有一个OPT伪资源记录,当有多中EDNS扩展协议时,各个{attribute, value}对一个紧接一个存储在RDATA中。具体可以看下面这个例子:
对 jwlchina.cn 这个域名进行dig域名,并且访问的客户端IP为2.2.2.2(client subnet),则客户端会发送以下请求包。执行的命令如下:
$ dig jwlchina.cn @119.29.29.29 +client=67.220.91.30
; <<>> DiG 9.9.3 <<>> jwlchina.cn @119.29.29.29 +client=67.220.91.30
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24076
;; flags: qr rd ra; QUERY: 1, ANSWER: 7, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; CLIENT-SUBNET: 67.220.91.30/32/24
;; QUESTION SECTION:
;jwlchina.cn.			IN	A
;; ANSWER SECTION:
jwlchina.cn.		600	IN	CNAME	jwlchina.cn.cdn.dnsv1.com.
jwlchina.cn.cdn.dnsv1.com. 600	IN	CNAME	689259.p23.tc.cdntip.com.
689259.p23.tc.cdntip.com. 180	IN	A	220.194.87.190
689259.p23.tc.cdntip.com. 180	IN	A	58.251.150.72
689259.p23.tc.cdntip.com. 180	IN	A	14.204.144.140
689259.p23.tc.cdntip.com. 180	IN	A	42.56.79.189
689259.p23.tc.cdntip.com. 180	IN	A	113.59.43.98
;; Query time: 13 msec
;; SERVER: 119.29.29.29#53(119.29.29.29)
;; WHEN: Tue Feb 04 21:05:53 CST 2020
;; MSG SIZE  rcvd: 206client subnet 查询是一个非常有用的edns功能,可以查询任意IP子网段对应的DNS记录结果。

anycast是多个主机使用相同ip地址的一种技术,当报文发给该地址时,根据路由协议,选择最近(跳数最少)的主机服务。
因此,当某台主机服务量大,或者被攻击,到该主机的距离变长,使得报文被发送给另外的主机。
所以,在服务器数量足够多的前提下,anycast天然支持负载均衡和抵抗ddos攻击。
简而言之,anycast就是不同服务器用了相同的ip地址,达到就近访问的效果。

DNSPOD Public Dns 地址 119.28.28.28 使用的就是 anycast 技术。
该地址同时支持 edns-client-subnet 技术,精准调度,多地集群容灾,面向所有互联网用户免费使用。
介绍详情:https://www.dnspod.cn/Products/Public.DNS
移动解析(HTTPDNS)基于Http协议向DNS服务器发送域名解析请求,替代了基于DNS协议向运营商Local DNS发起解析请求的传统方式,可以避免Local DNS造成的域名劫持和跨网访问问题,解决移动互联网服务中域名解析异常带来的困扰。
使用 HTTPDNS 有以下优点:
当然,HTTPDNS 本身并不是万能的,他也会潜在一些缺点:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。