1.dnsmasq简介
dnsmasq
是一个小巧且方便地用于配置DNS
和DHCP
的工具,特别适用于小型网络,最多可支持1000
台主机。
1.1主要功能
-
提供 DNS
功能,可以解析域名。 -
提供可选择的 DHCP
功能,用于自动分配IP
地址给局域网内的设备。
1.2 软件特点
1.2.1轻量级与高效
-
Dnsmasq
被设计为占用较少的系统资源,适合在资源受限的路由器、防火墙或嵌入式设备上运行。 -
它能够快速响应 DNS
查询,减少网络延迟。
1.2.2多功能性
-
提供 DHCP(v4 和 v6)
、DNS
、TFTP
和路由器广告服务。 -
支持 PXE
(预启动执行环境)以支持网络启动。 -
可作为权威 DNS
服务器或递归DNS
服务器使用。
1.2.3配置简单
-
配置文件(通常为 /etc/dnsmasq.conf
)易于阅读和编辑。 -
支持多种配置方式,包括读取 /etc/hosts
文件、DHCP
租约等。
1.2.4IPv6 支持
-
提供完整的 IPv6
支持,包括DHCPv6
和路由器广告。 -
允许使用 DHCPv4
名称信息为自动配置的IPv6
地址提供DNS
条目。
1.2.5安全性
-
支持 DNSSEC
验证,确保DNS
查询的完整性和真实性。 -
可以通过配置防止某些类型的 DNS
欺骗和缓存中毒攻击。
1.2.6灵活性
-
允许将特定子域或域名重定向到特定的上游 DNS
服务器。 -
支持多种上游 DNS
服务器配置方式,包括动态更新。 -
提供对 DHCP
租约和DNS
记录的细粒度控制。
1.2.7国际化支持
-
支持国际化域名( IDN
),允许在域名中使用非ASCII
字符。
1.2.8兼容性
-
跨平台支持,包括 Linux(glibc 和 uclibc)
、Android
、*BSD
、Mac OS X
等。 -
被集成到许多 Linux
发行版和BSD
系的端口系统中。
1.2.9扩展性
-
提供钩子( hooks
)和脚本接口,允许用户根据需要自定义行为。 -
可以与其他网络工具(如防火墙、 VPN
客户端等)集成。
1.2.10稳定性与可靠性
-
经过广泛测试,被大量用户在实际环境中使用。
-
具有良好的错误处理和恢复机制。
Dnsmasq 的这些特点使得它成为许多小型网络和应用场景的首选网络基础设施软件。
2.Dnsmasq工作原理
Dnsmasq
的工作原理可以概括为以下几个步骤:
1)请求接收
当Dnsmasq
接收到一个DNS
请求时,它首先会开始处理这个请求。
2)本地hosts文件查找
Dnsmasq
会首先查找本地的/etc/hosts
文件,看是否有对应的域名记录。
如果在/etc/hosts
文件中找到了请求的记录,它会立即返回这个记录对应的IP
地址。
3)本地DNS缓存查找
如果在/etc/hosts
文件中没有找到记录,Dnsmasq
会接着查找其本地DNS
缓存记录。
如果缓存中有这个请求的记录,它会直接返回缓存中的IP
地址。
4)上游DNS服务器查询
如果在本地hosts
文件和缓存中都没有找到记录,Dnsmasq
会按照/etc/resolv.conf
文件中定义的上游DNS
服务器进行递归查询。
上游DNS
服务器会递归查询DNS
层级结构,直到找到对应的IP
地址。
5)结果返回与缓存
当从上游DNS
服务器获取到IP
地址后,Dnsmasq
会将这个结果返回给请求的客户端。
同时,为了加快后续的查询速度,Dnsmasq
会将这个结果缓存到本地,以便后续的相同请求可以直接从缓存中获取。
6)DHCP服务(如果配置为DHCP服务器)
除了DNS
服务外,Dnsmasq
还可以配置为DHCP
服务器,为局域网内的设备分配IP
地址。
当设备请求DHC
P服务时,Dnsmasq
会按照配置的DHCP
参数进行响应,并可能将分配的IP
地址与域名绑定,以便后续的DNS
查询。
7)配置文件读取
Dnsmasq
默认会从/etc/dnsmasq.conf
文件中读取配置信息。
管理员可以根据需要修改这个配置文件,以调整Dnsmasq
的行为和参数。
总结来说,Dnsmasq
通过本地hosts
文件、本地DNS
缓存和上游DNS
服务器来解析DNS
请求,同时它还可以作为DHCP
服务器为局域网内的设备分配IP
地址。这种设计使得Dnsmasq
成为一个轻量级且功能强大的网络工具,特别适用于小型网络和资源有限的环境。
3.安装Dnsmasq
这里采用yum
方式直接安装:
[root@shad0w-top ~]# yum -y install dnsmasq
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.bfsu.edu.cn
* extras: mirrors.huaweicloud.com
* updates: mirrors.bfsu.edu.cn
正在解决依赖关系
--> 正在检查事务
---> 软件包 dnsmasq.x86_64.0.2.76-10.el7_7.1 将被 升级
---> 软件包 dnsmasq.x86_64.0.2.76-17.el7_9.3 将被 更新
--> 解决依赖关系完成
依赖关系解决
=============================================================================================================
Package 架构 版本 源 大小
=============================================================================================================
正在更新:
dnsmasq x86_64 2.76-17.el7_9.3 updates 281 k
事务概要
=============================================================================================================
升级 1 软件包
总计:281 k
Downloading packages:
警告:/var/cache/yum/x86_64/7/updates/packages/dnsmasq-2.76-17.el7_9.3.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
从 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 检索密钥
导入 GPG key 0xF4A80EB5:
用户ID : “CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>”
指纹 : 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
软件包 : centos-release-7-8.2003.0.el7.centos.x86_64 (@anaconda)
来自 : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在更新 : dnsmasq-2.76-17.el7_9.3.x86_64 1/2
清理 : dnsmasq-2.76-10.el7_7.1.x86_64 2/2
验证中 : dnsmasq-2.76-17.el7_9.3.x86_64 1/2
验证中 : dnsmasq-2.76-10.el7_7.1.x86_64 2/2
更新完毕:
dnsmasq.x86_64 0:2.76-17.el7_9.3
完毕!
[root@shad0w-top ~]#
安装完成后,用下列命令查看当前安装的版本:
[root@shad0w-top ~]# dnsmasq -v
Dnsmasq version 2.76 Copyright (c) 2000-2016 Simon Kelley
Compile time options: IPv6 GNU-getopt DBus no-i18n IDN DHCP DHCPv6 no-Lua TFTP no-conntrack ipset auth nettlehash no-DNSSEC loop-detect inotify
This software comes with ABSOLUTELY NO WARRANTY.
Dnsmasq is free software, and you are welcome to redistribute it
under the terms of the GNU General Public License, version 2 or 3.
[root@shad0w-top ~]#
4.配置Dnsmasq
Dnsmasq
的主要配置文件是/etc/dnsmasq.conf
,通过vim
进行编辑:
4.1配置监听地址
默认情况下,Dnsmasq
会监听在本地回环地址(127.0.0.1)上。一般我们希望Dnsmasq
在局域网内为其他设备提供服务,这时候就需要添加本机的局域网IP
地址,如listen-address=192.168.250.40.2。
listen-address=192.168.250.40
4.2配置上游DNS服务器
可以通过resolv-file
选项指定一个包含上游DNS
服务器地址的文件,或者直接在配置文件中使用server
选项添加。
resolv-file=/etc/resolv.dnsmasq.conf
然后,新建/etc/resolv.dnsmasq.conf
文件,并进行编辑,添加多个nameserver
行来指定多个上游DNS
服务器:
[root@shad0w-top ~]# vim /etc/resolv.dnsmasq.conf
nameserver 8.8.8.8
nameserver 114.114.114.114
/etc/resolv.dnsmasq.conf
中设置的是真正的nameserver
,可以用一些公共的DNS
。
4.3配置本地hosts文件
Dnsmasq
可以加载一个自定义的hosts
文件,以提供域名到IP
地址的映射。可以使用addn-hosts
选项指定这个文件的路径,如:
vim /etc/dnsmasq.conf
addn-hosts=/etc/dnsmasq.hosts
然后编辑:
[root@shad0w-top ~]# vim /etc/dnsmasq.hosts
192.168.250.120 testa.com
192.168.250.121 testb.com
192.168.250.122 testc.com
……
4.4其他配置
1)取消strict-order
前面的注册#号
当Dnsmasq
作为DNS
缓存服务器或转发器时,它会使用多个上游DNS
服务器来解析域名。strict-order
选项决定了Dnsmasq
在查询这些上游服务器时的顺序。
如果启用了strict-order
,Dnsmasq
会严格按照/etc/dnsmasq.conf
(或指定配置文件)中列出的上游DNS
服务器的顺序进行查询,直到找到第一个能够成功解析的服务器为止。
strict-order
2)取消从本地hosts
读取
默认的情况下,dnsmasq
会首先寻找本地的hosts
文件再去寻找缓存下来的域名, 最后去上游dns
服务器寻找。
当no-hosts
选项被启用(即取消注释或设置为yes
)时,dnsmasq
将不会加载或使用/etc/hosts
文件中的任何条目进行域名解析。这意味着,对于在/etc/hosts
文件中定义的本地主机名到IP
地址的映射,dnsmasq
将不会处理这些请求,并且这些主机名可能无法被解析,除非在dnsmasq
的其他配置中或通过其他DNS
服务器进行了定义。
no-hosts
5.启动Dnsmasq服务
安装并配置好Dnsmasq
后,需要启动Dnsmasq
服务并设置它为开机自启:
[root@shad0w-top ~]# systemctl start dnsmasq
[root@shad0w-top ~]# systemctl enable dnsmasq
Created symlink from /etc/systemd/system/multi-user.target.wants/dnsmasq.service to /usr/lib/systemd/system/dnsmasq.service.
[root@shad0w-top ~]#
注:可能遇到的问题
这里可能出现启动失败,查看如下:
[root@shad0w-top ~]# netstat -tunlp | grep dnsmasq
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1510/dnsmasq
udp 0 0 192.168.122.1:53 0.0.0.0:* 1510/dnsmasq
udp 0 0 0.0.0.0:67 0.0.0.0:* 1510/dnsmasq
[root@shad0w-top ~]# systemctl status dnsmasq
● dnsmasq.service - DNS caching server.
Loaded: loaded (/usr/lib/systemd/system/dnsmasq.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since 一 2024-06-03 12:46:04 CST; 2min 13s ago
Process: 17035 ExecStart=/usr/sbin/dnsmasq -k (code=exited, status=2)
Main PID: 17035 (code=exited, status=2)
6月 03 12:46:04 shad0w-top systemd[1]: Started DNS caching server..
6月 03 12:46:04 shad0w-top dnsmasq[17035]: dnsmasq: failed to create listening socket for port 53: Address already in use
6月 03 12:46:04 shad0w-top systemd[1]: dnsmasq.service: main process exited, code=exited, status=2/INVALIDARGUMENT
6月 03 12:46:04 shad0w-top systemd[1]: Unit dnsmasq.service entered failed state.
6月 03 12:46:04 shad0w-top systemd[1]: dnsmasq.service failed.
[root@shad0w-top ~]#
【解决办法:】
在Dnsmasq
中,bind-interfaces
是一个重要的配置选项,它决定了Dnsmasq
服务将绑定到哪些网络接口上。
这里启用:
[root@shad0w-top ~]# vim /etc/dnsmasq.conf
bind-interfaces
然后重启Dnsmasq服务并进行查看状态:
[root@shad0w-top ~]# systemctl restart dnsmasq
[root@shad0w-top ~]# systemctl status dnsmasq
● dnsmasq.service - DNS caching server.
Loaded: loaded (/usr/lib/systemd/system/dnsmasq.service; enabled; vendor preset: disabled)
Active: active (running) since 一 2024-06-03 12:55:29 CST; 7s ago
Main PID: 17614 (dnsmasq)
Tasks: 1
CGroup: /system.slice/dnsmasq.service
└─17614 /usr/sbin/dnsmasq -k
6月 03 12:55:29 shad0w-top systemd[1]: Started DNS caching server..
6月 03 12:55:29 shad0w-top dnsmasq[17614]: listening on eth0(#5): 192.168.250.40
6月 03 12:55:29 shad0w-top dnsmasq[17614]: started, version 2.76 cachesize 150
6月 03 12:55:29 shad0w-top dnsmasq[17614]: compile time options: IPv6 GNU-getopt DBus no-i18n IDN DHCP DHCPv6 no-Lua TFTP no-conntrack ipset auth nettlehash no-DNSSEC loop-detect inotify
6月 03 12:55:29 shad0w-top dnsmasq[17614]: reading /etc/resolv.dnsmasq.conf
6月 03 12:55:29 shad0w-top dnsmasq[17614]: using nameserver 8.8.8.8#53
6月 03 12:55:29 shad0w-top dnsmasq[17614]: using nameserver 114.114.114.114#53
6月 03 12:55:29 shad0w-top dnsmasq[17614]: cleared cache
[root@shad0w-top ~]#
端口信息:
[root@shad0w-top ~]# netstat -tunlp | grep 53
tcp 0 0 192.168.250.40:53 0.0.0.0:* LISTEN 17614/dnsmasq
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1510/dnsmasq
udp 0 0 0.0.0.0:5353 0.0.0.0:* 618/avahi-daemon: r
udp 0 0 192.168.250.40:53 0.0.0.0:* 17614/dnsmasq
udp 0 0 192.168.122.1:53 0.0.0.0:* 1510/dnsmasq
[root@shad0w-top ~]#
6.使用Dnsmasq
在局域网交换机DHCP服务中配置DNS服务器的地址为Dnsmasq服务器的地址,或者手动指定终端的DNS服务器地址为Dnsmasq服务器的地址。
原创文章,作者:速盾高防cdn,如若转载,请注明出处:https://www.sudun.com/ask/88639.html