[ChinaDNS] 无污染的智能路由 DNS 折腾记
当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »
手上有台去年被京东云骗了买的80多rmb一年的1M小水管机子,闲着也是闲着,就打算用 ChinaDNS 项目部署一个无污染的DNS服务,其中遇到了许多坑,弄清楚了之后我觉得很有必要写一篇教程(特别是在用H大的老毛子固件上的ChinaDNS的朋友们需要看一看),其中涉及到 DNS 污染的问题是重点
Head Pic: 「There is a reason」/「极道寂」[pixiv]
"We'll always be together"
ChinaDNS
[button color="dark" icon="fa fa-github"]shadowsocks/ChinaDNS[/button]
最初得知这玩意是用了H大的老毛子固件,不过实际使用的时候还是会发生一些科学无法解释的问题,于是决定拿一个 VPS 手动搭一个 ChinaDNS 的服务器来实验
关于 DNS 污染
搭建这个 ChinaDNS 的首要目的是为了解决 DNS 污染问题
i> 什么是 DNS 污染?
https://zh.wikipedia.org/wiki/域名服务器缓存污染
首先我们来使用dig
命令测试一下解析
目前我自己已知的最容易判断的污染是www.pixiv.net
,即P站域名
在大陆 VPS 上测试
114 DNS
通过114.114.114.114
进行查询:
root@JDu4e00u53f7:~# dig www.pixiv.net @114.114.114.114
; <<>> DiG 9.10.3-P4-Ubuntu <<>> www.pixiv.net @114.114.114.114
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60508
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.pixiv.net. IN A
;; ANSWER SECTION:
www.pixiv.net. 33 IN A 66.220.158.32
;; Query time: 21 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: Thu Apr 05 17:13:02 CST 2018
;; MSG SIZE rcvd: 58
我们发现其返回了66.220.158.32
这个IP,这是用于污染 DNS 的投毒 IP 之一
OpenDNS
我们还知道,国外的 DNS 是无污染的,其中比较有名的就是 OpenDNS 和 GoogleDNS,不过因为谷歌被特殊照顾,你根本无法在大陆内使用8.8.8.8
(自己在本机测试下路由追踪就懂了),但是 OpenDNS 是没问题的
通过 OpenDNS 208.67.222.222
进行查询:
root@JDu4e00u53f7:~# dig www.pixiv.net @208.67.222.222
; <<>> DiG 9.10.3-P4-Ubuntu <<>> www.pixiv.net @208.67.222.222
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56655
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;www.pixiv.net. IN A
;; ANSWER SECTION:
www.pixiv.net. 77 IN A 66.220.152.17
;; Query time: 2 msec
;; SERVER: 208.67.222.222#53(208.67.222.222)
;; WHEN: Thu Apr 05 17:49:26 CST 2018
;; MSG SIZE rcvd: 47
结果是出人意料的(虽然对我来说并不意外XD),结果依然是被污染的
这是为什么?
很自然的会想到,GFW 肯定对 DNS 数据包做了手脚,因为 OpenDNS 服务器位于国外,从大陆发出的数据包势必要通过 GFW,那么被做点手脚是很容易的事情了
那么怎么办?
有一个突破口就在于,DNS 的端口不一定只能用53
幸运的是,GFW 确实只会检测53
端口的 DNS 数据包,而且 OpenDNS 除了53
,还提供了443
和5353
端口的 DNS 服务
通过208.67.222.222
的443
端口进行查询:
root@JDu4e00u53f7:~# dig www.pixiv.net @208.67.222.222 -p 443
; <<>> DiG 9.10.3-P4-Ubuntu <<>> www.pixiv.net @208.67.222.222 -p 443
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6215
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.pixiv.net. IN A
;; ANSWER SECTION:
www.pixiv.net. 6 IN CNAME pixiv.net.
pixiv.net. 41 IN A 210.129.120.42
pixiv.net. 41 IN A 210.129.120.41
pixiv.net. 41 IN A 210.129.120.44
;; Query time: 108 msec
;; SERVER: 208.67.222.222#443(208.67.222.222)
;; WHEN: Thu Apr 05 18:06:33 CST 2018
;; MSG SIZE rcvd: 104
我们看到,这一次终于返回了正确的 IP 地址结果(Yeah~
为什么使用 ChinaDNS 而不是直接使用 OpenDNS
- 我们必须使用非
53
端口去查询国外 DNS 才能得到没有被 GFW 篡改的正确解析结果,ChinaDNS 可以自定义使用的 DNS 的端口,而 Windows 系统的 DNS 设置定死了使用53
端口 - 如果通过 OpenDNS 去解析国内网站,那么很可能会得到一个海外 IP(很多大公司都会配备有海外服务器供海外华人使用,例如京东啦淘宝啦B站啦),这样会导致访问国内网站访问速度很慢
而 ChinaDNS 可以根据 chnrouter 来判断,如果从国内 DNS 里解析到国内 IP 的话就使用,对于国外网站会过滤掉从国内 DNS 解析得到的被污染的结果,十分完美的解决了这个问题
在大陆 VPS 上部署 ChinaDNS
# 如果 Linux 上没有安装 make 和 gcc 的话要先安装
# Ubuntu / Debian
apt-get install -y make gcc
# CentOS
yum install -y make gcc
# 下载 ChinaDNS 源码并解压编译
wget --no-check-certificate https://github.com/shadowsocks/ChinaDNS/releases/download/1.3.2/chinadns-1.3.2.tar.gz
tar -zxvf chinadns-1.3.2.tar.gz
cd chinadns-1.3.2
./configure && make
# 更新 chnrouter(必要,因为源码中自带的 chnrouter 已经很旧了)
curl 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | grep ipv4 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > chnroute.txt
# 更新黑名单IP列表(推荐)
rm -f iplist.txt && wget --no-check-certificate https://raw.githubusercontent.com/Tsuk1ko/ChinaDNS/master/iplist.txt
# 启动 ChinaDNS(编译好的程序在 src 目录中)
src/chinadns -m -c chnroute.txt -s 114.114.114.114,208.67.222.222:443
最后别忘记开放防火墙的53
UDP端口,这一步如果你不会的话就自行百度吧(
需要注意的是,这样直接运行是在前台运行,如果你退出 SSH,程序就会终止
在正式使用场合,你需要使用nohup
或者screen
或者supervisor
让 ChinaDNS 在后台一直运行(后面会讲使用supervisor
的方法)
重点
-
如果不使用
-s
参数,那么 ChinaDNS 会默认使用114.114.114.114,208.67.222.222:443,8.8.8.8
作为 DNS,这样会导致一个很严重的问题!前面我们说过,如果你不通过非
53
端口去查询国外 DNS,就会得到一个被污染的查询结果,因此如果你使用53
端口的国外 DNS 作为 ChinaDNS 的 DNS,最终就会得到被污染的查询结果,从而无法解决污染问题,而 ChinaDNS 正是默认使用了8.8.8.8
- 使用H大老毛子固件上的 ChinaDNS 的时候也请一定要把
8.8.8.8
去掉,如果不开酸酸/酸酸乳,那么这个8.8.8.8
就会污染你的 ChinaDNS 结果 - 你可以不用 114DNS 当国内 DNS,但是请注意使用
-s
参数指定 DNS 的时候,一定要把国内 DNS 写在前面,OpenDNS 写在最后面,否则会出现解析国内网站返回海外 IP 的现象(亲测
另外,不能在墙外的 VPS 上搭建 ChinaDNS:
- 从墙外 VPS 访问国内 DNS 查询国内网站会得到海外 IP 结果
- 你从大陆发往墙外 VPS 的 DNS 数据包仍会经过 GFW,这意味着你还是不能使用
53
端口
测试 ChinaDNS
以下是我在自己家路由器上dig
的结果:
Pixiv
[MI-3 /opt/home/admin]# dig www.pixiv.net @我自建的ChinaDNS服务器
; <<>> DiG 9.11.2 <<>> www.pixiv.net @我自建的ChinaDNS服务器
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55219
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.pixiv.net. IN A
;; ANSWER SECTION:
www.pixiv.net. 39 IN CNAME pixiv.net.
pixiv.net. 39 IN A 210.129.120.44
pixiv.net. 39 IN A 210.129.120.41
pixiv.net. 39 IN A 210.129.120.42
;; Query time: 183 msec
;; SERVER: 我自建的ChinaDNS服务器#53(我自建的ChinaDNS服务器)
;; WHEN: Thu Apr 05 18:50:49 CST 2018
;; MSG SIZE rcvd: 104
解析正常√
[MI-3 /opt/home/admin]# dig www.google.com @我自建的ChinaDNS服务器
; <<>> DiG 9.11.2 <<>> www.google.com @我自建的ChinaDNS服务器
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25408
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.google.com. IN A
;; ANSWER SECTION:
www.google.com. 300 IN A 172.217.25.4
;; Query time: 243 msec
;; SERVER: 我自建的ChinaDNS服务器#53(我自建的ChinaDNS服务器)
;; WHEN: Thu Apr 05 18:51:05 CST 2018
;; MSG SIZE rcvd: 59
解析正常√
B站
[MI-3 /opt/home/admin]# dig www.bilibili.com @我自建的ChinaDNS服务器
; <<>> DiG 9.11.2 <<>> www.bilibili.com @我自建的ChinaDNS服务器
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11000
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.bilibili.com. IN A
;; ANSWER SECTION:
www.bilibili.com. 255 IN CNAME bilibili.hdslb.net.
bilibili.hdslb.net. 134 IN A 111.231.211.246
bilibili.hdslb.net. 134 IN A 140.143.82.138
bilibili.hdslb.net. 134 IN A 111.231.212.88
bilibili.hdslb.net. 134 IN A 112.117.218.167
;; Query time: 166 msec
;; SERVER: 我自建的ChinaDNS服务器#53(我自建的ChinaDNS服务器)
;; WHEN: Thu Apr 05 18:51:14 CST 2018
;; MSG SIZE rcvd: 141
解析正常√
并且解析到的结果是国内的服务器,没有跑到国外去√
综上
这样的解决方案是可行的(Yeah~
使用supervisor
防止 ChinaDNS 程序挂掉
具体请参考这篇文章中的内容
[post cid="1299" /]