同很多学校和企业一样,我们学校用的也是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,加入:

zone "zju.edu.cn." {
	type forward;
	forwarders {
		10.10.0.21;
		10.10.2.53;
	};
};

到此重启named服务

/etc/init.d/named restart

就可以实现完美的解析了。

试验一下

root@zjuicpc-host:~# nslookup facebook.com - 10.10.2.53
Server:		10.10.2.53
Address:	10.10.2.53#53

Non-authoritative answer:
Name:	facebook.com
Address: 203.98.7.65

root@zjuicpc-host:~# nslookup g.zju.edu.cn - 8.8.8.8
Server:		8.8.8.8
Address:	8.8.8.8#53

** server can't find g.zju.edu.cn: NXDOMAIN

root@zjuicpc-host:~# nslookup facebook.com - localhost
Server:		localhost
Address:	127.0.0.1#53

Non-authoritative answer:
Name:	facebook.com
Address: 69.63.189.11
Name:	facebook.com
Address: 69.63.189.16
Name:	facebook.com
Address: 69.63.181.12

root@zjuicpc-host:~# nslookup g.zju.edu.cn - localhost
Server:		localhost
Address:	127.0.0.1#53

Non-authoritative answer:
Name:	g.zju.edu.cn
Address: 10.202.73.20

没有问题以后把修改本本和acm90上的/etc/resolv.conf,在最前面加上一句

nameserver 10.71.101.90

现在就不会在遇到以前那样的麻烦了。不过这个DNS只是对我自己比较有用,对代理用户没什么用。不过对qs们来说,一个好消息是现在直接用acm90上的代理就可以穿墙了 :D 之前90上虽然播了穿墙的VPN,可以ssh -D穿墙,但是DNS一直有问题,现在好了,HTTP代理还是更方便的 :D

13 Responses to “架一个校内墙外应付自如的DNS Server”
  1. dadupi says:

    校外访问zupo,总是被劫持到http://taobao.114so.cn
    手工改dns到8.8.8.8,不行
    手工改hosts文件,屏蔽这个域名,也不行
    求教,该如何办

    • watashi says:

      zupo在校外没有解析,得到NXDOMAIN,然后电信会流氓这个结果
      你用hosts屏蔽是怎么处理的?
      ms前几天看到quark用dnsmasq处理了这个问题

      @Quark_zju
      联通对 NXDOMAIN 都返回一个固定 IP,似乎不太容易把它还原成 NXDOMAIN。访问那个 IP 会接着跳转到 http://nfdnserror5.wo.com.cn ,dnsmasq 可以把域名设成 local 从而实现 NXDOMAIN,于是除了这个再把 360.cn 加上。

      • dadupi says:

        我以前都是按照校网提示的方式设置代理到http://telpry.zju.edu.cn/tel.pac
        但是上周开始不可用了,被劫持到taobao.114so.cn
        奇怪的是,用firefox访问zupo是ok的,可惜zupo上的应用只支持IE,
        我在hosts上把taobao.114so.cn绑定到127.0.0.1,但是没有效果还是打开了114的页面,奇怪哦
        我用8.8.8.8,还是被打开114的页面,这是为啥呢?

        楼主,你说的dnsmasq我不会啊,有简单的方法吗?
        校网支持用vpn联入吗?
        或者我买个国外的vpn,从国外访问进来,这样是不是就不会被劫持了?

      • dadupi says:

        清空IE缓存,问题解决
        看来还不是简单的劫持,这个页面肯定在缓存里面做了什么手脚。。。。

    • watashi says:

      @li_cheng @Quark_zju dnsmasq有个bogus-nxdomain可以把某个ip变成NXDOMAIN

  2. lz says:

    好厉害的样子,from zjut 精弘SA‘s lz
    有空也可以交流交流
    liuzheng712*gmail.com

  3. wuyu says:

    唔,能给个联系方式么

  4. wuyu says:

    是v6隧道。ping出来是v6的地址。可怎么解析出来的ip地址,莫非是学校dns服务器也能支持v6(部分),因为Google系,射手网,AnimeNfo等等显然会跳到v4的外网登录页。

  5. wuyu says:

    改了hosts半夜用Google搜相关话题居然发现这个个人网站,内网居然能上。。。。让我想起了以前踩过的几个学长大神的blog~~~~敢问是哪个大大??求认识哈。。。…(^-^) wuyumylove@gmail.com

  6. Mike says:

    dnsmasq不是更简单?

  7.  
Leave a Reply