网络上的所有主机,从只能手机到笔记本电脑个人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: 94
EDNS就是在遵循已有的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: 206
client 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 删除。