月度归档:2016年06月

拒绝DNS污染和UDP干扰,在Openwrt路由器上部署DNSCrypt,加密查询DNS

博主的网络环境比较差,这要感谢该死的宽带通呵呵呵

经查该运行商阻挡了境外udp的通信,导致原本想通过shadowsocks的udp隧道来进行加密DNS查询的方案失败

通过搜索我发现我们可以直接安装DNSCrypt来达到我们的目的,官方网站在https://dnscrypt.org/,DNSCrypt是OpenDNS发布的加密DNS工具,可加密DNS流量,阻止常见的DNS攻击,如重放攻击、观察攻击、时序攻击、中间人攻击和解析伪造攻击。DNSCrypt支持Openwrt,是防止DNS污染的绝佳工具!

我们可以使用opkg进行安装

opkg update
opkg install dnscrypt-proxy

安装完成之后,我们使用下面命令启动dnscrypt-proxy并设置开机启动,5353端口将自动被监听。

/etc/init.d/dnscrypt-proxy start
/etc/init.d/dnscrypt-proxy enable

然后我们可以在luci中配置Chinadns的上游服务器中加入127.0.0.1::5353,注意Chinadns的默认端口为5353,需要换一个(比如我设置为5354),或者你换dnscrypt-proxy的默认端口也可以,dnscrypt-proxy的配置文件在/etc/config。然后我们到【网络】–>【DHCP/DNS】,把DNS转发设置为127.0.0.1#5354,然后换到【HOSTS和解析文件】选项卡,把【忽略解析文件】给打开(默认配置为/tmp/resolv.conf.auto)

下面是配置的大概过程

3 1 2

我们可以测试dnscrypt-proxy的解析结果,首先使用天朝局域网,这里是我的上游服务器。

dig @192.168.199.1 www.youtube.com
; <<>> DiG 9.9.8-P3 <<>> @192.168.199.1 www.youtube.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15703
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 4, ADDITIONAL: 4

;; QUESTION SECTION:
;www.youtube.com.		IN	A

;; ANSWER SECTION:
www.youtube.com.	18829	IN	CNAME	youtube-ui.l.google.com.
youtube-ui.l.google.com. 600	IN	CNAME	youtube-ui-china.l.google.com.
youtube-ui-china.l.google.com. 600 IN	A	37.61.54.158

;; AUTHORITY SECTION:
google.com.		109949	IN	NS	ns2.google.com.
google.com.		109949	IN	NS	ns3.google.com.
google.com.		109949	IN	NS	ns1.google.com.
google.com.		109949	IN	NS	ns4.google.com.

;; ADDITIONAL SECTION:
ns1.google.com.		110089	IN	A	216.239.32.10
ns2.google.com.		113947	IN	A	216.239.34.10
ns3.google.com.		115317	IN	A	216.239.36.10
ns4.google.com.		171663	IN	A	216.239.38.10

;; Query time: 4 msec
;; SERVER: 192.168.199.1#53(192.168.199.1)
;; WHEN: Wed Jun 22 15:51:18 HKT 2016
;; MSG SIZE  rcvd: 250

37.61.54.158,一个很明显的污染地址,看看下面这个庞大的列表orz

4

然后使用我们的dnscrypt-proxy

dig @127.0.0.1 www.youtube.com -p 5353
; <<>> DiG 9.9.8-P3 <<>> @127.0.0.1 www.youtube.com -p 5353
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9816
;; flags: qr rd ra; QUERY: 1, ANSWER: 8, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.youtube.com.		IN	A

;; ANSWER SECTION:
www.youtube.com.	84137	IN	CNAME	youtube-ui.l.google.com.
youtube-ui.l.google.com. 900	IN	CNAME	youtube-ui-china.l.google.com.
youtube-ui-china.l.google.com. 180 IN	A	173.194.72.101
youtube-ui-china.l.google.com. 180 IN	A	173.194.72.139
youtube-ui-china.l.google.com. 180 IN	A	173.194.72.113
youtube-ui-china.l.google.com. 180 IN	A	173.194.72.100
youtube-ui-china.l.google.com. 180 IN	A	173.194.72.102
youtube-ui-china.l.google.com. 180 IN	A	173.194.72.138

;; Query time: 277 msec
;; SERVER: 127.0.0.1#5353(127.0.0.1)
;; WHEN: Wed Jun 22 15:52:18 HKT 2016
;; MSG SIZE  rcvd: 205

这样就获取到正确的DNS了