树莓派搭建内网DNS服务器并实现内网域名解析

前言

我想在内网搭建一个DNS服务器来实现在内网中,用外网不存在的域名后缀网址来访问内网资源。

Dnsmasq工作原理
当接受到一个DNS请求时,Dnsmasq首先会查找/etc/hosts这个文件,然后查找/etc/resolv.conf中定义的外部DNS。所以说Dnsmasq是一个很不错的外部DNS中继。
配置Dnsmasq为DNS缓存服务器,同时在/etc/hosts文件中加入本地内网解析,这样一来每当内网机器查询时就会优先查询hosts文件,这就等于将/etc/hosts共享给全内网机器使用,从而解决内网机器互相识别的问题。相比逐台机器编辑hosts文件或者添加Bind DNS记录,仅编辑一个hosts文件,这简直太容易了。

安装Dnsmasq

1
2
3
4
Ubuntu/Debian系统:  
$ apt-get install dnsmasq
Centos/RHEL系统:
$ yum install dnsmasq

配置Dnsmasq

++配置的DNS服务器地址是公网的IP地址,
而你要对域名进行解析的话,可以修改Hosts文件,或者在dnsmasq.conf配置文件里面添加解析即可!++

配置Dnsmasq的配置文件

dnsmasq.conf的配置内容比较多,但是只需要搭建一台DNS服务器的话,只需要简单的配置就可以了。dnsmasq.conf通常坐在地位置是/etc/dnsmasq.conf。

1
2
3
4
5
6
基本配置:
resolv-file=/etc/resolv.conf(详细参考下一步)
strict-order
listen-address=127.0.0.1,192.168.1.24(请看接下的注释,特别重要)
address=/www.tang.tang/172.18.61.125
cache-size=10000

resolve-file定义dnsmasq从哪里获取上游DNS服务器的地址, 默认是从/etc/resolv.conf获取。
strict-order表示严格按照resolv-file文件中的顺序从上到下进行DNS解析,直到第一个解析成功为止。
listen-address定义dnsmasq监听的地址,默认是监控本机的所有网卡上。
address自定义域名解析的IP地址,在此已www.tang.tang这个域名为例。

注意:

这里有个坑,不少人都在这个坑里搞了好长时间,网上很多教程都没有明确强调这一点!这里不少人认为是解析的本机所以就把IP地址写成127.0.0.1,这样局域网其它主机是解析不到的,必须还要写上本机所在局域网内的IP地址,比如这台主机在局域网内的IP地址是192.168.1.24,那么就要加上这个IP地址!所以这个参数正确写法应该是127.0.0.1,192.168.1.24,后面的参数改为你的主机在局域网的IP。

配置上游服务器地址

resolv-file配置Dnsmasq额外的上游的DNS服务器,如果不开启就使用Linux主机默认的/etc/resolv.conf里的nameserver。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
首先
sudo -s

通过下面的选项指定其他文件来管理上游的DNS服务器

vim /etc/dnsmasq.conf
resolv-file=/etc/resolv.dnsmasq.conf

在指定文件中增加转发DNS的地址(若使用你自己的配置文件)

vim /etc/resolv.dnsmasq.conf
nameserver 1.1.1.1
nameserver 1.2.4.8

不使用你自己的配置文件的话

vim /etc/resolv.conf
nameserver 1.1.1.1
nameserver 1.2.4.8
(上面的DNS服务器是公网的dns服务器地址,选用你喜欢的)

添加域名解析记录

方法一

(1)使用系统默认hosts
编辑hosts文件,简单列举一下格式

1
2
3
vim /etc/hosts
127.0.0.1 localhost
172.18.61.125 www.tang.tang

hosts文件的强大之处还在于能够劫持解析,譬如mirror.centos.org是CentOS仓库所在,几乎是机器正常必访问一个域名,我将它解析成一个内网地址,搭建一个内网镜像站,不仅内网机器也可以及时得到安全更新,每月还可以节省很多流量。

(2)使用自定义hosts文件

1
2
3
4
5
6
修改配置,增加自定义hosts文件位置。
vim /etc/dnsmasq.conf
addn-hosts=/etc/dnsmasq.hosts(取消掉注释)
在/etc/dnsmasq.hosts文件中添加DNS记录
vim /etc/dnsmasq.hosts
172.18.61.125 www.tang.tang

如果你找配置文件找了很久都没找到,我建议你看看VIm的相关语法。

(3)使用dnsmasq.conf文件解析

1
2
3
4
5
6
7
8
9
10
11
vim /etc/dnsmasq.conf
address=/www.tang.tang/172.18.61.125(取消注释)

也可以对指定的域名进行解析,相当于就是本地hosts指向,可以利用这个功能实现广告屏蔽等效果。也是需要修改/etc/dnsmasq.conf文件,DNSmasq也可以对域名进行泛解析,填写*.xiaoz.me,这样的格式即可。
#将广告域名指向到127.0.0.1实现广告屏蔽

address=/ad.youku.com/127.0.0.1
address=/ad.iqiyi.com/127.0.0.1

#对xiaoz.me进行泛解析
address=/*.xiaoz.me/192.168.20.138

修改iptables配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1.允许本机的53端口可对外访问
iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT

2.转发DNS请求
# 开启流量转发功能
echo '1' > /proc/sys/net/ipv4/ip_forward
echo '1' > /proc/sys/net/ipv6/ip_forward

# IPv6 用户选用
# 添加流量转发规则,将外部到53的端口的请求映射到Dnsmasq服务器的53端口
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53
iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53

# 如果要限制只允许内网的请求,方法如下
iptables -t nat -A PREROUTING -i eth1 -p upd --dport 53 -j REDIRECT --to-port 53

3.保存规则并重启
service iptables save
service iptables restart

启动与测试

1
2
3
4
5
6
#启动
/etc/init.d/dnsmasq start
#停止
/etc/init.d/dnsmasq stop
#重新启动
/etc/init.d/dnsmasq restart

修改客户机的DNS服务器

控制面板\网络和 Internet\网络和共享中心中:

1.找到以太网或者有线网络并点击。
2.点击属性
3.找到Internet协议4(TCP/IPV4)并双击
4.点击使用下面的DNS服务器地址。并在首选项输入你的DNS服务器地址以及你的DNS默认网关。
5.点击确定,点击关闭!
6.现在,你应该行了。

附录(配置文件说明)

Linux中使用Dnsmasq部署DNS服务
Linux(树莓派)下使用Dnsmasq搭建DNS服务器
使用dnsmasq快速搭建内网DNS
Linux安装DNSmasq搭建自己的公共DNS

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
配置文件说明

Dnsmasq配置文件是/etc/dnsmasq.conf,下面对Dnsmasq中和DNS相关的配置项进行说明。

用指定的端口代替默认的DNS 53端口,如果设置为0,则完全禁止DNS功能,只使用dhcp服务

port=5353

以下两个参数告诉Dnsmasq过滤一些查询:

1.哪些公共DNS没有回答

2.哪些root根域不可达。

从不转发格式错误的域名

#domain-needed

从不转发不在路由地址中的域名

#bogus-priv

resolv-file配置Dnsmasq额外的向流的DNS服务器,如果不开启就使用linux主机默认的/etc/resolv.conf里的nameserver,通过下面的选项指定其他文件。

resolv-file=/etc/dnsmasq.d/upstream_dns.conf

默认情况下Dnsmasq会发送查询到它的任何上游DNS服务器上,如果取消注释,则Dnsmasq则会严格按照/etc/resolv.conf中的DNS Server顺序进行查询。

#strict-order

以下两个参数控制是否通过/etc/resolv.conf确定上游服务器,是否检测/etc/resolv.conf的变化,则取消注释。

如果你不想Dnsmasq读取/etc/resolv.conf文件或者其他文件,获得它的servers

# If you don't want dnsmasq to read /etc/resolv.conf or any other

# file, getting its servers from this file instead (see below), then

# uncomment this.

#no-resolv

如果你不允许Dnsmasq通过轮询/etc/resolv.conf或者其他文件来获取配置的改变,则取消注释。

#no-poll

增加一个name server,一般用于内网域名

#server=/localnet/192.168.0.1

设置一个反向解析,所有192.168.3.0/24的地址都到10.1.2.3去解析

#server=/3.168.192.in-addr.arpa/10.1.2.3

增加一个本地域名,会在/etc/hosts中进行查询

#local=/localnet/

增加一个域名,强制解析到你指定的地址上

#address=/double-click.net/127.0.0.1

同上,还支持ipv6

#address=/www.thekelleys.org.uk/fe80::20d:60ff:fe36:f83

增加查询yahoo google和它们的子域名到vpn、search查找

# Add the IPs of all queries to yahoo.com, google.com, and their

# subdomains to the vpn and search ipsets:

#ipset=/yahoo.com/google.com/vpn,search

你还可以控制Dnsmasq和Server之间的查询从哪个网卡出去

# server=10.1.2.3@eth1

指定源地址携带10.1.2.3地址和192.168.1.1的55端口进行通讯

# and this sets the source (ie local) address used to talk to

# 10.1.2.3 to 192.168.1.1 port 55 (there must be a interface with that

# IP on the machine, obviously).

# server=10.1.2.3@192.168.1.1#55

改变Dnsmasq默认的uid和gid

#user=

#group=

如果你想Dnsmasq监听某个端口为dhcp、dns提供服务

#interface=

你还可以指定哪个端口你不想监听

#except-interface=

设置想监听的地址,如果你本机要使用写上127.0.0.1。

#listen-address=

如果你想在某个端口只提供dns服务,则可以进行配置禁止dhcp服务

#no-dhcp-interface=

# On systems which support it, dnsmasq binds the wildcard address,

# even when it is listening on only some interfaces. It then discards

# requests that it shouldn't reply to. This has the advantage of

# working even when interfaces come and go and change address. If you

# want dnsmasq to really bind only the interfaces it is listening on,

# uncomment this option. About the only time you may need this is when

# running another nameserver on the same machine.

#bind-interfaces

如果你不想使用/etc/hosts,则取消下面的注释

#no-hosts

如果你项读取其他类似/etc/hosts文件,则进行配置

addn-hosts=/etc/banner_add_hosts

自动的给hosts中的name增加一个域名

#expand-hosts

给dhcp服务赋予一个域名

#domain=thekelleys.org.uk

给dhcp的一个子域赋予一个不同的域名

#domain=wireless.thekelleys.org.uk,192.168.2.0/24

同上,不过子域是一个范围

#domain=reserved.thekelleys.org.uk,192.68.3.100,192.168.3.200

dhcp分发ip的范围,以及每个ip的租约时间

#dhcp-range=192.168.0.50,192.168.0.150,12h

同上,不过给出了掩码

#dhcp-range=192.168.0.50,192.168.0.150,255.255.255.0,12h

自动加载conf-dir目录下的配置文件

conf-dir=/etc/dnsmasq.d

设置dns缓存大小,默认为150条

cache-size=150
Your support is my biggest motivation.