V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
isayme
V2EX  ›  DNS

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

  •  
  •   isayme · 2013-04-06 18:10:33 +08:00 · 7004 次点击
    这是一个创建于 4049 天前的主题,其中的信息可能已经有所发展或是发生改变。
    不知各位大牛有没有兴趣~

    原理很简单:
    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
    20 条回复    1970-01-01 08:00:00 +08:00
    adspe
        1
    adspe  
       2013-04-06 18:13:23 +08:00
    好主意。
    isayme
        2
    isayme  
    OP
       2013-04-06 19:03:10 +08:00
    @adspe 哈哈~ 多谢支持
    jasontse
        3
    jasontse  
       2013-04-06 19:31:07 +08:00 via iPad
    为什么要在墙外搭建xdns这个门槛呢?用tcp请求8.8.8.8有什么缺点吗?
    AstroProfundis
        4
    AstroProfundis  
       2013-04-06 19:35:40 +08:00
    @jasontse +1

    在墙外完成解析会造成使用了CDN的网站十分悲剧
    isayme
        5
    isayme  
    OP
       2013-04-06 19:37:21 +08:00
    @jasontse GFW可以监听到你与8.8.8.8的通信数据包,然后可以伪造数据包发给你,同样可以污染你。只是一般机器的DNS都是UDP报文,GFW可能现在只会污染UDP查询,没有处理TCP的DNS查询~
    isayme
        6
    isayme  
    OP
       2013-04-06 19:39:49 +08:00
    @AstroProfundis 这个。。。我不懂CDN,难道墙外和墙内与8.8.8.8通信有什么不同么?
    jasontse
        7
    jasontse  
       2013-04-06 19:44:50 +08:00 via iPad
    @isayme 过dns污染是简单的科学上网方法 不用在意窃听
    tcp确实不会污染
    AstroProfundis
        8
    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
        9
    isayme  
    OP
       2013-04-06 20:14:26 +08:00
    @jasontse 可能目前没有做TCP的污染吧~ 毕竟TCP的包也是可以伪造的

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

    @jasontse 对,我也只能想到这个,真要这样干还是有点蛋疼...
    jasontse
        12
    jasontse  
       2013-04-06 20:30:17 +08:00 via iPad
    @AstroProfundis nat有一个致命的缺点它会暴露后面递归服务器的IP地址 从域名的ns服务器上就可以查到:-)
    isayme
        13
    isayme  
    OP
       2013-04-06 20:36:01 +08:00
    @AstroProfundis 貌似还真可以直接改个端口就行。。。。虽然是同样的报文,但是估计GFW没有那么智能,对DNS它只会管53端口的。。
    isayme
        14
    isayme  
    OP
       2013-04-07 07:20:17 +08:00
    @AstroProfundis 又想了下,如果用53以外的端口,那么本地的服务端和墙外的服务端就要开不同的监听端口(如开54端口,那么本地还是53,对外连54,而墙外的开54端口,对外连53端口),这样反而会导致配置项多。
    fqrouter2
        15
    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
        16
    AstroProfundis  
       2013-04-07 11:17:07 +08:00
    @isayme 本地没必要开服务端啊...不是只有服务器才需要监听端口么... 你试试 dig twitter.com @ns-us-1.wobu.se -p 233
    powerfj
        17
    powerfj  
       2013-04-07 14:36:06 +08:00
    哥用nodejs做了一个dnsproxy+socket5proxy,proxy里面设置哪些域名被墙了,如果被墙的域名都到外面获取dns或者做socket5请求,facebook,twitter还有youtube都没问题..不敢多用,怕被封..
    isayme
        18
    isayme  
    OP
       2013-04-07 19:04:14 +08:00
    @fqrouter2
    @powerfj 两位大牛 膜拜!
    code4craft
        19
    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
        20
    isayme  
    OP
       2013-06-01 08:31:52 +08:00
    @code4craft 哈哈 有个人和我说西厢计划第三季也是类似的方法,你们的方法更有针对性~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3276 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 83ms · UTC 13:26 · PVG 21:26 · LAX 06:26 · JFK 09:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.