DNSCrypt 是一个由 Frank Denis 和 Yecheng Fu 设计的加密协议。目的在于加密客户端和 DNS 服务器端之间的通讯,以实现多种保护目的。比如防止 ISP 对 DNS 协议的恶意劫持,或者部分 DNS 服务对 NXDOMAIN 的劫持(对解析失败的域名跳转到广告页面)。
DNSCrypt-Proxy 是 DNSCrypt 协议的一个实现,支持多种操作系统。本文描述的是如何在 macOS 上启用并进行一些必要的配置。
最简单的安装方式就是通过 Homebrew:
brew install dnscrypt-proxy
安装完成之后,先不要启动,打开下面这个文件,改动几个地方:
/usr/local/etc/dnscrypt-proxy.toml
如果 DNSCrypt-Proxy 本身遇到任何问题的时候,我们可以从应用自身的日志中看到。
文件内搜索 log_level 然后修改这两行:
log_level = 0
log_file = '/usr/local/var/log/dnscrypt-proxy.log'
查询日志在本地记录你的每一次 DNS 查询的时间、域名和查询类型。
文件内搜索 query_log,然后将 file 那一行修改为:
file = '/usr/local/var/log/query.log'
NX 日志记录的那些不存在的域名的查询。通常,恶意软件,或者是没有正常工作的过时软件会发出这样的查询。
文件内搜索 nx_log,然后将 file 那一行修改为:
file = '/usr/local/var/log/nx.log'
在任何情况下不使用操作系统自带的解析,在文件中搜索 ignore_system_dns 然后修改 true:
ignore_system_dns = true
DNSCrypt-Proxy 的启动稍微特殊的一点是,因为它需要监听在 53 端口,因此我们需要使用 sudo 来管理服务。
启动 DNSCrypt-Proxy:
sudo brew services start dnscrypt-proxy
如果服务正常启动了,那么在我们之前打开的 dnscrypt-proxy.log 中应该可以看到下面这行:
dnscrypt-proxy is ready

然后你就可以在 macOS 的网络设置中将 DNS 设置为 127.0.0.1 了。然后访问几个你经常去的网站,就可以在之前打开的 query.log 中看到查询记录。
如果在这样设置之后打开网站遇到问题,那么在 dnscrypt-proxy.log 日志文件中应该可以找到线索。
因为开启了 query_log,所以我们可以用下面这条指令找出解析量最大的域名:
cat query.log|awk -F$'\t' '{print $3}'|sort|uniq -c|sort -r|more
而如果你有其他的分析工具,query.log 会是一个很有意思的数据源可以玩。
你可以将 DNSCrypt-Proxy 运行在 Linux 服务器上,然后在 resolv.conf 中将 nameserver 设置为 127.0.0.1,这样的话也可以解决服务器上遇到的 DNS 劫持。
TextQL 是一个用 Go 写的工具,可以在任意 CSV / TSV 文件上执行 SQL 查询。
https://github.com/dinedal/textql
这是用 TextQL 从 DNSCrypt-Proxy 的 TSV 格式的 query.log 中获得查询量最大的 10 个域名的例子:
textql -dlm=tab -sql "select count(c2) as sum,c2 group by c2 order by sum desc limit 10" -output-header query.log
在 macOS 上 TextQL 可以直接通过 Homebrew 安装:
brew install textql
|      1Bardon      2018-04-08 22:28:03 +08:00 我一贯的用法,还是拉一个 docker 容器去跑,为了系统版本升级的时候不要出现莫名其妙的问题。 | 
|  |      4uuair      2018-04-08 23:49:02 +08:00 是不是如果在国内这样做了,所有的 dns 访问都加密了?那么国内的地址,会不会变慢呢。。。 我们办公室的网络,好像 dns 就挂了,开那啥都不能访问那啥。。。 | 
|  |      5Bluecoda      2018-04-09 00:01:52 +08:00 如果你正好有一个 ubnt 的路由器(我用的 edge lite 3 )这里正好有一个不错的教程 https://community.ubnt.com/t5/EdgeRouter/DNSCrypt-Proxy-2/td-p/2257892 | 
|  |      62b      2018-04-09 00:02:16 +08:00  1 @uuair 可以在配置文件中设置用国内 DNS 解析国内网站   修改 dnscrypt-proxy.toml 中 forwarding_rules = 'dnscrypt-forwarding-rules.txt' https://raw.githubusercontent.com/CNMan/dnscrypt-proxy-config/master/dnscrypt-forwarding-rules.txt | 
|  |      7Seymer      2018-04-09 00:19:56 +08:00 哇塞,意想不到的是,解决了我在国内使用 Paw 应用连接异常问题,哈哈,非常感谢 :) | 
|  |      8Showfom PRO  1 | 
|  |      9openroc      2018-04-09 07:38:10 +08:00 👍 | 
|  |      10k9982874      2018-04-09 08:55:40 +08:00 via iPhone 站长最近很活跃 | 
|  |      11hackerwgf PRO 我是在阿里云上搭了一个,然后路由器 DNS 连接到它 | 
|  |      12123s      2018-04-09 09:30:43 +08:00 手机上怎么弄? | 
|  |      13wosuopu      2018-04-09 09:47:14 +08:00 先收藏 | 
|  |      15happywowwow      2018-04-09 12:18:04 +08:00 | 
|      16xtddd      2018-04-09 16:18:46 +08:00 @2b dnscrypt-proxy.toml 中 forwarding_rules = 'dnscrypt-forwarding-rules.txt'  文件里这个没有找到, | 
|  |      17happywowwow      2018-04-09 16:31:15 +08:00 恩 不知道以上的人有没有发现个问题.  用了这个之后, 如果你的 mac 上安装了 docker, docker 会给容器也配置 127.0.0.1 的 DNS... 然容器的 127 和主机不在一个 ns 下... | 
|      18v2register      2018-04-09 17:40:04 +08:00  1 @xtddd  #16 https://github.com/jedisct1/dnscrypt-proxy/blob/master/dnscrypt-proxy/example-dnscrypt-proxy.toml#L196 重命名 example-dnscrypt-proxy.toml 为 dnscrypt-proxy.toml 下载 https://raw.githubusercontent.com/CNMan/dnscrypt-proxy-config/master/dnscrypt-forwarding-rules.txt 再把# forwarding_rules = 'forwarding-rules.txt'改为 forwarding_rules = 'dnscrypt-forwarding-rules.txt' | 
|      20xtddd      2018-04-10 09:26:33 +08:00 @v2register 在 win 上已经设置完成了,谢谢 | 
|      21xtddd      2018-04-10 09:41:56 +08:00 @v2register 这个国内地址用国内的 dns,那国外的地址是用哪个 dns 解析? | 
|      22thuai      2018-04-10 10:01:55 +08:00 公司局域网路由内绑定了私有域名怎么设置才能够访问,Google 了下没有找到相关的东西 | 
|      23xtddd      2018-04-10 20:56:47 +08:00 @v2register 我在 mac 上用 berw 安装后,设置成 127.0.0.1,上不了网,找不到服务器,这是怎么回事 | 
|      24v2register      2018-04-11 20:07:04 +08:00 | 
|      25v2register      2018-04-11 20:09:41 +08:00 @xtddd  #23 应该是 #17 所说的问题导致的,你试试直接下载 macos 的 bin 运行 https://github.com/jedisct1/dnscrypt-proxy/releases | 
|      26xtddd      2018-04-11 20:23:30 +08:00 @v2register 好的,谢谢。还有一个选项就是用 macos 的 dnsproxy 客户端 | 
|      27xtddd      2018-04-11 21:16:11 +08:00 @v2register 下了 macos 的 bin 操作成功了,只是重启后,127.0.0.1 会自动改回路由器 dns 地址。得手动再改一下 | 
|      28v2register      2018-04-14 10:19:41 +08:00 @thuai  #22 cloaking-rules 配置相关域名的静态 IP,或者 forwarding-rules 配置相关域名用原 DNS 解析 | 
|      29xtddd      2018-04-17 14:56:09 +08:00 @v2register 你好,dnscrypt-proxy 有必要和 unbound 一起使用吗? | 
|      30TheKiller      2018-04-20 06:23:44 +08:00 via iPhone Pcap_DNSProxy 了解一下? | 
|      31v2register      2018-04-22 00:50:02 +08:00 @xtddd  #29 v2 不需要 unbound 了 | 
|      32xtddd      2018-04-23 10:58:54 +08:00 @v2register 恩好的,v2 已经有缓存了 | 
|      33tf0083      2018-05-28 10:57:42 +08:00 日志文件在 var 目录下根本没有 log 这个目录,需要手工建立吗 |