DNSCrypt是由Frank Denis及付业成(Yecheng Fu)主导设计的网络协议,用于用户计算机与递归域名服务器之间的域名系统(DNS)通信的身份验证。[1]

DNSCrypt logo

DNSCrypt将未修改的DNS查询与响应以密码学结构打包来检测是否被伪造。它尽管未使用端对端加密,但也足够抵御针对DNS的中间人攻击DNS缓存投毒攻击DNS劫持等,尤其是在局域网中。[2]除此以外还缓解了基于UDP的请求查询至少与回应一样大的放大攻击。DNSCrypt也可以用于访问控制

尽管已有数个客户端及服务器实现,这一协议从未以征求意见稿(RFC)形式提交到互联网工程任务组(IETF)。目前DNSCrypt协议已发展至第二个版本。[3]

协议概略

编辑

DNSCrypt可以使用UDP端口或TCP端口。尽管与HTTPS完全不同,但两种情况下的默认端口号均为443。

DNSCrypt客户端必须明确信任所选提供者的公钥,而不依赖于常规浏览器中使用的证书颁发机构

公钥将用于验证一整套以传统DNS查询接收的证书。这些证书包含用于密钥交换的短期公钥,以及即将使用的密码本标识符。客户端被鼓励为每次查询新建密钥,而服务器被鼓励为每24小时更换短期密钥对。

查询与回应都使用同一算法加密,并使用64字节的倍数填充来防止泄漏数据包大小。当使用UDP端口且回应多于查询产生的数据量时,服务器可以使用标记TC(英语:truncated,截短)比特的短数据包回应。客户端此时应使用TCP端口重试,并增加后续查询的填充量。

该协议的第一、第二版采用X25519算法(Curve25519)进行密钥交换,EdDSA算法进行签名,以及使用XSalsa20-Poly1305XChaCha20-Poly1305算法认证加密。

基于公钥的客户端认证

编辑

DNSCrypt协议也可以用于访问控制与审计,方法是仅接受一组预先定义的公钥。这可在商用DNS服务中辨识客户而不必依赖于其IP地址

部署实现

编辑

服务端

编辑

DNSCrypt-Wrapper是服务端程序,需要搭配BINDunbound英语unbound (DNS server)等DNS系统方可运行。[4]

除了私有部署,DNSCrypt协议已经被数个公共DNS解析服务器接纳,现存最大的成员是OpenNIC网络,它同时提供虚拟专用网(VPN)服务。

OpenDNS(现思科系统的子公司)在2011年12月宣布其公共DNS服务部署DNSCrypt,[5]紧接着奥地利的CloudNS也宣布部署。

2016年3月29日,Yandex宣布在其公共域名解析服务网络浏览器上支持DNSCrypt协议。[6]随后,Infoblox宣布旗下的ActiveTrust Cloud将部署DNSCrypt服务。

2016年10月,AdGuard宣布为其提供阻挡电信运营商追踪广告推送服务的公共DNS服务器部署了DNSCrypt。[7][8]

2017年DNSCrypt v2协议公布,随后相关的开放源代码实现项目相继出现,同时也有更多的公共DNS服务器加入(包括Google Public DNS),所有部署DNSCrypt的DNS服务器清单可在DNSCrypt的GitHubBitbucket等源代码托管站上找到。[9]

客户端

编辑
 
dnscrypt-proxy在Linux上运行

DNSCrypt-Proxy v1/v2、Pcap_DNSProxy、YourFriendlyDNS是跨平台命令行界面的客户端程序,起到将本机或局域网内的DNS请求加密转发至部署了DNSCrypt的服务器之功用。其中DNSCrypt-Proxy的v2版还支持DoHDoT,还可以实现类似dnsmasq的DNS指定转发、黑名单及白名单、hosts特性;Pcap_DNSProxy额外支持DNSSEC[10][11][12][13]

Simple DNSCrypt是一个图形界面、基建于DNSCrypt-Proxy的前端,运行于Windows操作系统。[14]也有类似的实现项目,如macOS的dnscrypt-osx-client等。[15]

Yandex则在其自家的浏览器产品上内置了自有的DNSCrypt客户端支持。[16]

参见

编辑

参考资料

编辑
  1. ^ [dnscrypt]写了一个 dnscrypt 的服务器端代理 dnscrypt-wrapper. V2EX. 2012-11-20 [2018-07-14]. (原始内容存档于2018-07-15). 
  2. ^ DNSCrypt Proxy README.md. Github. [2017-02-16]. (原始内容存档于2016-01-20). 
  3. ^ DNSCrypt/dnscrypt-protocol. GitHub. [2018-07-14]. (原始内容存档于2018-11-03) (英语). 
  4. ^ cofyc/dnscrypt-wrapper. GitHub. [2018-07-14]. (原始内容存档于2018-06-11) (英语). 
  5. ^ DNS Security with DNSCrypt. OpenDNS. [2018-07-14]. (原始内容存档于2018-07-15). 
  6. ^ Protect: secure DNS requests. Yandex. [2018-07-14]. (原始内容存档于2018-07-15) (英语). 
  7. ^ Vladimir Ozersky. AdGuard DNS Now Supports DNSCrypt. blog.adguard.com. 2016-10-14 [2018-07-14]. (原始内容存档于2017-09-12) (英语). 
  8. ^ DNS Filtering Android. [2018-07-14]. (原始内容存档于2017-09-11). 
  9. ^ DNSCrypt Resolvers. [2018-07-14]. (原始内容存档于2020-06-19). 
  10. ^ jedisct1/dnscrypt-proxy. GitHub. [2017-02-16]. (原始内容存档于2016-01-20) (英语). 
  11. ^ chengr28/Pcap_DNSProxy. GitHub. [2018-07-14]. (原始内容存档于2018-06-11) (英语). 
  12. ^ softwareengineer1/YourFriendlyDNS. GitHub. [2018-07-14]. (原始内容存档于2018-09-02) (英语). 
  13. ^ Andrew. DNSCrypt: How To Encrypt DNS Traffic In Ubuntu Or Linux Mint. webupd8.org. 2015-01-14 [2017-02-16]. (原始内容存档于2017-03-15) (英语). 
  14. ^ bitbeans/SimpleDnsCrypt. GitHub. [2018-07-14]. (原始内容存档于2018-07-16) (英语). 
  15. ^ stammy/dnscrypt-osx-client. GitHub. [2018-07-14]. (原始内容存档于2018-06-11) (英语). 
  16. ^ BarakAdama. Решаем проблему перехвата и подмены DNS-запросов. DNSCrypt в Яндекс.Браузере. 2016-03-29 [2017-02-16]. (原始内容存档于2017-03-05) (俄语). 

外部链接

编辑