由于你懂得的原因,需要用到非标准端口的DNS服务器,也就是非53端口的DNS服务器,并且支持TCP查询,以前是使用opendns的服务器,但是因为anycast,在配置透明梯子的时候,使用它解析墙外地址时,它会根据请求地返回离请求地近的结果,比如查询google的IP,如果只是用opendns的TCP查询的话,也能返回正确的结果,但是是返回距离你本地最近的服务器的IP,这样当你用代理连接的时候先是连到墙外的地址,然后由墙外的地址再返回来访问墙内的地址,这样绕一圈会很慢。

一种解决办法是通过加密通道直接查询DNS,如s-tunnel直接转发DNS请求到远程服务器,再一种就是直接在墙外的VPS上架一个非标准端口的支持TCP查询的DNS服务器,像opendns那样,不过没有anycast,使用dnsmasq架设很简单,只需要两条配置:

resolv-file=/etc/resolv.conf.own  
port=5353

其中resolv.conf.own里面可以填上墙外的DNS服务器,如

nameserver 8.8.8.8  
nameserver 8.8.4.4  
nameserver 4.2.2.1  
nameserver 4.2.2.2

然后 service dnsmasq restart 启动dns服务器,使用

1
dig @127.0.0.1 -p 5353 www.youtube.com

来验证一下,当然之前你需要先安装dig工具

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
yum install bind-utils.
; <<>DiG 9.8.2rc1-RedHat-9.8.2-0.23.rc1.el6_5.1 <<>@127.0.0.1 -p 5353 www.youtube.com  
; (1 server found)  
;; global options: +cmd  
;; Got answer:  
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53784  
;; flags: qr rd ra; QUERY: 1, ANSWER: 12, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:  
;www.youtube.com. IN A

;; ANSWER SECTION:  
www.youtube.com. 19167 IN CNAME youtube-ui.l.google.com.  
youtube-ui.l.google.com. 229 IN A 74.125.224.98  
youtube-ui.l.google.com. 229 IN A 74.125.224.96  
youtube-ui.l.google.com. 229 IN A 74.125.224.101  
youtube-ui.l.google.com. 229 IN A 74.125.224.110  
youtube-ui.l.google.com. 229 IN A 74.125.224.97  
youtube-ui.l.google.com. 229 IN A 74.125.224.100  
youtube-ui.l.google.com. 229 IN A 74.125.224.105  
youtube-ui.l.google.com. 229 IN A 74.125.224.99  
youtube-ui.l.google.com. 229 IN A 74.125.224.104  
youtube-ui.l.google.com. 229 IN A 74.125.224.103  
youtube-ui.l.google.com. 229 IN A 74.125.224.102

;; Query time: 21 msec  
;; SERVER: 127.0.0.1#5353(127.0.0.1)  
;; WHEN: Wed Oct 8 14:14:01 2014  
;; MSG SIZE rcvd: 243

可以看到DNS服务器已经正常使用了。