xdns,将DNS请求处理下发送出去,防止DNS污染,测试可以访问facebook

2013-04-06 18:10:33 +08:00
 isayme
不知各位大牛有没有兴趣~

原理很简单:
1、本地机器的DNS服务器设为127.0.0.1;
2、本地运行xdns,将本机的DNS请求包数据每个字节取反发送到墙外的xdns;
3、墙外的xdns将包再次取反数据包后向8.8.8.8之类的DNS以请求报文,将收到的结果取反然后返回给本地的xdns;
4、本地的xdns再次将数据包取反后返回给最原始的请求者。

经测试 https://www.facebook.com 可以正常访问!
Twitter无法访问,我看过结果,返回的twitter服务器IP直接被封了。。。
G+和google主站貌似也无压力~

详情可以参见我的项目:https://github.com/isayme/xdns
7170 次点击
所在节点    DNS
20 条回复
adspe
2013-04-06 18:13:23 +08:00
好主意。
isayme
2013-04-06 19:03:10 +08:00
@adspe 哈哈~ 多谢支持
jasontse
2013-04-06 19:31:07 +08:00
为什么要在墙外搭建xdns这个门槛呢?用tcp请求8.8.8.8有什么缺点吗?
AstroProfundis
2013-04-06 19:35:40 +08:00
@jasontse +1

在墙外完成解析会造成使用了CDN的网站十分悲剧
isayme
2013-04-06 19:37:21 +08:00
@jasontse GFW可以监听到你与8.8.8.8的通信数据包,然后可以伪造数据包发给你,同样可以污染你。只是一般机器的DNS都是UDP报文,GFW可能现在只会污染UDP查询,没有处理TCP的DNS查询~
isayme
2013-04-06 19:39:49 +08:00
@AstroProfundis 这个。。。我不懂CDN,难道墙外和墙内与8.8.8.8通信有什么不同么?
jasontse
2013-04-06 19:44:50 +08:00
@isayme 过dns污染是简单的科学上网方法 不用在意窃听
tcp确实不会污染
AstroProfundis
2013-04-06 19:54:54 +08:00
@isayme 唔...怎么说呢,很多CDN都是基于DNS查询时客户端所在的地理位置(一般应该是用来源IP判断,细节没有研究过)来返回相应地区最快的一个/一组IP的,比如你在天朝和在欧洲查询 google.com 出来的就不是同一个IP段的地址,再比如 iTunes 的下载加速也是基于类似的原理。

所以从境外发起查询,对应 xdns 的话就是从公共 DNS 服务器看来实际的查询是由 xdns 的服务端所在IP发起的,所以返回的IP是对于服务器来说最好的,而很多情况下这个IP对天朝用户来说就是个杯具...
另一方面,使用的公共 DNS 在海外的话,这台服务器本身缓存的IP数据就是上游(网站自己的服务器)经过优化过后最适合该地区的IP, 同理,美帝访问最快的节点从天朝过去的效果应该不难理解...

当然,可以通过选择中国附近,比如香港、台湾、日本等地的公共 DNS 服务器作为上游来一定程度改善这个问题,但是效果比起直接用本地 ISP 的服务器还是有一定差距,所以我感觉只是出于规避污染这一个目的的话,用 TCP 查询的效果应该是最好的,就像楼主之前也说到了的,因为用 TCP 的比例很小,基本也不用担心被干扰。(另外有个问题有疑惑,印象中 TCP 貌似是有验证的,真的可以像 UDP 那样简单的污染吗?)
isayme
2013-04-06 20:14:26 +08:00
@jasontse 可能目前没有做TCP的污染吧~ 毕竟TCP的包也是可以伪造的

@AstroProfundis 多谢科普CDN~ TCP有个握手包,但说到底还是简单的数据包,握手是为了验证确保对方在线(UDP是直接发包,不管对方在不在),所以GFW完全可以在你握手之后的TCP数据请求包之后给你回一个符合TCP协议头的报文,甚至可以直接回你一个FIN包,结束这次TCP通信。
jasontse
2013-04-06 20:15:51 +08:00
@AstroProfundis tcp污染我目前只想到一种方法 就是nat转发到另一台服务器 挺暴力的
AstroProfundis
2013-04-06 20:19:41 +08:00
@isayme 嗯嗯,了解了,不过目前看来墙应该没有那么高兴致去对付小众的东西,至少目前 TCP 查询是不会被污染的;另外在53以外端口的 UDP 查询也不会被污染

@jasontse 对,我也只能想到这个,真要这样干还是有点蛋疼...
jasontse
2013-04-06 20:30:17 +08:00
@AstroProfundis nat有一个致命的缺点它会暴露后面递归服务器的IP地址 从域名的ns服务器上就可以查到:-)
isayme
2013-04-06 20:36:01 +08:00
@AstroProfundis 貌似还真可以直接改个端口就行。。。。虽然是同样的报文,但是估计GFW没有那么智能,对DNS它只会管53端口的。。
isayme
2013-04-07 07:20:17 +08:00
@AstroProfundis 又想了下,如果用53以外的端口,那么本地的服务端和墙外的服务端就要开不同的监听端口(如开54端口,那么本地还是53,对外连54,而墙外的开54端口,对外连53端口),这样反而会导致配置项多。
fqrouter2
2013-04-07 10:43:30 +08:00
我在此文 (http://fqrouter.tumblr.com/fqrouter) 中详细描述了DNS的问题
非标准端口: 工作正常
DNS over TCP: 只是一般不屑于封你, dig +tcp @8.8.8.8 dl.dropbox.com 你试试看
丢弃错误的应答: 工作正常
AstroProfundis
2013-04-07 11:17:07 +08:00
@isayme 本地没必要开服务端啊...不是只有服务器才需要监听端口么... 你试试 dig twitter.com @ns-us-1.wobu.se -p 233
powerfj
2013-04-07 14:36:06 +08:00
哥用nodejs做了一个dnsproxy+socket5proxy,proxy里面设置哪些域名被墙了,如果被墙的域名都到外面获取dns或者做socket5请求,facebook,twitter还有youtube都没问题..不敢多用,怕被封..
isayme
2013-04-07 19:04:14 +08:00
@fqrouter2
@powerfj 两位大牛 膜拜!
code4craft
2013-05-31 19:56:33 +08:00
gfw的DNS污染只是旁路一条错误结果,自己本地用个程序筛掉就行了,没有必要在墙外建DNS跳板的(至少在我这里的网络是这样),我写过一个本地DNS服务器做这个事:
github:https://github.com/code4craft/blackhole Java写的,主要代码在antipollution包里
博客:http://my.oschina.net/flashsword/blog/110276
isayme
2013-06-01 08:31:52 +08:00
@code4craft 哈哈 有个人和我说西厢计划第三季也是类似的方法,你们的方法更有针对性~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/65092

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX