DNS 是什么?
DNS 的全称是 Domain Name Server,是完成域名和与之相对应的IP地址转换的服务器。通俗来讲,DNS 服务器就好比村口的王大爷,你告诉他你想找的住户名字(网站域名),他便引导你到正确的门牌号(IP地址)。
传统的 DNS 有什么问题?
DNS是一套非常非常古老的协议,最早可追溯到1983年,自从1987年协议定稿之后,没有发生什么变化,被一直沿用至今。开发DNS协议的时候,互联网还是新兴事物,因此大家根本没顾虑到信息的安全性和保密性。传统的DNS查询和响应通过UDP或TCP发送而不加密,这很容易受到窃听和欺骗,包括基于DNS的网络审查,称为DNS污染。
继续刚才的比喻:你在村口遇到的可能是假的王大爷;你遇到的大爷会带你去错误的门牌号;王大爷给你指路时会被其他人听到。你打开网易,登录自己的邮箱,你看到地址栏的网址是 mail.163.com
没错,于是信心满满地输入你的用户名和密码,殊不知你登录的其实是黑客设立的假网站……
开启 DNSCrypt-proxy
DNSCrypt-proxy 是一款开源的、灵活的 DNS 代理,支持现代加密DNS协议,如 DNSCrypt v2 和 DNS-over-HTTPS,并支持 DNSCrypt 与基于 TLS 1.3 的 DNS-over-HTTPS(DoH)。
本安装章节以 Mac OS 为例,如你需要 Windows 或其他操作系统,可以看这篇官方安装指南。
启动系统自带的终端(Terminal)
应用程序以使用命令行,然后键入以下命令以获取 root shell:
sudo -s
全部安装完成之前,请不要关闭这个终端界面。
假如你的电脑用户名的bob,你可以在你的/Users/bob/
目录下新建一个名为dnscrypt-proxy
的文件夹,最终路径是/Users/bob/dnscrypt-proxy
。
接着,在这里下载程序包,在最新版本中找到dnscrypt-proxy-macos
开头的安装包,下载、解压并放入你刚才新建的文件夹。
回到终端,键入以下命令(记得把bob
改成你自己的电脑用户名):
cd /Users/bob/dnscrypt-proxy
新建一个配置文件:
cp example-dnscrypt-proxy.toml dnscrypt-proxy.toml
在文件夹里找到名为dnscrypt-proxy.toml
的文件,用文本编辑器打开编辑,搜索关键词server_names
,以Cloudflare为例,可以把那一行改为:
server_names = ['cloudflare', 'cloudflare-ipv6']
你也可以改为其它的 DNS over HTTPS 提供商,比如 Quad9。
保存好配置文件,用这条命令,测试一下是否能正常运行:
./dnscrypt-proxy
没问题的话,点开 Mac 菜单栏的 Wi-Fi 图标,打开网络首选项(Network Preferences)
,然后选择您的连接设备比如Wi-Fi。然后,单击高级...(Advanced...)
按钮。找到DNS
标签,把服务器地址全部改为127.0.0.1
,如图:
启动:
./dnscrypt-proxy -service start
回到终端,键入以下命令,让 dnscrypt-proxy 跟随系统启动:
./dnscrypt-proxy -service install
至此,安装完成。
其他使用命令:
- 停止
sudo ./dnscrypt-proxy -service stop
- 重启
sudo ./dnscrypt-proxy -service restart
- 卸载
sudo ./dnscrypt-proxy -service uninstall
在线测试 DNS 安全性
CloudFlare 提供了这个页面,可供在线测试 DNS 的安全性:https://www.cloudflare.com/ssl/encrypted-sni/
你应该可以看到这样的结果:
在 Firefox 中开启 DoH 和 ESNI
目前,Firefox 标准版支持 DNS-over-HTTPS、Firefox Nightly 版本在此基础上还支持 ESNI。
以 Firefox Nightly 版本为例,在地址栏输入 about:config
,进入配置页面:
- 搜索
network.trr.uri
,把配置值设置为:https://1.0.0.1/dns-query
(如果使用别的提供商比如Quad9,可使用https://dns.quad9.net/dns-query
) - 搜索
network.trr.mode
,把配置值设置为:2
(兼容模式) - 搜索
esni.enabled
,把配置值设置为:true
(开启ESNI)
改好后,重启浏览器,再用刚才的测试工具测试一下,四项安全指标都满足了。
使用自定义DoH服务器
使用已支持DoH的服务器IP,转换为sdns://
开头的stamp地址:
转换时,注意protocol要使用Dns-Over-HTTPS
编辑 dnscrypt-proxy.toml
,在[static]
的下面,添加:
[static.'你的自定义服务名称']
stamp = 'sdns://刚刚生成的stamp地址'
然后在server_names
的那行,改为:
server_names = ['你的自定义服务名称']