由于你懂得的原因,需要用到非标准端口的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服务器已经正常使用了。