简介
UDP或TCP所发送的传统的DNS查询和响应是没有加密的。这就很容易被窃听和受到欺骗(包括基于DNS的互联网过滤)。从递归解析器到客户端的响应是最易遭受意外或被恶意更改的,而递归解析器和权威名称服务器之间的通信通常需要包含额外的保护。 目前,基于网络的应用程序必须使用浏览器扩展才能利用那些高级的DNS功能,比如DANE, DNS-SD service discovery,,甚至可以查看IP地址以外的任何东西。依赖DNSSEC的功能扩展必须要自我验证,因为浏览器和操作系统可能不会(能)验证DNSSEC。 |
为了解决这些问题,谷歌的公共DNS提供了一种通过加密的HTTPS进行连接的DNSSEC验证方法,这种方法使用的是一种Web友好的API,它不需要对浏览器或操作系统进行什么配置或安装什么扩展。在HTTPS基础上实现的DNS大大提高了客户和递归解析器之间的隐私和安全,并且DNSSEC还提供了一种端到端的认证DNS查找。 |
API规范
所有的API调用都是HTTP GET请求。参数名称是不区分大小写的。在有重复参数的情况下,将使用第一个值。使用http: URLs进行API调用是被禁止的(403 Forbidden)。 支持的参数name字符串, 需要 唯一需要的参数。它的长度必须在1和 253之间(忽略一个可选的跟踪点,如果存在的话)。所有标签(由点分隔的名称部分)必须是1到63个字节长。API不支持escape字符或非ASCII字符,但它们并没有被明确地拒绝。国际化域名必须使用punycode格式(例如,"xn--qxam"而不是"ελ")。
|
类型 字符串,默认:1 RR 类型可以被从1到65535的数字或者是一组规范的字符串(不敏感的字符,比如A或者aaaa)所代替。你可以使用255来进行‘ANY’的查询,但是你要知道这并不是使用A或者AAAA或者MX记录代替它去发送查询(报文)。主域名服务器不需要返回像这样的查询(报文)所有的记录;一些甚至不做出回应,其他的(像cloudflare.com)仅仅只返回HINFO。 检查禁用 布尔型,默认:false 检查禁用位。使用cd,cd=1,或者cd=true来使DNSSEC验证失效;使用cd=0,cd=false,或者不使用cd参数来使DNSSEC验证进行有效的验证。 |
edns_client_subnet 字符串, 默认值: 空 表示edns0-client-subnet 选项.格式是带子网掩码的IP地址。例如:1.2.3.4/24,2001:700:300::/48. 如果你出于隐私考虑使用基于HTTPS的DNS,而且不想要你的IP地址的任何一部分为了位置精度而发送到授权域名服务器,就让edns_client_subnet=0.0.0.0/0。谷歌公用DNS通常会发送粗略的网络信息(通常将你IPv4地址的最后一部分归零)。 random_padding 字符串, 忽略 这项参数的值被忽略,例如: XmkMw~o_mgP2pf.gpw-Oi5dK. API 客户端关注可能的利用HTTPS的报文大小的旁信道隐私攻击。GET请求可以利用这一点通过填充随机数据来让所有请求变成同样大小。要防止URL的误解析,需要将填充字符限制到未限制的URL字符:大写或小写字母,数字,连字符,句号,下划线和波浪号。 |
JSON格式的DNS响应下面是一个成功的响应 (这里添加的注释在实际的响应中不会出现):
参见EDNS客户子网RFC draft 以了解更多有关“掩码长度”的细节以及它对缓存有何影响。 下面是提供了诊断信息的失败响应:
|
内部引用SPF和TXT记录的域名服务器属性如下:
"Master file" 中对RRs(TXT和SPF)类型格式要求双引号,并且需要避开JSON的双引号字符串。
|
本文标题:在 HTTP 基础上实现 DNS
本文地址:https://www.oschina.net/translate/dns-over-https
参与翻译:昌伟兄, 混元归一, 再饮一瓶, 火星撞地球的魔术师, Tentfabric
英文原文:DNS-over-HTTPS