如何在iOS或macOS上加密你的DNS(配置DoH或DoT)
什么是DNS
DNS(Domain Name System)是网络的电话簿,完成从字母域名转变成IP地址的工作。比如将baidu.com转换为220.181.38.148。
为什么需要加密DNS
因为历史原因,DNS系统在设计之初完全没有考虑加密,所以你任何在浏览器内键入的地址,都会被你的运营商或者公司,或者某些有恶意趣味的人轻易的通过抓包工具获取到。虽然在现实的网络中,旁观者攻击并不是一件非常容易的事情,因为现代交换机并不会把你的数据包转发到设备上连接的所有的其他网口,但是这些对于别有用心的人来说,都不是一件难事,有很多其他的技术可以绕过这些限制。
此外,防范你的公司网络,网络运营商,甚至某些公共Wi-Fi提供者跟踪你的隐私,也是一件十分必要的事。
简单的例子
以下是一个简单的例子,假设你连上了某个咖啡店的免费Wi-Fi(这里我使用Windows虚拟机当作你的电脑),如果这个咖啡店的店主想获取你正在访问的域名,他只需要通过抓包软件,就可以轻易获取未加密的DNS原文内容。
比如你现在正在访问bilibili

通过抓包软件可以轻易的看到你正在尝试访问bilibili

而如果我将浏览器设置为使用加密DNS后,再次访问bilibili只能抓到加密后的包


如何防止
针对DNS未加密导致的隐私问题,互联网工程任务组(IETF)在2016年和2018年提出了两种可行的方案,DNS over TLS (rfc7858) 和DNS over HTTPS (rfc8484)。两者的区别主要是DNS over TLS (DoT)使用TLS技术加密DNS报文,而DNS over HTTPS (DoH)使用HTTPS技术加密报文,对于普通用户来说,两者都能达到保护隐私的效果。唯一的区别在于,DoT使用853端口,而DoH使用443端口。DoH能够很好的将DNS请求隐藏在众多的HTTPS数据包中,能够一定程度上防止别人检测到你在使用DoH技术。
如何在iOS和macOS上使用DoH或者DoT技术
虽然iOS或macOS上的一些第三方浏览器提供了DNS加密选项,但选项仅仅会在使用该第三方浏览器时才会生效。macOS Big Sur和iOS 14虽然支持系统全局的DoH或DoT功能,却不能通过设置或者系统偏好设置进行配置。要强制开启系统级别的DoH和DoT,目前只能使用描述文件。(需要macOS系统至少为Big Sur,需要iOS系统至少为iOS 14)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>Name</key>
<string>Cloudflare DNS over TLS</string>
<key>PayloadDescription</key>
<string>Configures device to use Cloudflare Encrypted DNS over TLS</string>
<key>PayloadDisplayName</key>
<string>Cloudflare DNS</string>
<key>PayloadIdentifier</key>
<string>com.apple.dnsSettings.managed.AFCA1444-5AEB-44CD-B23D-5D1B3ADCD1EE</string>
<key>PayloadType</key>
<string>com.apple.dnsSettings.managed</string>
<key>PayloadUUID</key>
<string>A6F9CB2D-F00E-4C3A-90EB-E19E5B872C4F</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>DNSSettings</key>
<dict>
<key>DNSProtocol</key>
<string>TLS</string>
<key>ServerAddresses</key>
<array>
<string>2606:4700:4700::1111</string>
<string>2606:4700:4700::1001</string>
<string>1.1.1.1</string>
<string>1.0.0.1</string>
</array>
<key>ServerName</key>
<string>cloudflare-dns.com</string>
</dict>
</dict>
</array>
<key>PayloadDescription</key>
<string>Adds the Cloudflare DNS to Big Sur and iOS 14 based systems</string>
<key>PayloadDisplayName</key>
<string>Cloudflare DNS over TLS</string>
<key>PayloadIdentifier</key>
<string>r.macOSBeta.0BD60CF6-64B5-4D16-BEA4-7294E93BDD4C</string>
<key>PayloadRemovalDisallowed</key>
<false/>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>01DA864C-C3AF-4039-A8D0-A00D982B1569</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>
将以上文本文件保存到以.mobileconfig结尾的文本文件中,在macOS或者iOS上打开后安装,即可强制启用DoT,使用cloudflare(1.1.1.1)提供的加密DNS服务
以下是DoH的配置版本,使用1.1.1.1提供加密DNS服务
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>DNSSettings</key>
<dict>
<key>DNSProtocol</key>
<string>HTTPS</string>
<key>ServerAddresses</key>
<array>
<string>2606:4700:4700::1111</string>
<string>2606:4700:4700::1001</string>
<string>1.1.1.1</string>
<string>1.0.0.1</string>
</array>
<key>ServerURL</key>
<string>https://cloudflare-dns.com/dns-query</string>
</dict>
<key>PayloadDescription</key>
<string>Configures device to use Cloudflare Encrypted DNS over HTTPS</string>
<key>PayloadDisplayName</key>
<string>Cloudflare DNS over HTTPS</string>
<key>PayloadIdentifier</key>
<string>com.apple.dnsSettings.managed.9d6e5fdf-e404-4f34-ae94-27ed2f636ac4</string>
<key>PayloadType</key>
<string>com.apple.dnsSettings.managed</string>
<key>PayloadUUID</key>
<string>35d5c8a0-afa6-4b36-a9fe-099a997b44ad</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>ProhibitDisablement</key>
<false/>
</dict>
</array>
<key>PayloadDescription</key>
<string>Adds the Cloudflare DNS to Big Sur and iOS 14 based systems</string>
<key>PayloadDisplayName</key>
<string>Cloudflare DNS over HTTPS</string>
<key>PayloadIdentifier</key>
<string>com.paulmillr.apple-dns</string>
<key>PayloadRemovalDisallowed</key>
<false/>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>A4475135-633A-4F15-A79B-BE15093DC97A</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>
如何验证自己已经开启DoH或者DoT
访问 https://1.1.1.1/help 如果Using DNS over HTTPS (DoH)或者Using DNS over TLS (DoT)项为yes,即可确认你已经成功开启