BlackHoleJ

BlackHole开发日记--使用hostd为移动设备切换域名

不羁的心 提交于 2019-12-09 20:08:49
lz的有个朋友最近在做移动开发,聊到移动设备上要切换开发和线上环境比较麻烦。在PC上我们一般修改hosts,但是在移动设备上修改hosts不太方便(需要ROOT、越狱等,修改起来也不方便)。因为之前做过一个DNS服务器BlackHoleJ,所以就萌生了做一个手机改hosts的想法。 最终方案是在PC上启动一个DNS服务器和一个Web服务器。DNS服务器维护一个对应IP的域名配置表,Web服务供移动设备访问,可以修改和管理域名,修改后Web服务器获取客户端的IP,并通知DNS服务器,更新对于这个IP的域名配置。因为BlackHoleJ也有支持企业内网的案例,所以企业内网部署一次,多个终端都可使用。 前前后后折腾了一个月,于是就诞生了 Hostd 。 使用Hostd,需要做几件事: 在你的内网部署一个Hostd,包括DNS服务器和Web服务器(点这里 查看教程 ),推荐使用有固定IP的机器部署,这样客户端就不用频繁修改了!这里还建议为这台机器分配一个好记的域名,例如: hostd.us,修改/usr/local/blackhole/conf/zones即可进行域名配置。 将要使用Hostd的终端设备的DNS服务器地址修改为Hostd所在IP,如果你是网管,当然可以直接配置DHCP,这样用户就不用手动配置了! 打开你终端设备的浏览器,访问http:// hostd.us

BlackHole开发日记-设置多个外部DNS并选择

六月ゝ 毕业季﹏ 提交于 2019-12-09 19:58:15
####2012-12-22 今天做了一天家务,周末比上班还忙啊。晚上9点半开始写了点代码,想把外部DNS选择机制改为:最短请求时间。 晚上从9点开始写代码,终于到12点写完了。开始尝试用TreeMap做一个按照响应时间自排序的数据结构,类似redis的SortedSet。后来发现:如果尝试改变TreeMap的key值,TreeMap并不会重新排序,到后面就会出现无法预知的结果了!还有一个办法就是写一个incrScore的函数,并且限定score为double类型,但是这时score就没法用自定义类型了,也不是很好用。 所以最后干脆在弹出时做了一个筛选,每次选出所有元素,并做一个筛选。后来这个算法就能正常运行了。 ####2012-12-23 今天下午写了一点代码,尝试把超时跟平均响应时间分开了,分为正常响应时间、次数和超时次数。如何才能做到多个服务器可用性的判断?这个问题有很多种方案,希望找到一个可行有效的方案。 这又涉及到业务的东西了。上班写一堆业务,下班不想写业务啊写业务。想做一个使用Selector,多个DNS服务器同时forward,使用最快的结果作为响应。但是后来测试,用途不大。 自己在这里研究这些意义不大,这应该是一个很common的问题。晚上研究一下load balance和failover的东西。 感觉这几天写的load balance的东西都太不成熟

BlackHole开发日记-jar包内文件的访问

你离开我真会死。 提交于 2019-12-09 19:56:16
####2012-12-27 今天将Mac下DNS设置的模块完成了,于是着手做一个单机服务器吧!将项目拆开成了两个目录,server和localserver。 另外解决了一个很初级的Spring配置的问题,如果要引入jar包中的配置,需要在classpath后面加上' ',例如: classpath*:/spring/applicationContext .xml 后来又遇到一个问题:想要把shell脚本打入jar包,但是发现即使获取到了jar包中shell脚本的路径(xxx.jar!/xx/ss这样的路径),也无法使用外部程序调用这个文件! ####2012-12-28 怎么执行jar包内的shell脚本?这是个有趣的话题。后来尝试使用getResourceAsStream读取出文件,然后再写到临时文件夹,然后访问…好吧,问题解决。 后来完善了localserver的设计。考虑到项目已经有4个模块了,就引入了maven聚合来完成编译,将xml中module的路径配置一下就可以了。 顺便提一下,maven-jar-plugin也挺好用的,可以将META-INF写入jar包。例如,下面设置依赖路径和执行的Main类: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin<

BlackHole开发日记-负载均衡,DNS切换

早过忘川 提交于 2019-12-09 19:53:58
####2012-12-24 今天写的不能叫开发日记了,主要是学习,主要想要学习一些load balance的东西。 看了LVS社区的一些东西,系统涉及的目标:透明性、可伸缩性、高可用性和易管理性,跟我想的还不太一样。 VIP技术:无缝的单点切换。 这里看了一篇章文嵩博士自己发表的 LVS集群系统网络核心原理分析 ,其中转发的原理有三种模式,可以理解为都是修改IP包内容,然后使用户与Real Server实现通信,看上去就像直接和Load Balancer通信一样。 调度算法才是我想研究的重点,LVS实现了八中负载均衡调度算法,总结下来分为三种策略: 轮循调度(Round-Robin),最小连接数和哈希。 ####2012-12-25 今天想了想,如果把BlackHole作为一个拦截工具的话,一直开启DNS服务器也不合适,所以就想写一个模块,在启动时修改OS的DNS配置,关闭时再把DNS配置切换回去,看看是不是可行?这个工具我另建了一个项目叫 dnstools 。实现了一些windows下的DNS切换,用的是Java外部调用系统命令,目前测试可行,但是系统兼容度就未知了,先做做看吧。 来源: oschina 链接: https://my.oschina.net/u/190591/blog/98213

BlackHole开发日记-几种缓存方式性能测试

依然范特西╮ 提交于 2019-12-09 14:24:48
早上做了ehcache的benchmark,set和get一个40k的字符串(压缩到19k)到ehcache。10000次set和get操作,每次都使用不同的key。 ehcache的测试结果(10000次): <table> <tr> <td width="100">Operation</td> <td width="100">Total(ms)</td> <td>Average(ms)</td> </tr> <tr> <td>set</td> <td>34</td> <td>0.0034</td> </tr> <tr> <td>get</td> <td>6</td> <td>0.00065</td> </tr> </table> 结果相当令人满意。 作为对比,使用JDK提供的简单Cache类型WeakHashMap做一个测试(10000次): <table> <tr> <td width="100">Operation</td> <td width="100">Total(ms)</td> <td>Average(ms)</td> </tr> <tr> <td>set</td> <td>4</td> <td>4e-4</td> </tr> <tr> <td>get</td> <td>5</td> <td>5e-4</td> </tr> </table> 可以看到

BlackHole开发日记-尝试引入缓存,出现问题

牧云@^-^@ 提交于 2019-12-09 14:23:17
今天在公司公开了这个项目,得到大家的肯定,坚定了把这个项目做下去的决心。 下午公司项目codereview,被指出很多问题。虽然自己在代码可扩展性上做了不少努力,但是大家都反应可读性不那么好。决定以后改进风格。这个决定也体现在BlackHole上,因为一开始就想用英文写代码注释,所以多看看JavaDoc也是很有必要的!锻炼下英文吧,感觉这也是开源的必经之路。 晚上回家时间不多,尝试着将ehcache引入,结果效果让人大跌眼镜,qps直接降到3000。不知道ehcache做了什么事,感觉额外的东西太多。 但是缓存依然是需要的,得日后调研了,或许自己写一个。 开始构思的是缓存外部DNS的UDP包内容,后来发现Message.getHeader()存在一个ID,如果该ID不符,则可能导致不正确的结果。queryperf中出现了很多这样的错误: Warning: Received a response with an unexpected (maybe timed out) id: 3 看来详细研究一下DNS是非常有必要的。 晚上开始记录开发日志。这才是货真价实的“每天进步一点!”。 来源: oschina 链接: https://my.oschina.net/u/190591/blog/96887

BlackHole开发日记-2012-12-16

五迷三道 提交于 2019-12-09 14:21:39
使用BIND的压力测试工具queryperf做了benchmark。 第一次测试结果不尽人意,拦截模式qps为6000,转发模式只有3000,而BIND有36000。 后来想到会不会是log的原因?因为到了大于10000qps的时候,IO操作耗时就显得很重要了。于是关掉log重试,结果提升明显,拦截模式qps达到16000,转发模式为8000。 BIND是采用C写的,难道Java比C有天生的劣势?忽然想到HotSpot虚拟机都是运行一段时间会变快的,于是尝试多次测试,发现拦截模式qps达到30000。看来Java在工作时间变长之后,性能劣势就并非那么明显了。 benchmark的优秀滋生了将BlackHole做成一个通用DNS服务器的野心。这是一个很宏伟的目标,涉及到DNS协议完全分析、缓存机制、UDP协议分析等。是个很有前途的目标,come on! 来源: oschina 链接: https://my.oschina.net/u/190591/blog/96886

BlackHole开发日志--防止DNS污染

时光毁灭记忆、已成空白 提交于 2019-12-09 13:53:53
DNS污染原理 DNS污染是比DNS劫持更加难以防御的一种攻击,受攻击者访问网站时可被导向其他域名,例如某“不存在的网站”被导向了一个“不存在的IP地址”。 DNS污染的原理如下: DNS查询也是一个经典的请求-回答模式。首先,客户端发起DNS查询,这是一个UDP包。路由器在转发IP包时,对其内容做解析,若发现其是使用53端口的UDP包,并且其内容符合某些特征(普通的DNS请求都是明文),则从旁路直接返回一个伪造的应答,将其应答指向某个特定IP。因为这个返回速度非常快,所以先于正常请求到达客户端。而客户端收到一个返回包,就认为得到了答案,不再继续接收,而正确的请求结果就被忽略了! 一般防止DNS污染有几种方法: 修改系统hosts文件 系统的hosts文件可以配置某个域名对于的IP地址,并且会优先于DNS服务器的响应,所以此方法稳定高效,缺点是host地址需要不断更新。 改用TCP协议而不是DNS协议发送DNS请求 DNS也支持TCP协议传输,而TCP协议没有收到污染,所以可以改用TCP作为DNS下层协议。缺点是TCP速度慢,并且DNS服务器支持度有限。代表工具:Tcp-DNS-proxy https://github.com/henices/Tcp-DNS-proxy 使用IPv6地址发送DNS请求 某些站点可以通过IPv6地址访问。代表工具:dnsproxycn http:/

BlackHole开发日记-Java守护进程、Signal处理

不打扰是莪最后的温柔 提交于 2019-12-09 13:53:40
####2012-12-30 今天继续写单机版BlackHole。碰到一个问题,想要将程序作为系统进程,后台运行,并且在shell关闭时不退出,有两种办法:一种是使用nohup,一种是使用Deamon程序的开发方式来写Java,并引入很多框架,例如Apache Commons Daemon。后者觉得太重了,但是前者无法在控制台输出一些错误信息,也不够友好。最后用了一个很粗暴的方法:将错误输出重定向到一个文件,shell脚本退出的时候打印出来!赢了! 后来使用package maker做了一个安装包,比想象中好用,支持shell脚本什么的。 遇到一个问题,在mac下设置两个DNS,BlackHole为主DNS,结果仍然无法保证每次都使用BlackHole进行解析。后来索性改成只有一个DNS,127.0.0.1,倒是正常工作了。 这个单机版本我取名叫hostd,大概是hosts取代者的意思吧。因为要保证程序即使被kill之后也能做出一些释放资源的操作(在hostd里,需要把修改过的DNS改回来),所以给wifesays增加了一个响应,用了Java里一个响应信号量的api。 import sun.misc.Signal; import sun.misc.SignalHandler; Signal.handle(new Signal("TERM"), new SignalHandler()

BlackHole开发日志-尝试基于Android的DNS服务器

隐身守侯 提交于 2019-12-09 13:34:51
####2013-1-2 今天白天出门了,晚上把 Android公开课 看了两集。虽然这个课程是比较浅,不过详略还算得当,总得来说还算是不错的,而且只有3个小时,博主对这种速成式的比较感兴趣。后来浏览了几个国内的视频,大多数都是面向零基础的,而且面面俱到,讲的比较慢。因为自己也没打算把这个当正业,加上也有些Java和Swing的基础,了解下大概就可以先试试开发了吧。 ####2013-1-3 hostd for Android项目正式启动!目标是在Android下动态修改域名绑定,不需要修改hosts,不需要修改DNS服务器,也不需要重新切换APN,以用于开发环境和线上环境的快速切换。 因为博主是个猴急的开发者,秉承快速原型的的原则,今天开始了一些开发的尝试。 因为DNS服务器BlackHole要使用系统端口53,所以首先要确认其在Android上是否能够运行。部署服务艰难重重,记录如下: 第一次: 新建一个helloworld Android项目,在buildPath里加入依赖jar包,然后在MainActivity.onCreate()直接启动DNS服务器。尝试第一次,不成功: 解决:使用adb logcat查看,发现产生了NoClassDefinedError,检查APK包,发现依赖jar没有打进去。再次检查buildPath,在"Order and Export