在Mac OSX 上配置 DNSCrypt+dnsmasq 防止污染
今天无意间看到一个防治DNS 污染的文章原文地址,想试试,没想到折腾了三天,记录一下操作过程。
中间还折腾了一下unbound
,结果在Mac上启动不起来,一启动就退出了,没有找到原因,如果有大神知道原因,还请指教。
1. 安装
在Mac上安装DNSCrypt和dnsmasq还是比较容易的,直接用Homebrew安装就可以。
$ brew install dnsmasq
$ brew install dnscrypt-proxy
2.启动DNSCrypt
DNSCrypt-proxy
主要通过加密的隧道来解析一些被污染的dns地址。直接贴过来上面文章里的启动参数
➜ ~ sudo /usr/local/sbin/dnscrypt-proxy --local-address=127.0.0.1:40 --edns-payload-size=4096 --user=nobody --resolver-address=77.66.84.233:443 --provider-name=2.dnscrypt-cert.resolver2.dnscrypt.eu --provider-key=3748:5585:E3B9:D088:FD25:AD36:B037:01F5:520C:D648:9E9A:DD52:1457:4955:9F0A:9955
--local-address
这个字段是表示本地提供加密dns解析的地址
--edns-payload-size
这个字断指定edns的payload size大小
--user
指定用户身份运行
--resolver-address
指定加密的DNS地址
--provider-name
指定DNS提供商的名字
--provider-key
指定DNS服务器的密钥
正常启动之后会显示如下内容
[NOTICE] Starting dnscrypt-proxy 1.6.1
[INFO] Generating a new session key pair
[INFO] Done
我们用dig
命令来试一下,结果失败了。
➜ ~ dig @127.0.0.1 -p 40 google.com
; <<>> DiG 9.8.3-P1 <<>> @127.0.0.1 -p 9999 google.com
; (1 server found)
;; global options: +cmd
;; connection timed out; no servers could be reached
在DNSCrypt页面频繁出现
[ERROR] Unable to retrieve server certificates
[INFO] Refetching server certificates
[ERROR] Unable to retrieve server certificates
[INFO] Refetching server certificates
[ERROR] Unable to retrieve server certificates
[INFO] Refetching server certificates
[ERROR] Unable to retrieve server certificates
[INFO] Refetching server certificates
[ERROR] Unable to retrieve server certificates
[INFO] Refetching server certificates
查了一下,好像是被干扰了,当然,如果有时候运气好的话,也会连接上
[INFO] Chosen certificate #808464433 is valid from [2015-09-11] to [2016-09-10]
[INFO] Server key fingerprint is 164E:1AD6:4356:777D:2019:F2F9:D389:2DDB:BC75:8AF0:9172:8E0C:A874:10C7:3BE8:423B
[NOTICE] Proxying from 127.0.0.1:40 to 77.66.84.233:443
然后再次使用dig
命令查一下google的ip地址,就可以查询到结果了。
➜ ~ dig @127.0.0.1 -p 40 google.com
; <<>> DiG 9.8.3-P1 <<>> @127.0.0.1 -p 9999 google.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26326
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 5
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 235 IN A 172.217.18.78
;; AUTHORITY SECTION:
google.com. 41354 IN NS ns2.google.com.
google.com. 41354 IN NS ns1.google.com.
google.com. 41354 IN NS ns4.google.com.
google.com. 41354 IN NS ns3.google.com.
;; ADDITIONAL SECTION:
ns1.google.com. 281999 IN A 216.239.32.10
ns2.google.com. 335276 IN A 216.239.34.10
ns3.google.com. 331344 IN A 216.239.36.10
ns4.google.com. 171246 IN A 216.239.38.10
;; Query time: 362 msec
;; SERVER: 127.0.0.1#40(127.0.0.1)
;; WHEN: Fri Jun 24 14:12:35 2016
;; MSG SIZE rcvd: 191
我想说的是,如果频繁的运气不好的话可以添加下面字段
--ephemeral-keys
混淆密钥,from here
另
肯定有人问这些服务器从哪里得到的,我是从/usr/local/Cellar/dnscrypt-proxy/1.6.1/share/dnscrypt-proxy/dnscrypt-resolvers.csv
里面找的,也可以从这个git仓库找一下。
3.配置dnsmasq
配置DNSMasq,修改 /usr/local/etc/dnsmasq.conf
# 不读取有关解析的配置文件,默认使用/etc/revolve.conf中的上游服务器地址进行解析
# 这里我们把地址直接写在配置文件里,所以不需要这个了
no-resolv
# 不检查有关解析的配置文件更新(原因同上)
no-poll
# 配置文件路径,加载dnsmasq-china-list的那两个配置文件
conf-dir=/usr/local/etc/dnsmasq.d
# 附加Hosts文件,可有可无,我觉得以后可能还是需要用到Hosts,就加入了这一行
addn-hosts=/usr/local/etc/dnsmasq.hosts
# 上游服务器设置成DNSCrypt
server=127.0.0.1#40
# 缓存大小,默认是150,调大点应该没坏处
cache-size=2000
# 启用DNSSEC代理,应该能增强安全性吧
proxy-dnssec
# 可以自行参照man dnsmasq里的内容继续添加别的参数
这个项目维护了一份中国地区大部分网站的地址。这个列表来可以帮助DNSMasq判断应该把DNS请求发向哪里。我们先要把里面的两个配置文件下载下来,创建 /usr/local/etc/dnsmasq.d 文件夹,下载项目的文件放到这个目录下。当然自己也可以根据配置文件来添加自己的配置文件。
几个配置文件的说明
#指定baidu.com的域名到114来解析。
server=/baidu.com/114.114.114.114
#指定baidu.com的域名解析到 127.0.0.1 的ip地址上,类似hosts文件
address=/baidu.com/127.0.0.1
#指定202这个ip不响应,当ISP进行DNS劫持时,会将域名解析到指定的ip地址,我们可以把这个地址写在这里,当遇到域名解析到这个地址的时候,则不响应。
bogus-nxdomain=202.202.202.202
4.启动dnsmasq
直接使用下面的命令启动 dnsmasq
sudo /usr/local/opt/dnsmasq/sbin/dnsmasq -C /usr/local/etc/dnsmasq.conf
然后将系统的dns设置成127.0.0.1,在使用dig
来测试一下google.com的解析
➜ ~ dig google.com
; <<>> DiG 9.8.3-P1 <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59153
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 5
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 150 IN A 216.58.209.206
;; AUTHORITY SECTION:
google.com. 39469 IN NS ns4.google.com.
google.com. 39469 IN NS ns1.google.com.
google.com. 39469 IN NS ns2.google.com.
google.com. 39469 IN NS ns3.google.com.
;; ADDITIONAL SECTION:
ns1.google.com. 280114 IN A 216.239.32.10
ns2.google.com. 333391 IN A 216.239.34.10
ns3.google.com. 329459 IN A 216.239.36.10
ns4.google.com. 169361 IN A 216.239.38.10
;; Query time: 517 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Jun 24 14:44:00 2016
;; MSG SIZE rcvd: 191
5.结论
测试了一下,发现原来twitter和instragram是被污染后导致不能访问,google还是不能直接访问。不过dns干净了很多,因为有了缓存,访问起来也快一些,配合ss使用还是很爽的。
参考文章:
我(以前)的DNS解决方案
dnscrypt-proxy参数详解
Homebrew with DNSMasq + DNSCrypt-proxy (OpenDNS)
dnscrypt
使用 Unbound 搭建更好用的 DNS 服务器
翻墙教程之DNSCrypt+unbound
There are comments.