Centos自建DNS服务器

由于现在gfw对国外某些网站会进行屏蔽,往往输入网址以后进入的是一个莫名其妙的网站(比如fb,y2b等),或者干脆连不上。这种情况是因为我们在向当地dns服务器发起dns请求时,dns服务器没有告诉我们网站正确ip导致的(他们故意的),这就是传说中的dns污染。当然连不上的原因主要是因为ip被封,但本篇主要讨论dns污染的问题。

目前来说国内dns污染主要有2种已知的技术手段:

  1. udp污染,只要是通过udp发起的请求都有可能被污染。
  2. 53端口污染:53号端口是dns服务器的默认查询端口,gfw对所有53号端口进行了污染,只要我们向任何一个服务器的53号端口发起请求就会遭到污染。 下面就介绍一种防止dns污染的方案:自建dns服务器。 主要原理是:
    通过自建国外器服务器向googledns获得真实dns信息,然后本地再通过自建的服务器查询dns信息。
    为什么要国外服务器?因为国内服务器也在gfw的污染范围,当然也就获得不到真实的dns信息。

OK,下面进入正题:在centos(linux)下建立dns服务器,需要用到的软件是pdnsd。

1、pdnsd安装

http://members.home.nl/p.a.rombouts/pdnsd/dl.html 下载pdnsd最新的rpm包 然后

1
yum localinstall pdnsd-1.2.9a-par\_sl6.x86\_64.rpm

这样就安装完成了

2、配置pdnsd

安装完pdnsd以后会在/etc/下生成一个pdnsd.conf.sample,而pdnsd会读的配置文件在/etc/pdnsd.conf下,所以先复制一份

cp /etc/pdnsd.conf.sample /etc/pdnsd.conf

编辑pdnsd.conf

vi /etc/pdnsd.conf

下面是我的配置文件,注意中文注释关键行

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
global {
perm_cache=4096;
cache_dir="/var/cache/pdnsd";
# pid_file = /var/run/pdnsd.pid;
run_as="pdnsd";
server_ip = any; # Use eth0 here if you want to allow other
# machines on your network to query pdnsd.
server_port=9909; # 搭建的dns服务器查询端口一定要设置成非53,否则还是有可能会被污染
status_ctl = on;
# paranoid=on; # This option reduces the chance of cache poisoning
# but may make pdnsd less efficient, unfortunately.
query\_method=tcp\_only; # 只支持tcp查询
min_ttl=1d; # Retain cached entries at least 15 minutes.
max_ttl=1w; # One week.
timeout=10; # Global timeout option (10 seconds).
neg\_domain\_pol=on;
udpbufsize=1024; # Upper limit on the size of UDP messages.
}

server {
label= "googledns";
ip = 8.8.8.8
,8.8.4.4
; # Put your ISP's DNS-server address(es) here.
# proxy_only=on; # Do not query any name servers beside your ISP's.
# This may be necessary if you are behind some
# kind of firewall and cannot receive replies
# from outside name servers.
timeout=4; # Server timeout; this may be much shorter
# that the global timeout option.
uptest=none; # Test if the network interface is active.
purge_cache=off; # Keep stale cache entries in case the ISP's
# DNS servers go offline.
edns_query=no; # Use EDNS for outgoing queries to allow UDP messages
# larger than 512 bytes. May cause trouble with some
# legacy systems.
exclude = .localdomain;
}

source {
owner=localhost;
# serve_aliases=on;
file="/etc/hosts";
}

rr {
name=localhost;
reverse=on;
a=127.0.0.1;
owner=localhost;
soa=localhost,root.localhost,42,86400,900,86400,86400;
}

3、启动pdnsd

1
service pdnsd start

也可以加入开机启动

1
chkconfig pdnsd on

4、开放服务器端口

将上面配置文件里的服务器端口开放(9909)

/sbin/iptables -I INPUT -p tcp –dport 9909 -j ACCEPT
/etc/init.d/iptables save
service iptables restart

OK,到这里自架的DNS服务器就安装完成了,下面测试一下

centos不自带dig命令需要安装

1
dig @127.0.0.1 -p 9909 youtube.com

输入以上命令可以看到类似下面的结果

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
\[root@tshine ~\]# dig @127.0.0.1 -p 9909 youtube.com

; <<>\> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6_6.2 <<>> @127.0.0.1 -p 9909 youtube.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57216
;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 0

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

;; ANSWER SECTION:
youtube.com. 86400 IN A 74.125.224.137
youtube.com. 86400 IN A 74.125.224.142
youtube.com. 86400 IN A 74.125.224.132
youtube.com. 86400 IN A 74.125.224.133
youtube.com. 86400 IN A 74.125.224.136
youtube.com. 86400 IN A 74.125.224.129
youtube.com. 86400 IN A 74.125.224.135
youtube.com. 86400 IN A 74.125.224.128
youtube.com. 86400 IN A 74.125.224.131
youtube.com. 86400 IN A 74.125.224.134
youtube.com. 86400 IN A 74.125.224.130

;; Query time: 31 msec
;; SERVER: 127.0.0.1#9909(127.0.0.1)
;; WHEN: Sat Apr 18 23:04:46 2015
;; MSG SIZE rcvd: 205

最后可以在自己本地也用dig命令测试一下,将命令中的“@127.0.0.1”替换成“@你的服务器ip” ,如果返回结果和在服务器dig的结果一样就成功了。

  • 本文作者: Tshine Zheng
  • 本文链接: 143.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!