Posts Tagged “linux”

之前为了穿墙和正常访问校园网两不误而在90上架了个DNS。昨天facebook hackercup里穿墙的90代理也是给力的,不过facebook就不怎么给力了 ╮(╯▽╰)╭ 扯远了,虽然不是最初的动机,不过即然架设好了DNS Server就会自然而然的想折腾一下,提供一些内部用的短域名。比如直接将zoj, nhd, icpc, printer解析成ZOJ, NexusHD, ZJU ICPC-HOST和218打印机的IP。不过为了省事,最后是改用了一个自己yy的.acm的根域名,只要简单修改bind9的配置文件,在/etc/named.conf.local中新加一个zone:

zone "acm." {
	type master;
	file "/etc/bind/acm.zone";
};

并且新建一个文件/etc/bind/acm.zone内容如下:

$TTL	604800
@	IN	SOA	acm. root.acm. (
			      1		; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			 604800 )	; Negative Cache TTL
;
@	IN	NS	acm.
@	IN	A	10.71.101.90
9	IN	A	10.71.101.9
;; ...
70	IN	A	10.71.101.70
90	IN	A	10.71.101.90
90	IN	AAAA	2001:da8:e000:90:0:5efe:10.71.101.90
192	IN	A	10.71.101.192
zoj	IN	CNAME	acm.zju.edu.cn.
watashi	IN	CNAME	watashi.ws.

A记录对应ipv4,AAAA记录对应ipv6,CNAME记录对应别名。于是都可以如法炮制,其中特殊符号@代表current origin,也就是没有任何.的acm,而zoj对应的是zoj.acm,并会转到acm.zju.edu.cn上。注意最后有一个点,和url中的/类似,如果以.结尾表示是绝对的,而不以.结尾的则是相对的。

当然也可以邪恶一把,比如修改并加入两个zone,并加入下面的zone file:

$TTL	604800
$ORIGIN	shouji.360.cn.
@	IN	SOA	shouji.360.cn. root.shouji.360.cn. (
			      1		; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			 604800 )	; Negative Cache TTL
;
@	IN	NS	shouji.360.cn.
shouji.360.cn.	IN	A	250.250.250.250

$TTL	604800
$ORIGIN	mail.139.com.
@	IN	SOA	mail.139.com. root.mail.139.com. (
			      1		; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			 604800 )	; Negative Cache TTL

@	IN	NS	mail.139.com.
mail.139.com.	IN	A	209.85.227.17	; mail.google.com
mail.139.com.	IN	A	119.147.15.56	; mail.qq;com

前面做的事情就是流氓了一把360,把shouji.360.cn解析到了不存在的IP 250.250.250.250,于是访问将会得到诸如Connection Timeout(连接超时)的错误。不知道生活在天朝的同学们是不是对此似曾相识呢 (  ̄ー ̄) 第二个就要更流氓了,如果你访问mail.139.com,那么实际可能随机访问到gmail或者qq邮箱,这也是个做负载均衡的例子,嘛,我只是建议别用139邮箱啦 >▽< 你懂的。

然后猛犸同学给了个不错的建议,就是利用这个DNS,能不能做到在地址栏里输入zoj2011之类的题号的时候就直接跳转对应题目的页面上去。当然DNS直接是做不了这个事的,DNS联系的是domain和ip address这两样东西,和http都八杆子打不着,而题目页面还是一个具体的url的http请求。不过仔细想一想其实分两步做就很简单了,简单来说就是泛域名+根据HOST重定向。所谓泛域名其实就是

Comments 4 Comments »

同很多学校和企业一样,我们学校用的也是A类私有地址(10.0.0.0/8),并且有自己的DNS服务器(10.10.0.21, 10.10.2.53)。诸如.zju.edu.cn的域名要么只能在内部使用,要么是双重域名。比如用校内的DNS解析acm.zju.edu.cn的结果是10.10.2.252,解析zupo.zju.edu.cn的结果是10.10.2.23。但如果换用google提供的DNS服务8.8.8.8的话,zoj得到的是公网地址210.32.0.220,而zupo则是没有结果(** server can’t find zupo.zju.edu.cn: NXDOMAIN)。这样就能保证内网外网都能用同一个域名访问ZOJ,但同时也意味着如果不使用校内的DNS,那么将有很多内网无法访问。

对与内网用户而言,用内网的DNS无疑是方便的,然而现实却不那么完美。托功夫网的福,域名劫持和DNS污染导致我们对敏感词不能得到正确的IP,即使你能穿墙,如果解析不到正确的IP也是徒劳,代理用户可以选择在远程执行DNS查询。而我是VPN用户,自然的选择是使用VPN主机的DNS,这样不但能避开功夫网的AOE,而且对于多线的网站,通常也能解析到更顺畅的IP。

不过使用外网的DNS,却又把.zju.edu.cn不能解析的问题引了回来。之前的做法是修改/etc/hosts,host被用于hostname查找,比DNS优先级高,许多穿墙教程里通过修改host避开DNS污染。不过我反过来用,把.zju.edu.cn的域名都加入host,结果水寒mm给我的host文件有近600行。悲剧的是,一、这不是完整的;二、学校服务器IP的变更似乎比想像中要频繁得多;三、新的域名不断冒出来,虽然不常有,但总会遇到要上或被上的时候。遇到host解析不了或解析不对的时候,只好人肉nslookup一下,然后还得重启ff……

所以用/etc/hosts也不是一个办法,于是打算自己架一个DNS服务器,对.zju.edu.cn的域名,返回校内DNS解析的结果,对其它的域名,返回8.8.8.8的结果。事实上非常简单就在集训队的公用服务器acm90上架好了。首先安装bind9:

apt-get install bind9 bind9-doc

然后修改默认选项/etc/bind/named.conf.options,加入:

forwarders {
	8.8.8.8;
};

allow-query { any; };
allow-query-cache { any; };
allow-recursion { any; };

文档里不建议allow-query-cache和allow-recursion设为any,似乎容易被DDOS,我是不指望有人会有兴趣来DDOS acm90啦。最后修改/etc/bind/named.conf.local,加入:

Comments 13 Comments »

蛋疼写了段代码播放东方系列wave格式的背景音乐。随便拿个工具打开thbgm.dat就会发现前四个byte都是ZWAV,这应该是神主自己创造的魔数了。然后后面就全都是正常人理解不能的二进制数据了。其实这些都是pcm格式的音频,可以理解为就是wave格式砍掉了包含音频参数等信息的头。thbgm.dat里音频是16bit, 44.1kHz的立体声。游戏中播放时,每首bgm的播放第一遍都由开始位置播到结束位置,此后就重复播放不含前奏的循环部分。如果要提取wave格式音频只要根据每个bgm的开始位置,前奏长度,循环长度,就可以导出数据并补上头信息写入.wav文件。不过这里的方法不提取音频而是通过api设置音频参数,直接播放pcm格式音频。至于优点,除了省点硬盘外想不到第二个了,所以说了是蛋疼了么……

PS: *nix里everything is file的哲学真是美啊。

ZWAV Player Demo(Windows)

测试环境: Win7 + VS2010

Comments 3 Comments »