利用Dnsmasq搭建本地自有DNS服务器

Dnsmasq 提供 DNS 缓存和 DHCP服务、Tftp服务功能。作为域名解析服务器(DNS),dnsmasq可以通过缓存 DNS 请求来提高对访问过的网址的连接速度。作为DHCP 服务器,Dnsmasq 可以用于为局域网电脑分配内网ip地址和提供路由。DNS和DHCP两个功能可以同时或分别单独实现。Dnsmasq 轻量且易配置,适用于个人用户或少于50台主机的网络。此外它还自带了一个 PXE 服务器以及对邮件服务器的 mx 记录的支持,jabber 的 srv 记录的支持等。它提供的 DNS 功能和可选择的 DHCP 功能可以取代 dhcpd 服务和 bind 等服务,配置起来更简单,更适用于虚拟化和大数据环境的部署。

Dnsmasq 的应用

一般情况下,我们可以用 bind 解决 dns 的问题, dhcpd 解决 dhcp 的问题,可用dnsmasq解决下面的一些维护问题:

  • 局域网有很多机器希望使用一致的hosts文件,你需要经常维护这份列表。

  • 你希望局域网的人访问某个域名时,拦截下来到指定的ip,做缓存节省带宽或者其它用途都可以。优先使用本地自定义dns。

  • 阻止对某个域名的正常解析。

常见的应用:

  • 同时提供 DNS 解析功能和 DHCP 地址分配功能,可用于机房内网、公司内网、家庭内网等类似内网环境
  • 架设本地 DNS,在一定程度上,解决我们访问网速、广告拦截的问题
  • 作为局域网机器批量IP维护使用,以及局域网解决特定网址域名禁止访问

Dnsmasq 基本的工作原理

Dnsmasq在接受到用户的一个DNS请求时,首先会查找 /etc/hosts 这个文件,然后查找 /etc/resolv.conf 中定义的外部 DNS 。所以说 Dnsmasq 是一个很不错的外部 DNS 中继。

配置 Dnsmasq 为 DNS 缓存服务器,同时在 /etc/hosts 文件中加入本地内网解析,这样一来每当内网机器查询时就会优先查询 hosts 文件,这就等于将 /etc/hosts 共享给全内网机器使用,从而解决内网机器互相识别的问题。相比逐台机器编辑 hosts 文件或者添加 Bind DNS 记录,仅编辑一个 hosts 文件,这简直太容易了。

安装 Dnsmasq

  • rpm包安装
1
2
3
4
5
6
7
8
9
10
11
12
yum -y install dnsmasq
# 使用yum源安装

dnsmasq -v
# 查看dnsmasq的版本

systemctl enable dnsmasq
# 加入开机启动服务

systemctl daemon-reload
systemctl start dnsmasq
# 启动dnsmasq服务
  • 源码包安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
wget http://www.thekelleys.org.uk/dnsmasq/dnsmasq-2.78.tar.xz
# 下载源码包

tar xf dnsmasq-2.78.tar.xz
cd dnsmasq-2.78
# 源码包解压

vim Makefile # 修改 PREFIX = /usr/local/dnsmasq
# 配置安装路径

make && make install
# 编译安装

cp dnsmasq.conf.example /etc/dnsmasq.conf
# 生成配置文件

ln -s /usr/local/dnsmasq/sbin/dnsmasq /usr/sbin/
# 生成软连接

dnsmasq --version
# 查看dnsmasq版本

配置 Dnsmasq

Dnsmasq 处理 DNS 设置与 BIND 等其他 DNS 服务有所不同。所有的配置都在 /etc/dnsmasq.conf 这一个文件中完成 。官方在配置文件 /etc/dnsmasq.conf 中针对选项和参数等做了比较好的注释说明,我们可以将配置做一次备份,以便以后查阅。默认情况下 dnsmasq.conf 中只开启了最后 include 项,因此可以在 /etc/dnsmasq.conf 的前提下,将自定义的配置放到 /etc/dnsmasq.d 目录下的一个任意名字的配置文件当中。

请确保文件 /etc/dnsmasq.conf 中的如下配置是开启的:

1
2
# Include all files in a directory which end in .conf                           
conf-dir=/etc/dnsmasq.d/,*.conf

注意: /etc/dnsmasq.d/*.conf 的优先级大于 /etc/dnsmasq.conf

DNS 配置参数说明

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

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
Dnsmasq 默认启用其 DNS 服务器,并且会监听在 0.0.0.0:53,如果要用指定的端口代替 DNS 默认的 53 端口则配置如下选项,如果设置为0,则完全禁止 DNS 功能,只使用 dhcp 服务
#port=5353

以下两个参数告诉 Dnsmasq 过滤一些查询:
1.哪些公共DNS没有回答
2.哪些root根域不可达。

从不转发格式错误的域名
#domain-needed

从不转发不在路由地址中的域名
#bogus-priv

Linux 处理 DNS 请求时有个限制,在 resolv.conf 中最多只能配置三个域名服务器(nameserver),我们完全可以使用 resolv-file 来作为变通方法,当然这只是其中的一个用途之一。这个参数表示 Dnsmasq 会从指定的文件中寻找上级 DNS 服务器列表,而不是从本机的 `resolv.conf` 中读取 DNS 服务器列表。如果机器的地址是通过 DHCP 方式取得的话,该文件( `resolv.conf` )容易受到影响从而影响到 Dnsmasq,因此配置此项避免影响

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

默认情况下Dnsmasq会发送查询到它的任何上游DNS服务器上,如果取消注释,则Dnsmasq则会严格按照 /etc/resolv.conf 中的 DNS Server 顺序进行查询,直到第一个成功解析成功为止
#strict-order

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

如果你不想让Dnsmasq读取 /etc/resolv.conf 或者其他文件来获得它的servers,则取消注释
#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 或 DHCP 中进行查询
#local=/localnet/

增加一个域名,使得这个域名强制解析到你指定的地址上
#address=/double-click.net/127.0.0.1

同上,还支持ipv6
#address=/www.thekelleys.org.uk/fe80::20d:60ff:fe36:f83

增加查询yahoo google的IP地址和它们的子域名到vpn、search查找
#ipset=/yahoo.com/google.com/vpn,search

你还可以控制Dnsmasq和Server之间的查询从哪个网卡出去
queries to 10.1.2.3 to be routed via eth1
#server=10.1.2.3@eth1

设置了个源(本地)地址10.1.2.3,用来和192.168.1.1的55端口进行通信
很显然,在机器上必须有一个与此IP相关联的接口
#server=10.1.2.3@192.168.1.1#55

改变Dnsmasq默认的uid和gid
#user=
#group=

如果你想让 Dnsmasq 监听在本机特定的网卡(包括回环网卡),用于 DHCP 和 DNS 请求,则设置此项
#interface=

你还可以指定哪个网卡你不想监听
#except-interface=

设置想监听的地址
#listen-address=

要在单台主机上以守护进程方式启动 Dnsmasq 做 DNS (缓存)服务器,如果仅为本机使用则写上127.0.0.1。
#listen-address=127.0.0.1
如果用此主机为局域网提供默认 DNS,请为该主机绑定固定 IP 地址,设置:
#listen-address=192.168.x.x
这种情况建议配置静态IP。多个ip地址设置:
#listen-address=127.0.0.1,192.168.x.x

如果你想让Dnsmasq在某个网卡上只提供dns服务,则可以进行配置禁止dhcp服务
#no-dhcp-interface=

在支持 Dnsmasq 的系统上,Dnsmasq 绑定通配符地址,即使它只监听某些网卡。如果配置了此项,Dnsmasq 将丢弃它不应该回复的请求。即使在接口出现和更改地址时,这也具有工作的优势。如果您希望 Dnsmasq 只绑定它正在监听的接口,请取消注释
#bind-interfaces

默认情况下这是注释掉的,Dnsmasq 会首先寻找本地的 /etc/hosts 文件,再去寻找缓存下来的域名
如果你不想使用 /etc/hosts,则取消下面的注释
#no-hosts

如果你想使用额外的类似/etc/hosts文件,则进行配置
#addn-hosts=/etc/banner_add_hosts

如果你想让hosts中的一个域自动增加一个主机名,则配置此项。例如baidu.com,他将自动添加www
#expand-hosts

为 Dnsmasq 设置一个域,简单地说就是给dhcp服务赋予一个域
如果被设置,将会做以下事情
1) 允许DHCP主机拥有完全合格的域名,只要域部分匹配这个设置
2) 设置“域” 的 DHCP选项,从而设置由DHCP配置所有系统的域。
3) 为 “expand-hosts” 提供 域 的部分
#domain=thekelleys.org.uk

为特定子网设置不同的域
#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

为某个范围或子网设置标记,以便于某些设置只针对这些范围或子网生效
#dhcp-range=set:red,192.168.0.50,192.168.0.150
#dhcp-range=tag:green,192.168.0.50,192.168.0.150,12h

自动加载conf-dir目录下的配置文件
#conf-dir=/etc/dnsmasq.d

设置dns缓存大小,默认为150条
#cache-size=8192

是否禁用negative caching,取消注释意味着禁用。negative caching 允许 dnsmasq 记住从上游域名服务器上得到的“没有这样的域名”的查询结果,并对于相同的查询不再重复转发轮询上游服务器。简单的讲就是在没有禁用(未取消注释)的情况下,解析失败的域名不会再向上游服务器重复转发查询。
#no-negcache

允许客户端缓存的时间,单位为秒
#local-ttl=60

开启debug模式,记录客户端查询记录到/var/log/debug中
#log-queries

# Log lots of extra information about DHCP transactions.
#log-dhcp

# Log to this syslog facility or file. (defaults to DAEMON)
#log-facility=/var/log/dnsmasq.log

异步log,缓解阻塞。
#log-async=20

DNS配置实例

基本配置

下面的配置不是所有都是必须要配置的,根据实际应用情况而定。但是建议开启转发功能,以免配置 Dnsmasq 的转发相关的功能时造成排错困难

1
2
3
4
5
6
7
8
9
10
11
# 允许本机的53端口可对外访问
iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT

# 转发DNS请求,开启流量转发功能,临时开启,重启后会失效,如需永久配置要编辑 /etc/sysctl.conf 开启
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

配置DNS(缓存)服务器

需要注意的是,一旦自定义的配置文件放到 /etc/dnsmasq.d/ 中,配置文件中指定的某些文件就不能再放到这个目录里下了,因为会被 /etc/dnsmasq.conf 的 include 加载报错。因此我们创建一个目录 /etc/dnsmasq-config/ 用来存放独有的 hosts、resolv 等文件。

1
mkdir -pv /etc/dnsmasq-config/

创建一个自定义的配置文件 /etc/dnsmasq.d/mydnsmasq.conf ,并进行下列配置:

1
2
3
4
5
6
7
8
9
no-poll
strict-order
no-negcache
cache-size=8192
local-ttl=60
no-hosts
addn-hosts=/etc/dnsmasq-config/hosts
resolv-file=/etc/dnsmasq-config/resolv.conf
listen-address=192.168.127.130

在文件 /etc/dnsmasq-config/hosts 中进行 hosts 配置:

1
2
3
4
5
10.94.0.67       us_zero01
10.94.0.68 aws-nx
10.94.0.69 awsire
10.94.0.70 awsuk
10.94.0.71 awsvirginia

在文件 /etc/dnsmasq-config/resolv.conf 中进行 resolv 配置:

1
2
3
4
nameserver 8.8.8.8
nameserver 9.9.9.9
nameserver 114.114.114.114
nameserver 180.96.96.96

接下来进行配置文件的语法检查,并做测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
dnsmasq --test
# 语法检查

systemctl daemon-reload
systemctl restart dnsmasq
# 服务重启

dig -p 53 @192.168.127.130 awsvirginia +short
# 正向解析
dig -p 53 @192.168.127.130 -x 10.94.0.67
# 反向解析

dig -p 53 @192.168.127.130 www.baidu.com
dig -p 53 @192.168.127.130 www.baidu.com
# 比较两次结果中的 Query time,缓存成功的情况下,第二次的查询时间明显大幅度降低

配置域名劫持

例如办公室明确规定不能访问360,我们可以将域名劫持,解析到一个不存在的内网地址。另外如果有自己独有的yum源服务器,还可以将相关域名劫持下来解析到自己的yum源服务器地址,从而达到加快速度、节省带宽的目的。

使用hosts配置域名劫持

可以使用系统自带的 /etc/hosts,也可以自定义hosts,针对某个域名做静态指向,缺点是无法支持泛域名,下面以自定义为例

  • 创建一个自定义的配置文件 /etc/dnsmasq.d/mydnsmasq.conf ,并进行下列配置
1
2
3
4
5
6
7
8
no-poll
strict-order
no-negcache
cache-size=8192
local-ttl=60
no-hosts
addn-hosts=/etc/dnsmasq-config/hosts
listen-address=192.168.127.130
  • 添加hosts
1
echo '10.10.10.10 www.360.cn' >> /etc/dnsmasq-config/hosts
  • 测试
1
2
3
4
5
6
7
8
9
10
dnsmasq --test
# 语法检查

systemctl daemon-reload
systemctl restart dnsmasq
# 服务重启

dig -p 53 @192.168.127.130 www.360.cn
dig -p 53 @192.168.127.130 sd.360.cn
# 经过测试可以发现,指定的域名被拦截,同一个域下其他的无法被拦截

使用address配置域名劫持

address可以将指定的域解析为一个IP地址,即泛域名解析。

注意: 如果针对同样的域名同时配置了no-hosts、addn-hosts、address,那么 /etc/hosts 优先级最高,addn-hosts的优先级次之,address优先级最低,前提是no-hosts参数必须在 address 与 addn-hosts 之前才可以。

  • 创建一个自定义的配置文件 /etc/dnsmasq.d/mydnsmasq.conf ,并进行下列配置
1
2
3
4
5
6
7
8
no-poll
strict-order
no-negcache
cache-size=8192
local-ttl=60
no-hosts
address=/360.cn/10.10.10.10
listen-address=192.168.127.130
  • 测试
1
2
3
4
5
6
7
8
9
10
dnsmasq --test
# 语法检查

systemctl daemon-reload
systemctl restart dnsmasq
# 服务重启

dig -p 53 @192.168.127.130 www.360.cn
dig -p 53 @192.168.127.130 sd.360.cn
dig -p 53 @192.168.127.130 www.baidu.com

生产环境中的DNS拦截使用

  • 在cdn网络加速的生产环境中,通常使用了类似于Nginx这样的反向代理手段,通过加速网络向源站服务器获取资源。
  • 假设我们想要使用curl命令做资源下载测试,并需要使用普通网络和加速网络做下载速度对比。
  • 环境说明:
    • 服务器A:做下载测试的服务器
    • 源站URL:https://s3-ap-southeast-1.amazonaws.com/download-speed-sg-test/20M.tar
    • 代理服务器:Nginx服务器为192.168.123.45,加速网络环境的服务器

实现手段:

普通网络环境的下载。直接在服务器A进行下载即可

1
/usr/local/bin/curl -4 -o /dev/nul https://s3-ap-southeast-1.amazonaws.com/download-speed-sg-test/20M.tar

加速网络环境的下载。

1、在服务器A启用dnsmasq,将URL对应的域名拦截,使用自定义hosts的方式指向Nginx服务器

/etc/dnsmasq.d/nginx-test.conf

1
2
3
4
5
6
no-poll
strict-order
no-negcache
cache-size=8192
local-ttl=60
addn-hosts=/opt/test/dns_host.conf

/opt/test/dns_host.conf

1
193.192.168.123.45 s3-ap-southeast-1.amazonaws.com

2、下载测试
使用新版本的curl选项中的--dns-servers选项指定dns进行下载

1
2
3
/usr/local/bin/curl -4 -o /dev/null --dns-servers 127.0.0.1 https://s3-ap-southeast-1.amazonaws.com/download-speed-sg-test/20M.tar

# 系统自带的curl命令不支持--dns-servers,因此如果有这样的需求就要编译新版本的curl来支持dns

由此以来,服务器A的资源下载请求被dnsmasq转向了Nginx服务器,从而进入加速网络获取资源

泛域名配置应用

在很多情况下,我们可能只需要访问某个域中其中一个域名,而其他域名不期望访问,这个需求可通过如下方式配置实现:

  • 创建一个自定义的配置文件 /etc/dnsmasq.d/mydnsmasq.conf ,并进行下列配置
1
2
3
4
5
6
7
8
9
10
no-poll
strict-order
no-negcache
cache-size=8192
local-ttl=60
no-hosts
address=/google.com/10.10.10.10
server=/maps.google.com/mail.google.com/#
# 如果使用 # 代替dns地址,则使用标准 DNS 服务器,即 Dnsmasq 默认使用的 /etc/resolv.conf 的 nameserver 指定的服务器地址
listen-address=192.168.127.130
  • 测试
1
2
3
4
5
6
7
8
9
10
11
dnsmasq --test
# 语法检查

systemctl daemon-reload
systemctl restart dnsmasq
# 服务重启

dig -p 53 @192.168.127.130 www.google.com
dig -p 53 @192.168.127.130 test.google.com
dig -p 53 @192.168.127.130 mail.google.com
dig -p 53 @192.168.127.130 maps.google.com
  • 另外一种情况是实现泛域名做代理,某个或某些子域名不做代理,例如下面的配置,就实现了 nordstrom.com 整个域的数据拦截下来转发到代理服务器 192.168.127.100 ,而 m.nordstrom.commail.nordstrom.com 不做代理
1
2
address=/nordstrom.com/192.168.127.100
server=/m.nordstrom.com/mail.nordstrom.com/#
  • 把所有.cn的域名全部通过114.114.114.114这台国内DNS服务器来解析
1
server=/cn/114.114.114.114
  • *.apple.comtaobao.com 使用专用的DNS
1
2
server=/taobao.com/223.5.5.5
server=/.apple.com/223.5.5.5
1
address=/www.360.cn/10.10.10.10

选择最快的上游DNS服务器

经常会有这样的情景, Dnsmasq 服务器配了一堆上游服务器,转发本地的dns请求,缺省是 Dnsmasq 事实上是只挑了一个上游dns服务器来查询并转发结果,这样如果选错服务器的话会导致DNS响应变慢。

  • 创建一个自定义的配置文件 /etc/dnsmasq.d/mydnsmasq.conf,并进行下列配置
1
2
3
4
5
all-servers
# all-servers表示对以下设置的所有server发起查询,选择回应最快的一条作为查询结果返回
server=8.8.8.8
server=9.9.9.9
server=219.141.136.10

Dnsmasq 性能优化

Bind不配合数据库的情况下,经常需要重新载入并读取配置文件,这是造成性能低下的原因。根据这点教训,我们可以考虑不读取 /etc/hosts 文件。而是另外指定一个在共享内存里的文件,比如 /dev/shm/dnsrecord.txt ,这样就不费劲了,又由于内存的非持久性,重启就消失,可以定期同步硬盘上的某个内容到内存文件中。

  • 创建一个自定义的配置文件 /etc/dnsmasq.d/mydnsmasq.conf,并进行下列配置
1
2
no-hosts 
addn-hosts=/dev/shm/dnsrecord.txt
  • 解决同步问题
1
2
3
chmod +x /etc/rc.local 
echo "cat /etc/hosts > /dev/shm/dnsrecord.txt" >> /etc/rc.local
# 开机启动
  • 使用计划任务定时同步内容
1
*/10 * * * * cat /etc/hosts > /dev/shm/dnsrecord.txt

配置日志功能

创建对应的目录和日志文件,修改文件的属主属组及权限:

1
2
3
4
mkdir -pv /var/log/dnsmasq/
touch /var/log/dnsmasq/dnsmasq.log
chmod /var/log/dnsmasq/dnsmasq.log --reference=/etc/dnsmasq.conf
chown /var/log/dnsmasq/dnsmasq.log --reference=/etc/dnsmasq.conf

在自定义的配置文件 /etc/dnsmasq.d/mydnsmasq.conf 中添加如下两行配置以开启 log 功能:

1
2
log-queries
log-facility=/var/log/dnsmasq/dnsmasq.log

重启服务,做几次解析,查看日志是否记录成功:

1
2
3
4
5
systemctl daemon-reload    
systemctl restart dnsmasq
systemctl status dnsmasq
dig -p 53 @192.168.127.13 www.baidu.com
tail /var/log/dnsmasq/dnsmasq.log

如果在生产环境中使用 Dnsmasq 作为 DNS 服务器,则会有大量的解析请求,并会记录大量的查询内容到日志中,所以应该做日志切割,避免 log 文件过大造成文件系统使用率不足。

创建 Dnsmasq 的 logrotate 的配置文件 /etc/logrotate.d/dnsmasq

1
2
3
4
5
6
7
8
9
10
11
12
13
/var/log/dnsmasq/*.log {
ifempty # 即使是空文件也转储,这个是默认选项
missingok # 如果日志丢失, 不报错
notifempty # 如果是空文件的话,不转储
# daily # 指定转储周期为每天
hourly # 指定转储周期为每小时
dateext # 日志文件会附加上一个短横线和YYYYMMDD格式的日期
rotate 20
sharedscripts # 共享脚本,下面的 postrotate <s> endscript 中的脚本只执行一次即可
postrotate
[ ! -f /var/run/dnsmasq.pid ] || kill -USR2 $(cat /var/run/dnsmasq.pid)
endscript
}

执行 logrotate ,确保配置正确(没有报错)

1
/usr/sbin/logrotate -vf /etc/logrotate.conf

DHCP配置参数说明

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
# 选定需要监听的网卡
# Only listen to routers' LAN NIC. Doing so opens up tcp/udp port 53 to
# localhost and udp port 67 to world:
interface=<LAN-NIC>

# dnsmasq will open tcp/udp port 53 and udp port 67 to world to help with
# dynamic interfaces (assigning dynamic ips). Dnsmasq will discard world
# requests to them, but the paranoid might like to close them and let the
# kernel handle them:
bind-interfaces

设定可分配的ip地址段和租约时间
# Dynamic range of IPs to make available to LAN pc
dhcp-range=192.168.111.50,192.168.111.150,12h
# 同上,不过给出了掩码
#dhcp-range=192.168.8.50,192.168.8.150,255.255.255.0,12h

#绑定某些机器的ip-mac地址对,使其具有固定的ip地址
# If you’d like to have dnsmasq assign static IPs, bind the LAN computer's
# NIC MAC address:
dhcp-host=aa:bb:cc:dd:ee:ff,192.168.1.50
dhcp-host=00:0e:7b:ca:1c:6e,daunbook,192.168.0.12
# 为192.168.0.12设置主机名:dannbook
# dhcp服务的静态绑定
# dhcp-host=08:00:27:D1:CF:E2,192.168.8.201,infinite 无限租期
dhcp-host=08:00:27:D1:CF:E2,192.168.8.201,db2
dhcp-host=08:00:27:D6:F0:9F,192.168.8.202,db3

# 注意:当为某一MAC地址同时静态分配主机名和IP时,如果写到两条dhcp-host选项里(如下所示),则只会生效后面的一条。正确的选项写法如上配置。
dhcp-host=08:00:27:D1:CF:E2,192.168.8.201 dhcp-host=08:00:27:D1:CF:E2,db2
dhcp-host=08:00:27:D1:CF:E2,192.168.8.201
dhcp-host=08:00:27:D1:CF:E2,db2

# 重新启动客户端网卡。由于之前测试中客户端网卡已经申请了DHCP租期。所以这里需要修改租期文件,让客户端重新获得IP和hostname。

# 设置默认租期
# Set the limit on DHCP leases, the default is 150
#dhcp-lease-max=150

# 租期保存文件
#dhcp-leasefile=/var/lib/dnsmasq/dnsmasq.leases

# 通过/etc/hosts来分配对应的hostname
#dhcp-host=judge

# 忽略下面MAC地址的DHCP请求
#dhcp-host=11:22:33:44:55:66,ignore

# dhcp所在的domain
domain=freeoa.net

# 设置默认路由出口
# dhcp-option遵循RFC 2132(Options and BOOTP Vendor Extensions),可以通过dnsmasq --help dhcp来查看具体的配置
# 很多高级的配置,如iSCSI连接配置等同样可以由RFC 2132定义的dhcp-option中给出。
# option 3为default route
dhcp-option=3,192.168.8.1

# 设置NTP Server.这是使用option name而非选项名来进行设置
#dhcp-option=option:ntp-server,192.168.8.4,10.10.0.5


#当dnsmasq绝对是网络上唯一的DHCP服务器时应该设置。对于DHCPv4,它将从严格的RFC合规性中更改行为,以便不会忽略来自未知主机的未知租约的DHCP请求。这使得新主机在任何情况下都可以获得租约,而不会出现繁琐的超时。如果数据库丢失,它也允许dnsmasq重建其租赁数据库,而不需要每个客户端重新获得租约。对于DHCPv6,它将响应中的优先级设置为255(最大值),而不是0(最小值)。
dhcp-authoritative

DHCP配置实例

公司使用了三台Linux服务器作为网关为局域网中的其他设备提供IP和路由,以下是其中一个范例 dhcp.conf

  • Dnsmasq的全局配置
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

# global settings
no-hosts
strict-order
no-negcache
cache-size=8192
interface=br0
no-dhcp-interface=eth0
dhcp-authoritative

# start,end,netmask,lease
dhcp-range=172.20.35.10,172.20.35.200,255.255.252.0,18h
# 为宾客或测试机指定特定的地址范围、掩码、续订期
dhcp-range=net:gw7,172.20.32.10,172.20.32.200,255.255.252.0,18h
dhcp-range=net:gw5,172.20.33.10,172.20.33.200,255.255.252.0,18h
# 使用了两个标记 net:gw5 和 net:gw7 来标识其他两个设备,并分别指定了特定的地址范围、掩码、续订期

# 默认路由(网关)
dhcp-option=3,172.20.32.5
# 默认的DNS
dhcp-option=6,172.20.32.5

# 为标记是 net:gw5 的范围指定默认路由
dhcp-option=net:gw5,3,172.20.32.5
# 为标记是 net:gw5 的范围指定默认DNS
dhcp-option=net:gw5,6,172.20.32.5

# 为标记是 net:gw7 的范围指定默认路由
dhcp-option=net:gw7,3,172.20.32.7
# 为标记是 net:gw7 的范围指定默认DNS
dhcp-option=net:gw7,6,172.20.32.7

# domain name
dhcp-option=15,dhcp.netfits.com
# broadcast
dhcp-option=28,172.20.35.255


# 为特定的MAC地址绑定特定的IP
dhcp-host=2C:60:0C:1C:BE:7A,litingjie1,172.20.33.88,18h,net:gw5
dhcp-host=D0:7E:35:C7:F3:67,litingjie2,172.20.33.89,18h,net:gw5
dhcp-host=AC:C1:EE:30:BF:82,litingjie3,172.20.33.90,18h,net:gw5

web端的配置

Dnsmasq的WEB端:https://github.com/luxiaok/DNSmasqWeb

dnsmasq命令选项说明

提示: 查看配置文件语法是否正确,可执行下列命令:

1
dnsmasq --test
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
--test 
检查配置文件语法

-T, --local-ttl=<time>
当与从/etc/ hosts或在DHCP租约文件,默认设置的dnsmasq信息返回到本机ttl值为零,这意味着请求者不应本身缓存信息。此选项允许设定dhcp请求数据包的生存时间。这将减少在某些情况下过时的请求数据给客户端服务器造成的负载。

-x, --pid-file=<path>
指定一个备用的路径来记录进程ID通常保存的目录为/var/dnsmasq.pid。

-v, --version
打印版本号。

-p, --port=<port>
指定DNS的端口代替标准的DNS端口(53)。设置此为零完全禁用DNS功能,只留下DHCP和/或TFTP。
-P,--edns-packet-max=<size>
指定DNS转发支持的最大数据包大小。 默认是1280,这是以太网RFC2671建议的最大值。

-i, --interface=<interface name>
只监听指定的接口。当此命令指定的接口被使用时,dnsmasq会自动添加本地接口到接口列表。

-I, --except-interface=<interface name>
指定不监听的接口。

-2, --no-dhcp-interface=<interface name>
不提供DHCP或TFTP在指定的接口,但提供DNS服务。
-a,--listen-address=<ipaddr>
侦听指定的IP地址。监听的接口和IP地址可同时指定。如果指定监听的IP地址而指定未监听接口的,dnsmasq不会自动监听去回环节口(loopback)。所以如果配置此选项一般要明确的给出监听地址的为127.0.0.1

-r, --resolv-file=<file>
读取文件上的域名服务器的IP地址,dnsmasq可轮询多个resolv.conf文件的域名服务器。

-R, --no-resolv
不要读取/ etc / resolv.conf中。只得到命令行或配置文件中的dnsmasq上游域名服务器。

-c, --cache-size=<cachesize>
设置的dnsmasq的缓存大小。默认为150条。设置缓存大小为零禁用缓存。

-N, --no-negcache
禁用否定缓存。否定缓存允许dnsmasq记住从上游域名服务器上得到的“没有这样的域名”的查询结果,并对于相同的查询不再重复转发轮询上游服务器。

-0, --dns-forward-max=<queries>
设置DNS的查询并发的最大数量。默认值是150。

-F,--dhcp-range=[[net:]network-id,]<start-addr>,<end-addr>[[,<netmask>],<broadcast>][,<defaultlease time>]
启用DHCP服务器。地址将会给出了从范围<start-addr>到<end-addr>和静态定义的地址在DHCP主机选项给出。如果租用时间给出,然后租赁将会给予该时间长度。租用时间以秒或分钟(如4500)或时间(如1小时)或无限期“infinite”。最低租赁时间为两分钟。广播地址始终是可选的。
-u,--user=<username>
指定用户ID,开始的dnsmasq通常必须为root身份。

-k, --keep-in-foreground
不在后台进行fork,不运行debug模式

-K, --dhcp-authoritative
当一个网络上只有确定的一台DHCP服务器时,此参数应该被设置成dhcp-authoritative。这样可以确保从未知主机发送的未知租约不会被忽略。这样就使得新的主机在任何情况下及时的得到租约请求相应。还有一个重要作用是,当服务器的租赁数据库丢失了,此参数可以允许dnsmasq重建租约数据库,而不用与每个客户主机逐一重新请求租约。

-X, --dhcp-lease-max=<number>
限制的dnsmasq到DHCP租约规定的最大数目。默认为150。此限制是为了防止非法主机从服务器租赁大量的ip地址造成内存大量占用,从而形成DoS攻击。

--log-dhcp
额外的DHCP日志记录:记录所有的选项发送到DHCP客户端和用于确定他们的NetID标签。

-l, --dhcp-leasefile=<path>
使用指定的文件存储DHCP的租赁信息。存储的信息包括客户端的MAC地址,ip地址,计算机名等。

-C, --conf-file=<file>
指定一个不同的配置文件。此配置文件选项也允许在配置文件中使用,以包含多个配置文件。

参考链接

有钱任性,请我吃包辣条
0%