字数 7619,阅读大约需 39 分钟
大家在玩Linux的时候,有没有遇到过这样的问题:局域网里几台机器,想互相用简单的名字访问(比如用“server”代替“192.168.1.100”),而不是每次都输一串难记的IP?或者想让内网的DNS解析更快,减少等待时间?甚至想给内网设备自动分配IP,不用手动设置?
今天要讲的dnsmasq,就是解决这些问题的“全能小工具”——它是一款轻量级DNS、TFTP、PXE、路由通告与DHCP服务器,轻量、简单,不用复杂配置,就能同时实现DNS缓存、DNS解析、DHCP服务,堪称小型局域网(比如家里、工作室、小型服务器集群)的“网络小管家”,专为小型嵌入式系统设计,力求在支持功能的前提下占用最小内存。
很多新手听到“DNS”“DHCP”就头大,别怕!这篇教程全程用“大白话+实操命令”,从原理到用法,从参数到示例,一步步带大家吃透dnsmasq,不管你用的是Rocky Linux(CentOS接班人)还是Ubuntu,跟着做就能上手。
dnsmasq的全称是“DNS masquerade”(DNS伪装/转发),核心作用围绕DNS与DHCP两大核心,同时支持TFTP、PXE等扩展功能,咱们用“快递员”的比喻讲明白核心功能,一看就懂:
补充说明:dnsmasq是轻量级的,占用系统资源极少,哪怕是低配的树莓派、老旧服务器,也能轻松运行;而且它的配置文件简洁,命令参数也不复杂,比bind(复杂DNS服务)、dhcpd(单独DHCP服务)好上手10倍,这也是它在小型网络里普及的原因——甚至很多路由器里,默认用的就是dnsmasq。它可作为一个或多个域的权威DNS服务器,使本地域名出现在全局DNS中,还支持DNSSEC校验,提升解析安全性。
这里要注意一个关键:dnsmasq本身不是“根DNS服务器”,它不会自己去解析所有域名,大部分时候是“转发+缓存”,其核心工作流程如下:当接收到用户的一个DNS请求时,首先会查找/etc/hosts这个文件,若该文件没有请求的记录,再查找/etc/resolv.conf中定义的外部DNS(也叫上游DNS服务器),外部DNS通过递归查询查找到请求后响应给客户端,随后dnsmasq将请求结果缓存到内存中,供后续的解析请求复用。只有你手动配置的“内网域名”,它才会直接解析,既高效又简单。
不管用哪种系统,第一步都是安装dnsmasq。这里重点讲Rocky Linux(因为它是企业级常用,兼容CentOS),同时给出Ubuntu的对应命令,两者操作几乎一致,差别只在“安装命令”和“部分服务管理细节”。
先确认系统版本(可选,避免版本兼容问题):
Rocky Linux查看版本:
cat /etc/rocky-release
# 示例输出:Rocky Linux release 9.2 (Blue Onyx)
Ubuntu查看版本:
cat /etc/lsb-release
# 示例输出:Ubuntu 22.04.3 LTS
Rocky Linux默认的yum仓库(现在叫dnf,yum是dnf的软链接)里就有dnsmasq,直接安装即可,不用额外加仓库:
# 切换到root用户(新手建议,避免权限不足)
su - root
# 安装dnsmasq(dnf和yum都能用,dnf是新版本,推荐用dnf)
dnf install dnsmasq -y
# 或者用yum(兼容旧习惯)
yum install dnsmasq -y
# 安装完成后,查看是否安装成功
rpm -qa | grep dnsmasq
# 示例输出:dnsmasq-2.89-1.el9.x86_64(版本号可能不同,只要有输出就说明成功)
Ubuntu用apt命令安装,同样简单,但有个小坑:Ubuntu默认可能运行着systemd-resolved服务,它会占用53端口(DNS默认端口),导致dnsmasq启动失败(dnsmasq默认监听53端口,可通过-p参数修改),后面会讲解决方法,先安装:
# 切换到root用户
su - root
# 或者用sudo(Ubuntu常用)
sudo -i
# 更新apt仓库(可选,但建议做,避免安装旧版本)
apt update
# 安装dnsmasq
apt install dnsmasq -y
# 查看安装成功与否
dpkg -l | grep dnsmasq
# 示例输出:ii dnsmasq 2.90-0ubuntu0.22.04.1 all Small caching DNS proxy and DHCP/TFTP server
安装完成后,dnsmasq默认是不启动的,我们需要手动启动它,并且设置开机自启(避免重启系统后失效)dnsmasq默认后台运行,可通过-k参数(--keep-in-foreground)强制前台运行,便于调试。
Rocky Linux启动命令:
# 启动dnsmasq服务
systemctl start dnsmasq
# 查看服务状态(重点,确认是否启动成功)
systemctl status dnsmasq
# 成功的标志:Active: active (running)(绿色的运行状态)
# 如果失败,会显示Active: failed,后面会讲排查方法
# 设置开机自启(重启系统后,dnsmasq会自动启动)
systemctl enable dnsmasq
Ubuntu启动命令(注意:如果启动失败,大概率是53端口被占用,先执行下面的命令停止冲突服务,再启动):
# 先停止systemd-resolved服务(解决53端口冲突,关键!)
systemctl stop systemd-resolved
# 禁止systemd-resolved开机自启(避免下次重启又冲突)
systemctl disable systemd-resolved
# 现在启动dnsmasq
systemctl start dnsmasq
# 查看状态
systemctl status dnsmasq
# 设置开机自启
systemctl enable dnsmasq
小技巧:如果启动失败,除了端口冲突,还可以用“dnsmasq --test”命令检查配置文件语法(该命令仅检查语法,不启动服务),全部正常则退出码为0,否则非0;很多时候是配置写错了导致启动失败。此外,可通过-d参数(--no-daemon)进入调试模式,日志同时输出到stderr与syslog,便于排查问题(仅限调试,生产环境禁止使用)。
dnsmasq的用法主要分两种:一种是“临时命令行启动”(适合测试,重启服务后失效),另一种是“修改配置文件启动”(适合长期使用,永久生效)。命令行长选项在BSD系统上若未链接GNU getopt库,可能不可用,但在配置文件中仍可识别;通常缺少参数表示关闭对应功能。
新手建议先从“命令行参数”入手,直观感受每个参数的作用,测试成功后,再把参数写到配置文件里,这样不容易出错。
先记住一个核心:dnsmasq的命令行参数,大部分都和配置文件里的选项对应,格式是“dnsmasq [参数] [值]”,下面我们按“功能分类”,讲解最常用、最实用的参数,每个参数都配详细说明+实战示例”,确保大家能直接复制使用,同时兼顾专业性与易懂性。
DNS缓存是dnsmasq最常用的功能之一,下面这几个参数,能帮你控制缓存的大小、时间,优化解析体验,补充实战场景说明。
小技巧:dnsmasq的缓存是存在内存里的,不是存在硬盘上,所以重启dnsmasq服务后,缓存会清空;收到SIGUSR1信号时,会写入统计信息到系统日志,调试/全日志模式下会转储完整缓存;缓存无法直接查看,也可通过日志或者解析时间来判断是否生效(第二次解析同一个域名,时间会明显变短)。此外,可通过--max-cache-ttl、--min-cache-ttl设置缓存条目的最大/最小TTL,一般不建议人工延长TTL,除非明确知道后果。
这个功能太实用了!比如你内网有一台服务器,IP是192.168.1.100,你可以告诉dnsmasq“server.local”对应这个IP,这样局域网里所有机器,只要输入“server.local”,就能访问这台服务器,不用记IP。
如果你的局域网里有很多设备(比如10台电脑、手机),手动给每台设备设置IP太麻烦,还容易冲突,这时就可以用dnsmasq的DHCP功能,自动分配IP,省心又高效。DHCP功能支持IPv4/IPv6,可设置标签、静态分配、租约管理,兼容PXE/BOOTP网络启动。
注意:开启DHCP功能前,要确保你的dnsmasq服务器的IP是“静态IP”(比如192.168.1.100),不能是动态IP(否则服务器IP变了,DHCP服务会失效)。
前面讲了很多参数,可能大家会觉得复杂,没关系!下面这3个场景,是日常用得最多的,每个场景都给了“完整命令+步骤说明”,不管是Rocky Linux还是Ubuntu,只要替换成自己的IP,就能直接用。
前提:假设你的dnsmasq服务器,内网IP是192.168.1.100(静态IP),网卡名是ens33(根据自己的网卡名修改)。
需求:让局域网里所有设备,通过192.168.1.100解析DNS,开启缓存,加快解析速度,上游DNS用阿里223.5.5.5(稳定、快速);禁止读取系统resolv.conf,避免干扰。
# 1. 停止当前的dnsmasq服务(如果已启动)
systemctl stop dnsmasq
# 2. 用命令行启动(测试,确认正常后,再写入配置文件)
# 参数说明:监听ens33网卡、本机+内网IP,缓存1000条,禁止系统resolv,上游阿里DNS,开启查询日志
dnsmasq -i ens33 -a 127.0.0.1,192.168.1.100 -c 1000 --no-resolv -S 223.5.5.5 --log-queries
# 3. 测试解析(在服务器本机测试,或者局域网其他设备测试)
# 服务器本机测试:指定用192.168.1.100解析baidu.com
dig @192.168.1.100 baidu.com
# 查看解析时间:第一次解析,时间可能在几十ms;第二次解析,时间会变成0ms(缓存生效)
# 示例输出(重点看Query time):
# ;; Query time: 0 msec
# ;; SERVER: 192.168.1.100#53(192.168.1.100)
# 4. 测试成功后,停止前台运行的dnsmasq(按Ctrl+C),用配置文件启动(后面会讲)
# 补充:查看缓存统计(发送SIGUSR1信号)
killall -SIGUSR1 dnsmasq
# 查看系统日志,获取缓存命中/未命中统计
journalctl -u dnsmasq | grep cache
需求:在场景1的基础上,增加内网静态解析功能——给内网服务器(192.168.1.100)设置“小名”server.local,给办公电脑(192.168.1.101)设置“小名”pc.local,局域网所有设备可通过“小名”直接访问对应设备,无需记忆IP;同时保留DNS缓存优化。
# 方法1:临时测试(重启服务后失效,适合快速验证)
# 1. 停止当前dnsmasq服务
systemctl stop dnsmasq
# 2. 启动dnsmasq,同时配置缓存、上游DNS和静态解析(核心命令)
dnsmasq -i ens33 -a 127.0.0.1,192.168.1.100 -c 1000 --no-resolv -S 223.5.5.5 \
-A server.local,192.168.1.100 -A pc.local,192.168.1.101 --log-queries
# 方法2:永久生效(推荐,长期使用)
# 1. 停止当前dnsmasq服务
systemctl stop dnsmasq
# 2. 编辑dnsmasq配置文件
vim /etc/dnsmasq.conf
# 3. 写入以下配置(替换自己的网卡名、IP和域名)
interface=ens33
listen-address=127.0.0.1,192.168.1.100
cache-size=1000
no-resolv
server=223.5.5.5 # 上游DNS,可替换为114.114.114.114
# 静态解析配置(内网“小名”)
address=/server.local/192.168.1.100
address=/pc.local/192.168.1.101
log-queries # 开启查询日志,便于排查问题
# 4. 保存退出,重启dnsmasq服务
systemctl restart dnsmasq
# 5. 测试静态解析是否生效(服务器本机+局域网设备均可测试)
# 测试server.local解析
dig server.local @192.168.1.100
# 测试pc.local解析
dig pc.local @192.168.1.100
# 测试外网解析(验证缓存是否正常)
dig www.taobao.com @192.168.1.100关键说明:静态解析使用-A(配置文件中用address=/域名/IP)参数,优先级高于上游DNS解析,哪怕外网有同名域名,也会优先解析到内网IP;可添加多个-A参数(或address配置),实现多台内网设备“小名”设置;若需泛域名解析(如所有.local结尾域名都解析到192.168.1.100),可添加-A *.local,192.168.1.100(配置文件中写address=/.local/192.168.1.100)。
补充技巧:若内网设备较多,可创建自定义hosts文件(如/etc/dnsmasq.hosts),将所有静态解析记录写入该文件,再在配置文件中添加addn-hosts=/etc/dnsmasq.hosts,无需在主配置文件中频繁添加address配置,更便于管理。
需求:实现局域网全自动化网络管理——开启DNS缓存优化解析速度,开启DHCP自动分配IP(分配范围192.168.1.101-192.168.1.200,子网掩码255.255.255.0,租期2小时),给内网路由器(MAC地址00:11:22:33:44:55)分配固定IP 192.168.1.10,同时给DHCP客户端自动分配网关(192.168.1.1)和DNS服务器(192.168.1.100,即dnsmasq服务器自身);禁止在外网网卡(假设为eth1)提供DHCP服务,避免干扰外网。
# 前提检查:确保dnsmasq服务器IP为静态IP(192.168.1.100),避免IP变动导致服务失效
# 若未设置静态IP,可临时设置(Rocky Linux/Ubuntu通用)
nmcli connection modify ens33 ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns 192.168.1.100 ipv4.method manual
nmcli connection up ens33
# 1. 停止当前dnsmasq服务
systemctl stop dnsmasq
# 2. 编辑dnsmasq配置文件(永久生效,推荐)
vim /etc/dnsmasq.conf
# 3. 写入以下完整配置(按需替换参数)
# 基础配置:指定网卡和监听IP
interface=ens33 # 仅在内网网卡提供服务
listen-address=127.0.0.1,192.168.1.100 # 监听本机和内网IP
no-dhcp-interface=eth1 # 禁止在外网网卡提供DHCP服务
# DNS缓存配置
cache-size=1000 # 缓存大小1000条
no-resolv # 禁止读取系统resolv.conf
server=223.5.5.5 # 上游DNS服务器
# DHCP核心配置
dhcp-range=192.168.1.101,192.168.1.200,255.255.255.0,2h # IP分配范围、掩码、租期(2小时)
# DHCP额外选项:分配网关、DNS、域名后缀
dhcp-option=3,192.168.1.1 # 选项3:网关IP
dhcp-option=6,192.168.1.100 # 选项6:DNS服务器IP(指向自身,实现内网解析)
dhcp-option=option:domain-name,local # 分配域名后缀,设备可直接用“主机名.local”访问
# 静态DHCP:给指定MAC设备分配固定IP(路由器)
# 格式:dhcp-host=MAC地址,固定IP,主机名(主机名可选)
dhcp-host=00:11:22:33:44:55,192.168.1.10,router
# 日志配置(便于排查问题)
log-queries # 记录DNS查询日志
log-dhcp # 记录DHCP分配/释放日志
# 4. 保存退出,重启dnsmasq服务
systemctl restart dnsmasq
# 5. 验证服务是否正常(核心验证步骤)
# 验证1:查看dnsmasq服务状态
systemctl status dnsmasq # 确保Active: active (running)
# 验证2:查看DHCP租约(查看已分配的IP和设备信息)
cat /var/lib/misc/dnsmasq.leases
# 验证3:局域网设备测试(以手机/新电脑为例)
# 1. 让设备连接内网WiFi/网线
# 2. 查看设备IP(应在192.168.1.101-200之间,路由器固定为192.168.1.10)
# 3. 测试DNS解析(可解析外网和内网“小名”)
dig www.baidu.com @192.168.1.100 # 外网解析
dig server.local @192.168.1.100 # 内网解析(若场景2已配置)
# 验证4:测试IP租期(可选)
# 查看租约剩余时间(替换设备IP)
dhcp-lease-list | grep 192.168.1.101关键注意事项(必看):
补充技巧:若需批量设置静态DHCP(如多台服务器),可在配置文件中添加多个dhcp-host配置,或创建dhcp-hostsfile文件,将所有MAC-IP对应关系写入该文件,再在主配置文件中添加dhcp-hostsfile=/etc/dnsmasq.dhcp,便于批量管理。