DNS,dnsmasq,dnscrypt,

在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

Comments !

blogroll

social