在CentOS7.8下用Dnsmasq安装与配置本地DNS服务器

1.dnsmasq简介

dnsmasq是一个小巧且方便地用于配置DNSDHCP的工具,特别适用于小型网络,最多可支持1000台主机。

1.1主要功能
  • 提供DNS功能,可以解析域名。
  • 提供可选择的DHCP功能,用于自动分配IP地址给局域网内的设备。
1.2  软件特点
1.2.1轻量级与高效
  • Dnsmasq被设计为占用较少的系统资源,适合在资源受限的路由器、防火墙或嵌入式设备上运行。
  • 它能够快速响应DNS查询,减少网络延迟。
1.2.2多功能性
  • 提供DHCP(v4 和 v6)DNSTFTP和路由器广告服务。
  • 支持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*BSDMac 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地址。

当设备请求DHCP服务时,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-orderDnsmasq会严格按照/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服务器的地址。

关于Dnsmasq的使用,下一节进一步介绍。


原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/89154.html

Like (0)
guozi的头像guozi
Previous 2024年6月4日 下午2:07
Next 2024年6月4日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注