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 | yum -y install dnsmasq |
- 源码包安装
1 | wget http://www.thekelleys.org.uk/dnsmasq/dnsmasq-2.78.tar.xz |
配置 Dnsmasq
Dnsmasq 处理 DNS 设置与 BIND 等其他 DNS 服务有所不同。所有的配置都在 /etc/dnsmasq.conf
这一个文件中完成 。官方在配置文件 /etc/dnsmasq.conf
中针对选项和参数等做了比较好的注释说明,我们可以将配置做一次备份,以便以后查阅。默认情况下 dnsmasq.conf
中只开启了最后 include
项,因此可以在 /etc/dnsmasq.conf
的前提下,将自定义的配置放到 /etc/dnsmasq.d
目录下的一个任意名字的配置文件当中。
请确保文件 /etc/dnsmasq.conf
中的如下配置是开启的:
1 | # Include all files in a directory which end in .conf |
注意: /etc/dnsmasq.d/*.conf
的优先级大于 /etc/dnsmasq.conf
DNS 配置参数说明
Dnsmasq配置文件是 /etc/dnsmasq.conf
,下面对 Dnsmasq 常用的相关配置项进行说明。
1 | Dnsmasq 默认启用其 DNS 服务器,并且会监听在 0.0.0.0:53,如果要用指定的端口代替 DNS 默认的 53 端口则配置如下选项,如果设置为0,则完全禁止 DNS 功能,只使用 dhcp 服务 |
DNS配置实例
基本配置
下面的配置不是所有都是必须要配置的,根据实际应用情况而定。但是建议开启转发功能,以免配置 Dnsmasq 的转发相关的功能时造成排错困难
1 | # 允许本机的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 | no-poll |
在文件 /etc/dnsmasq-config/hosts
中进行 hosts 配置:
1 | 10.94.0.67 us_zero01 |
在文件 /etc/dnsmasq-config/resolv.conf
中进行 resolv 配置:
1 | nameserver 8.8.8.8 |
接下来进行配置文件的语法检查,并做测试:
1 | dnsmasq --test |
配置域名劫持
例如办公室明确规定不能访问360,我们可以将域名劫持,解析到一个不存在的内网地址。另外如果有自己独有的yum源服务器,还可以将相关域名劫持下来解析到自己的yum源服务器地址,从而达到加快速度、节省带宽的目的。
使用hosts配置域名劫持
可以使用系统自带的 /etc/hosts
,也可以自定义hosts,针对某个域名做静态指向,缺点是无法支持泛域名,下面以自定义为例
- 创建一个自定义的配置文件
/etc/dnsmasq.d/mydnsmasq.conf
,并进行下列配置
1 | no-poll |
- 添加hosts
1 | echo '10.10.10.10 www.360.cn' >> /etc/dnsmasq-config/hosts |
- 测试
1 | dnsmasq --test |
使用address配置域名劫持
address可以将指定的域解析为一个IP地址,即泛域名解析。
注意: 如果针对同样的域名同时配置了no-hosts、addn-hosts、address,那么 /etc/hosts
优先级最高,addn-hosts的优先级次之,address优先级最低,前提是no-hosts参数必须在 address 与 addn-hosts 之前才可以。
- 创建一个自定义的配置文件
/etc/dnsmasq.d/mydnsmasq.conf
,并进行下列配置
1 | no-poll |
- 测试
1 | dnsmasq --test |
生产环境中的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 | no-poll |
/opt/test/dns_host.conf
1 | 193.192.168.123.45 s3-ap-southeast-1.amazonaws.com |
2、下载测试
使用新版本的curl选项中的--dns-servers
选项指定dns进行下载
1 | /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 |
由此以来,服务器A的资源下载请求被dnsmasq转向了Nginx服务器,从而进入加速网络获取资源
泛域名配置应用
在很多情况下,我们可能只需要访问某个域中其中一个域名,而其他域名不期望访问,这个需求可通过如下方式配置实现:
- 创建一个自定义的配置文件
/etc/dnsmasq.d/mydnsmasq.conf
,并进行下列配置
1 | no-poll |
- 测试
1 | dnsmasq --test |
- 另外一种情况是实现泛域名做代理,某个或某些子域名不做代理,例如下面的配置,就实现了
nordstrom.com
整个域的数据拦截下来转发到代理服务器 192.168.127.100 ,而m.nordstrom.com
和mail.nordstrom.com
不做代理
1 | address=/nordstrom.com/192.168.127.100 |
- 把所有.cn的域名全部通过114.114.114.114这台国内DNS服务器来解析
1 | server=/cn/114.114.114.114 |
- 给
*.apple.com
和taobao.com
使用专用的DNS
1 | server=/taobao.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 | all-servers |
Dnsmasq 性能优化
Bind不配合数据库的情况下,经常需要重新载入并读取配置文件,这是造成性能低下的原因。根据这点教训,我们可以考虑不读取 /etc/hosts
文件。而是另外指定一个在共享内存里的文件,比如 /dev/shm/dnsrecord.txt
,这样就不费劲了,又由于内存的非持久性,重启就消失,可以定期同步硬盘上的某个内容到内存文件中。
- 创建一个自定义的配置文件
/etc/dnsmasq.d/mydnsmasq.conf
,并进行下列配置
1 | no-hosts |
- 解决同步问题
1 | chmod +x /etc/rc.local |
- 使用计划任务定时同步内容
1 | */10 * * * * cat /etc/hosts > /dev/shm/dnsrecord.txt |
配置日志功能
创建对应的目录和日志文件,修改文件的属主属组及权限:
1 | mkdir -pv /var/log/dnsmasq/ |
在自定义的配置文件 /etc/dnsmasq.d/mydnsmasq.conf
中添加如下两行配置以开启 log 功能:
1 | log-queries |
重启服务,做几次解析,查看日志是否记录成功:
1 | systemctl daemon-reload |
如果在生产环境中使用 Dnsmasq 作为 DNS 服务器,则会有大量的解析请求,并会记录大量的查询内容到日志中,所以应该做日志切割,避免 log 文件过大造成文件系统使用率不足。
创建 Dnsmasq 的 logrotate 的配置文件 /etc/logrotate.d/dnsmasq
:
1 | /var/log/dnsmasq/*.log { |
执行 logrotate ,确保配置正确(没有报错)
1 | /usr/sbin/logrotate -vf /etc/logrotate.conf |
DHCP配置参数说明
1 | # 选定需要监听的网卡 |
DHCP配置实例
公司使用了三台Linux服务器作为网关为局域网中的其他设备提供IP和路由,以下是其中一个范例 dhcp.conf
- Dnsmasq的全局配置
1 |
|
web端的配置
Dnsmasq的WEB端:https://github.com/luxiaok/DNSmasqWeb
dnsmasq命令选项说明
提示: 查看配置文件语法是否正确,可执行下列命令:
1 | dnsmasq --test |
1 | --test |
参考链接
- http://www.thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html
- http://www.freeoa.net/osuport/servap/dnsmasq-use-intro-refer_2480.html
- https://wiki.archlinux.org/index.php/Dnsmasq_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29
- http://www.yunweipai.com/archives/8664.html
- https://www.cnblogs.com/sunsky303/p/9238669.html