手上有台去年被京东云骗了买的80多rmb一年的1M小水管机子,闲着也是闲着,就打算用 ChinaDNS 项目部署一个无污染的DNS服务,其中遇到了许多坑,弄清楚了之后我觉得很有必要写一篇教程(特别是在用H大的老毛子固件上的ChinaDNS的朋友们需要看一看),其中涉及到 DNS 污染的问题是重点
Head Pic: 「There is a reason」/「极道寂」[pixiv]
"We'll always be together"
ChinaDNS
最初得知这玩意是用了H大的老毛子固件,不过实际使用的时候还是会发生一些科学无法解释的问题,于是决定拿一个 VPS 手动搭一个 ChinaDNS 的服务器来实验
关于 DNS 污染
搭建这个 ChinaDNS 的首要目的是为了解决 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 程序挂掉
具体请参考这篇文章中的内容
版权声明:本文为原创文章,版权归 神代綺凜 所有。
本文链接:https://moe.best/tutorial/chinadns.html
所有原创文章采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。
您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
另外里面有一个nohup写成了nohub。
當我執行到這行
./src/chinadns -m -c chnroute.txt -s 119.29.29.29,208.67.220.222:443
的時候,
畫面就不會動了,我是原始純淨的阿里雲系統~請問是不是我哪邊要先設置
請版主幫忙~謝謝您了
另外你可以用overture试试
https://lolico.moe/tutorial/overture.html
请博主给我提点建议
现在的梯子质量越来越差,国内的廉价VPN已经死的七七八八了,非常难找,一咬牙就充了一年vyprVPN,几百一年的资费已经赶上我半条网线的包年价格了,翻墙已经快成刚需了。我选这家VPN就是看中他宣传的变色龙加密协议,可靠性或许会强点,据说现在PPTP/L2TP/OpenVPN/SSH啥的都又快扛不住了
现在我已经买了个烽火HG320路由器(二手30块钱),刷了tomato shibby 132固件,把vyprVPN官方插件装上去,串联个淘汰路由器,打造成了我家的翻墙专用网关
现在我的局域网有2个网关IP了
192.168.1.1是电信光纤的主出口网关
192.168.1.4是翻墙出口网关,所有发送到这里的流量都会经过VPN(变色龙协议)包装,再从主网关出去
(╯‵□′)╯︵┴─┴ 把我家的路由器弄这么乱都是为了可靠性和灵活性啊,网线电线一大堆我也不想啊,但为了保证翻墙效果我忍了,毕竟把VPN隧道直接包装成一个同网段的网关IP,会更方便后端的灵活组合,如果哪天变色龙梯子又烂了,我可以把VPN路由直接拆了,找个新型号换上去继续用
现在的问题是,还缺一个本地DNS服务器和流量分发服务器,我希望可以自定义策略,让它灵活使用这俩网关出口,实现我的全家设备自动翻墙。刚才我就一直在谷歌上找,这个CHINADNS看着好像差不多,但貌似只能配合SSH用的嘛?有没有支持双网关的这类东西,就算让我搭建个X86 SERVER也要干,求建议,感谢
所以为什么不直接买ss服务呢,你提到的这些直接靠一个能刷openwrt能装ss的路由器就能实现
近一年被野梯子摔了几次,伤心,所以直接下猛料买了个大牌VPN
openwrt是吧,好,买买买,搭一个研究下
再小声问下,有没有SS商推荐?不方便说可以邮箱
也没有什么推荐的
有什么好办法吗?
https://github.com/shadowsocks/ChinaDNS-Python
我这么运行以后发现dig不到..
无论是在本地dig @127.0.0.1
还是在外部 dig @那台主机的ip
均为..connection timed out; no servers could be reached
netsta -ntpl发现有在监听53...
断开再连也在..
甚至重启了也还在..
跑起来了..那么问题来了..我有办法在保留dnsmasq的功能的前提下开启这个dns服务么..
原本打算对这个问题再写一篇文章,然后最近事情太多就摸了
顺便还想要用DNSmasq来做软路由的攻略...
我按照现在网上大多数的配置文件配置...
DNSmasq --test 倒是通过了..
但是运行的时候:
会报 unknown interface 错误...
看起来跟网卡有关...这是一个双网卡..ubuntu系统的路由开发板..
但是..蛋疼的是..虽然是路由开发板..却没有现成的专门作路由的系统...
openwrt的 Img倒是有..但是不知道是有啥前置条件还是怎么样..烧进Sd卡开不了机..
无奈之下打算用docker跑openwrt..还没成功的跑起来过...
在顺便..linux 的i/o要怎么测...我看这块板子华丽的四个千兆口..两个USB3.0.
但是用dd指令发现1GB平均写入只有20MB/s...和树莓派相当..
这样的话..纵然千兆网卡+USB3.0似乎也不是太有意义?
并不是USB3.0不行,其正常峰值带宽能有3Gbps,跑满千兆局域网不在话下,主要的问题是储存设备……
一般的廉价USB3.0储存设备写入速度在20MB/s是正常的,能上个固态硬盘估计就跑满了
我在Docker里成功的运行了..openWrt..问题是...这个openWrt完全获取不到硬件信息..比如Lan口的状态啥的...
这就超尴尬了....
我这里面插的是闪迪天猫旗舰店上号称..100mb/s的卡呀....前面通过USB 3.0 外接硬盘速度也没有变化...这就很方了..
我电脑直接连硬盘盒可以有100M/s左右的速度...
那这读写速度大概是路由器CPU瓶颈了……
USB2.0完全足够啊....
我怎么感觉我被奸商骗了....还是说其实路由不在意I/O所以也不算是被骗..
我本来买这个是想做家用NAS的..这I/O和树莓派差不多的话..我干嘛不用树莓派去做...
作为参考来说..如果我需要一个I./O性能高一点的路由器...有什么推荐么...
我不拿路由器做这些,我要求是能挂ss就行了
新教程写好了
没啥..我放弃虚拟化直接刷了openWrt..感觉好浪费...
而且半个小时莫名奇妙的重启了两次..不知道为啥..
还是树莓派好使..我打算把这个DNS服务搭到树莓派上去....
那大佬有什么路由器推荐么.....
以及知不知道什么I/O比较强的卡片电脑...不带风扇就行...
最后实在不行了..再看看要不要去踩淘宝上迷你主机的坑..
这个板子..我感觉有点坑..难关看起来这么华丽却没什么销量....
K2P..不知道为啥..淘宝还不给搜..
mi nano 我虽然知道是指小米路由器..但是淘宝上给了个小三千的迷你主机作为结果...
我在想要不要弄个ROS玩玩....
最后你这么一说..我突然又在想..能不能把手机刷成Linux的...
我知道似乎有跑在安卓里的虚拟机...
安卓机貌似只能用Linux on Android……
直接linux装DNSmasq有dhcp还凑合吧
不知道有没有linux上的抓包软件而且是有openwrt版的
无污染是因为定义一种规则使用chnrouter去对用国内dns和国外dns查询得到的结果进行筛选,并且有一个专门的污染ip黑名单列表
很明显,windows server的dns功能并不满足这个要求
至于为什么直接查询国外dns(即使是根域名服务器)会得到被污染的结果,文章里opendns的例子已经讲的很清楚了
如果要用windows搭无污染dns,可以用python版的ChinaDNS
https://github.com/shadowsocks/ChinaDNS-Python
我目前有一台win的小水管用的Pcap_dnsproxy直接打洞向上级DNS (8.8.8.8)请求的解析。
没弄国内DNS但因为支持EDNS貌似解析效果也不错?
查了查说是EDNS能根据客户端ip解决地域解析问题?
实测Edns服务器dig会有一个client subnet负责传递客户端的公网出口IP。这样方便服务器根据客户端的IP来返回解析结果。
我的理解是,打个比方,对于上海的DNS服务器,对北京的用户来说,不开EDNS的话,上游DNS server收到的会是来自上海的查询请求,因此很有可能返回一个上海的CDN节点IP,导致网络性能下降。支持的话就会返回北京的节点。
貌似Edns是一种协议支持然后client subnet是某种可选项?
要实现这个功能貌似要自己的服务器和上游服务器都支持才行。毕竟好奇China DNS有没有提供这个功能。
PS:听说国内DNS号称支持其实支持不完全,不过因为会被污染我没有去试。不过看起来只要打开方式正确,Google其实还是知道正确的解析结果的?
不过 ChinaDNS 支不支持我就不清楚了
那个域名是直接解析过来再301跳转的,因为ssl证书不符所以会提示安全问题,忽略之后可以跳转过来
之前我在ipv6下测试没墙
不过国家也说要推广v6了,不知道今后会怎么搞