Total Pageviews

Tuesday, 13 November 2012

使用 z-dns 建立 DNS 代理服务

z-dns 的运行需要具备Python环境,项目主页:
http://code.google.com/p/z-dns/

下载:http://code.google.com/p/z-dns/downloads/list

z.DNS是一个本地DNS代理,支持带通配符的hosts,可以根据域名选择DNS服务器分开解析,解决使用境外DNS服务器是解析国内双线服务器结果不准确的问题
不能用来防止DNS污染的,但是带通配符的HOSTS很好用,我现在用GAE、上Google+都是用这个了
目前只支持A查询。。。。其他查询都是直接转发,不做处理的
运行环境 python 2.5或更高 推荐2.6.
2012/2/15 更新 beta3
其实这个beta3 是我这3个月来自己边用边改修改出来的,发现什么bug就改下,现在我自己用基本没神问题了
再就是 估计python版的就更新到这了 接着再写就开始用c++了
更新:
增加TCP53端口监听并转发,解决某些解析在UPD下被截断的问题,但只是转发,没做处理,UPD下的请求还是走UDP 还是不能防污染
修改了UPD下DNS查询的方法,尽量减少查询超时
也许还有一些别的修改,,,但是记不起来了额。
2011/11/04 更新 beta2
更新:
优化代码,提高效率,去掉了cache
另外建立一个线程监视配置文件变化,能自动重载配置&hosts
添加一个setup.bat脚本,生成自启动用的vbs脚本
我看书真不认真,今天又看Dive.Into.Python的时候看见一句”Tuple 比 list 操作速度快。如果您定义了一个值的常量集,并且唯一要用它做的是不断地遍历它,请使用 tuple 代替 list”
回 头看自己写的代码,遍历的部分全是list,唉~改完后程序的效率高了很多,用chrome尝试一次打开一个书签栏里的15个页面,没有出现DNS解析失 败等现象,这个脚本的CPU占用峰值在30左右,只了持续2秒(我笔记本CPU是赛扬M 1.6GHZ的,老的掉牙,很想把这破本换掉!!!!!!!)
还有,以前那个版本里cache是用的字典数据类型,效率太低了,win本来就自带有DNS Clinet服务,就是个本地DNS缓存,python脚本再怎么写也不会比DNS Clinet效率高吧?就把cache部分删了
上个版本,每次改完hosts或配置文件,都要结束掉这个脚本再重启,让配置生效,很烦,就建一个线程监视着几个配置文件,每60s对比一次文件的修改时间,跟上次检查时不一致就重载配置文件,经测试,就算是0.1s一对比,CPU占用也在1一下。。。顺便感谢http://hi.baidu.com/javalang/blog/item/61790b3b8e5ce7ed14cecbb7.html
又写了个批处理,用来自动生成vbs脚本,放到启动文件夹里就能开机后台自启动,并自动设置这个脚本有较高的优先级,防止CPU被100占用的时候DNS解析失败(比如我这单核破本上玩wow的时候,脚本和WOW有同样优先级时候,DNS解析失败很严重)
PS:发现这个小脚本现在应该是只有我自己在用了,根本没下载量。。。。�~
#########################分割线################################
z.DNS是我考研复习看见英语就无聊蛋疼郁闷时为解闷写的一个小程序 参考:http://marlonyao.iteye.com/blog/1032552
主要功能是用来解决在使用境外DNS解析国内双线域名时经常给电信用户返回个联通,联通返回电信导致访问国内网站慢的问题
并且可以支持带星号、问号通配符的hosts
刚回翻墙的时候,开始用GoogleDNS,可是就像上面说的,打开有些国内站,一个字:慢,很气人,所以很久以前就像写类似这种功能的小软(- -”)了,当时是想用MFC写个图形界面的,汗啊,在VC下网络编程真JB痛苦,然后就一再放弃就扔那里了
前几天偶然看见http://marlonyao.iteye.com/blog/1032552 这篇文章,marlonyao说他写的只有不到200行代码,就想着看看吧 以前没接触过python,就看http://woodpecker.org.cn/diveintopython/ 的汉化教程,看了前5章,搜索DNS报文结构,开始啃代码,然后差不多看懂流程了,就开始自己code,前后总共用了不到3个下午,看来python还真是好入门….IDE用的eclipse+pydev,以前学过JAVA,感觉用着eclipse还挺顺当
marlonyao写的DNS代理,说是支持通配符,可是只能是星号打头的可以,如果是在中间,比如ad..youku.com,就不行了,?号也不能用 写z.DNS的时候用了fnmatch模块做通配符匹配,随便放在那里都可以
z.DNS的缺点是,不支持IPV6,他用到socket.inet_pton函数来转换IPV6地址点分形式到整数形式,在win环境下python里没socket.inet_pton函数,我就郁闷了,算了,就不支持IPV6了,反正我目前不用
我使用的是python2.6.6 没用什么新函数 应该2.X都可以跑起来
文件说明: dns.conf 存放境内外DNS的文件 dns.hosts 存放hosts dns.switch 存放区分境内境外域名的列表 更详细的请见文件内注释
PS:z.DNS 目前只是实现了选择DNS服务器和带通配符的hosts功能,还不能解决DNS污染等问题,所以不能作为翻墙工具来用的,计划考完研,再添加通过GAE和 SSH远程DNS解析和本地自动判断DNS污染(这个貌似已经有人做出来了)的功能,原理都很简单,就是现在懒的再code了