大家在玩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到底是个啥?原理很简单!
dnsmasq的全称是“DNS masquerade”(DNS伪装/转发),核心作用围绕DNS与DHCP两大核心,同时支持TFTP、PXE等扩展功能,咱们用“快递员”的比喻讲明白核心功能,一看就懂:
- DNS缓存员:当你第一次访问“www.baidu.com”,dnsmasq会向上游DNS服务器(比如谷歌8.8.8.8、阿里223.5.5.5)查询,拿到IP后,不仅返回给你,还会在自己的“小本本”(内存缓存)里记一笔。下次你再查同一个域名,它不用再麻烦上游服务器,直接从“小本本”里拿,速度快很多(就像快递员把常用地址记在脑子里,不用每次都查地图)。DNS缓存的默认大小为150条,0表示关闭缓存,过大反而会影响性能。
-
DNS解析员:你可以告诉dnsmasq“xxx.local”这个域名对应哪个IP(比如“server.local”对应192.168.1.100),这样局域网里所有机器,只要用这个域名,就能直接找到目标设备,不用记IP——相当于给内网设备起了“小名”。这一功能通过静态解析参数实现,支持泛域名、多域名绑定,还能加载自定义hosts文件,优先级高于上游DNS解析。
-
DHCP管理员:自动给局域网里的设备(电脑、手机、打印机)分配IP地址、子网掩码、网关等信息,不用手动给每台设备设置IP,避免IP冲突(就像物业给新入住的业主自动分配门牌号,不用业主自己找)。DHCP功能支持静态地址分配、多网络、租约管理,还能根据设备标签下发不同配置,兼容BOOTP与PXE网络启动。
补充说明:dnsmasq是轻量级的,占用系统资源极少,哪怕是低配的树莓派、老旧服务器,也能轻松运行;而且它的配置文件简洁,命令参数也不复杂,比bind(复杂DNS服务)、dhcpd(单独DHCP服务)好上手10倍,这也是它在小型网络里普及的原因——甚至很多路由器里,默认用的就是dnsmasq。它可作为一个或多个域的权威DNS服务器,使本地域名出现在全局DNS中,还支持DNSSEC校验,提升解析安全性。
这里要注意一个关键:dnsmasq本身不是“根DNS服务器”,它不会自己去解析所有域名,大部分时候是“转发+缓存”,其核心工作流程如下:当接收到用户的一个DNS请求时,首先会查找/etc/hosts这个文件,若该文件没有请求的记录,再查找/etc/resolv.conf中定义的外部DNS(也叫上游DNS服务器),外部DNS通过递归查询查找到请求后响应给客户端,随后dnsmasq将请求结果缓存到内存中,供后续的解析请求复用。只有你手动配置的“内网域名”,它才会直接解析,既高效又简单。
二、前置准备:安装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
2.1 Rocky Linux安装dnsmasq
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(版本号可能不同,只要有输出就说明成功)
2.2 Ubuntu安装dnsmasq
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
2.3 启动并设置开机自启
安装完成后,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命令行参数详解
dnsmasq的用法主要分两种:一种是“临时命令行启动”(适合测试,重启服务后失效),另一种是“修改配置文件启动”(适合长期使用,永久生效)。命令行长选项在BSD系统上若未链接GNU getopt库,可能不可用,但在配置文件中仍可识别;通常缺少参数表示关闭对应功能。
新手建议先从“命令行参数”入手,直观感受每个参数的作用,测试成功后,再把参数写到配置文件里,这样不容易出错。
先记住一个核心:dnsmasq的命令行参数,大部分都和配置文件里的选项对应,格式是“dnsmasq [参数] [值]”,下面我们按“功能分类”,讲解最常用、最实用的参数,每个参数都配详细说明+实战示例”,确保大家能直接复制使用,同时兼顾专业性与易懂性。
3.1 基础参数(必学,控制dnsmasq的基本运行)
| 参数 | 详细说明 | 通用示例 | |
|---|---|---|---|
| -h / –help | 显示所有命令行选项;扩展用法:–help dhcp显示已知DHCPv4配置选项,–help dhcp6显示DHCPv6选项。大白话:查看所有dnsmasq参数的帮助信息,忘记参数时,直接输这个命令,相当于“说明书”。 | dnsmasq -h(输完后会列出所有参数,按q退出);查看DHCPv4选项:dnsmasq –help dhcp | |
| -v / –version | 打印版本号。大白话:查看dnsmasq的版本号,排查版本兼容问题时有用(比如某些参数只支持高版本)。 | dnsmasq -v示例输出:Dnsmasq version 2.89 Copyright (c) 2000-2022 Simon Kelley | |
| -p <端口> | 监听在指定端口而非标准DNS端口53;设为0完全关闭DNS功能,仅保留DHCP/TFTP。大白话:指定dnsmasq的DNS服务端口,默认是53(DNS标准端口),如果53端口被占用(比如Ubuntu的systemd-resolved),可以用这个参数改端口(比如改到5353),但注意:客户端也要对应改DNS端口,否则无法解析。 | # 临时将DNS端口改为5353,测试启动dnsmasq -p 5353# 查看端口是否被占用(验证)netstat -tulnp | grep dnsmasq# 示例输出:tcp 0 0 0.0.0.0:5353 0.0.0.0:* LISTEN 1234/dnsmasq |
| -i <网卡名> | 仅在指定接口监听;使用该参数时,dnsmasq自动加入回环接口;接口名支持末尾*通配。大白话:指定dnsmasq监听的网卡(比如eth0、ens33),只允许该网卡接收DNS/DHCP请求,避免其他网卡干扰(比如服务器有外网网卡和内网网卡,只让内网网卡提供服务)。 | # 先查看自己的网卡名(关键,别输错)ip addr# 假设网卡名是ens33,指定监听该网卡dnsmasq -i ens33# 通配示例:监听所有ens开头的网卡dnsmasq -i ens* | |
| -a | 仅监听指定IP;可与-i参数共用;若只设该参数不设-i,不会自动监听回环,必须显式写127.0.0.1;可同时指定多个IP,用逗号分隔。大白话:指定dnsmasq监听的IP地址(和-i参数类似,更精准),比如只让192.168.1.100这个IP提供服务,其他IP不响应请求。建议同时包含127.0.0.1(本机)和内网IP。 | # 指定监听本机(127.0.0.1)和内网IP(192.168.1.100)dnsmasq -a 127.0.0.1,192.168.1.100# 注意:仅指定内网IP,不监听回环(不推荐)dnsmasq -a 192.168.1.100 | |
| -x | 指定PID文件路径,默认/var/run/dnsmasq.pid;若不带参数(–pid-file),则禁止写入PID文件。大白话:指定dnsmasq的PID文件路径(PID文件记录dnsmasq的进程ID,方便管理服务),默认路径无需修改,除非有特殊需求。 | # 指定PID文件路径为/var/run/my-dnsmasq.piddnsmasq -x /var/run/my-dnsmasq.pid# 禁止写入PID文件(仅命令行可用)dnsmasq –pid-file |
3.2 DNS缓存相关参数(优化解析速度,必学)
DNS缓存是dnsmasq最常用的功能之一,下面这几个参数,能帮你控制缓存的大小、时间,优化解析体验,补充实战场景说明。
| 参数 | 详细说明 | 实战示例 |
|---|---|---|
| -c <数量> | 设置DNS缓存大小,默认150条;0表示关闭缓存;过大影响性能。大白话:设置DNS缓存的最大条目数(就是“小本本”能记多少个域名-IP对应关系),如果局域网设备多、访问的域名多,可以改大一点(比如1000),缓存越多,解析越快;如果设备少,默认就够用。 | # 设置缓存最大条目数为1000条dnsmasq -c 1000# 关闭DNS缓存(仅保留其他功能)dnsmasq -c 0# 验证:启动后,用dig命令查几个域名,再查缓存(后面会讲怎么看缓存) |
| -t <秒数> | 对应–local-ttl,当应答来自/etc/hosts、配置或DHCP租约文件时,可为这些应答设置TTL(秒);默认TTL为0,表示客户端不应缓存;设为0可使DHCP信息不受–local-ttl影响。大白话:设置缓存的默认过期时间(“小本本”里的记录多久过期),默认跟着上游DNS的过期时间走,一般不用改,测试时可强制设置(比如3600秒=1小时)。 | # 设置缓存默认过期时间为3600秒(1小时)dnsmasq -t 3600# 单独设置DHCP租约应答的TTL(参数–dhcp-ttl)dnsmasq –dhcp-ttl 1800 |
| -k | –keep-in-foreground,启动后不进入后台,其余正常运行;用于daemontools、launchd等托管场景,区别于调试模式。大白话:让dnsmasq在前台运行(默认是后台运行),配合日志参数,适合测试时查看实时解析日志,方便排查问题(生产环境可用于托管场景)。 | # 前台运行dnsmasq,同时开启缓存(1000条)dnsmasq -k -c 1000# 生产托管场景(前台运行,不调试)dnsmasq -k –log-facility=/var/log/dnsmasq.log |
| –log-queries | 记录dnsmasq处理的DNS查询结果;收到SIGUSR1时完整转储缓存;–log-queries=extra可在每行开头增加序列号、请求者IP等额外信息。大白话:开启DNS查询日志,每一次DNS解析请求,都会记录到日志里(默认日志路径/var/log/daemon.log),排查DNS解析问题的“神器”。 | # 前台运行,开启缓存,同时记录查询日志(带额外信息)dnsmasq -k -c 1000 –log-queries=extra# 此时,用其他设备查DNS,就能在控制台看到实时日志(含请求者IP) |
| –no-cache | 等价于-c 0,关闭DNS缓存;区别于–no-negcache(关闭否定缓存)。大白话:禁用DNS缓存(不记“小本本”,每次查询都向上游服务器请求),一般用于测试(比如测试上游DNS是否正常),平时不用开启。 | # 禁用缓存,每次查询都走上游DNSdnsmasq –no-cache# 禁用否定缓存(不缓存“不存在”的域名结果)dnsmasq –no-negcache |
小技巧:dnsmasq的缓存是存在内存里的,不是存在硬盘上,所以重启dnsmasq服务后,缓存会清空;收到SIGUSR1信号时,会写入统计信息到系统日志,调试/全日志模式下会转储完整缓存;缓存无法直接查看,也可通过日志或者解析时间来判断是否生效(第二次解析同一个域名,时间会明显变短)。此外,可通过–max-cache-ttl、–min-cache-ttl设置缓存条目的最大/最小TTL,一般不建议人工延长TTL,除非明确知道后果。
3.3 DNS解析相关参数(内网域名“小名”设置,必学)
这个功能太实用了!比如你内网有一台服务器,IP是192.168.1.100,你可以告诉dnsmasq“server.local”对应这个IP,这样局域网里所有机器,只要输入“server.local”,就能访问这台服务器,不用记IP。
| 参数 | 详细说明 | 实战示例(最常用) |
|---|---|---|
| -A <域名>, | –address=/<域名>/,对指定域下任意主机强制返回指定IP(IPv4/IPv6),绝不转发;/#/匹配所有域,无IP返回NXDOMAIN,#返回空地址0.0.0.0/::;可同时指定多个域名。大白话:手动指定“域名-IP”对应关系(静态解析),相当于在dnsmasq里临时加了一条“hosts记录”,优先级最高,支持泛域名解析。 | # 示例1:指定server.local对应192.168.1.100dnsmasq -A server.local,192.168.1.100# 示例2:指定多个域名dnsmasq -A server.local,192.168.1.100 -A pc.local,192.168.1.101# 示例3:泛域名解析(所有.local结尾域名解析到192.168.1.100)dnsmasq -A *.local,192.168.1.100# 示例4:屏蔽广告域名(返回空地址)dnsmasq -A ad.example.com,# |
| -S <上游DNS服务器IP> | –server=[/<域名>/][[#<端口>]],直接指定上游服务器IP;可限定仅用于某些域名,#端口指定非标准端口,无IP仅域名表示该域为本地域,不转发;可指定多个,优先级从左到右。大白话:指定上游DNS服务器(dnsmasq解析不了的域名,找谁帮忙),默认用系统/etc/resolv.conf里的DNS,常用阿里、谷歌、114DNS。 | # 指定上游DNS为阿里223.5.5.5和谷歌8.8.8.8(非标准端口示例)dnsmasq -S 223.5.5.5 -S 8.8.8.8#5353# 限定example.com域名走114DNSdnsmasq -S /example.com/114.114.114.114# 结合静态解析,实战用法(推荐)dnsmasq -A server.local,192.168.1.100 -S 223.5.5.5 -c 1000 |
| –no-resolv | 不读取/etc/resolv.conf,仅从命令行/配置文件获取上游服务器;对应–resolv-file(指定读取上游DNS的文件)。大白话:禁止dnsmasq读取系统/etc/resolv.conf里的上游DNS,避免系统DNS被修改导致解析异常,建议长期使用时开启。 | # 禁止读取系统resolv.conf,手动指定上游DNS为114.114.114.114dnsmasq –no-resolv -S 114.114.114.114# 指定读取自定义resolv文件(替代–no-resolv)dnsmasq –resolv-file=/etc/dnsmasq.resolv |
| -H | –addn-hosts=<文件>,附加主机文件;除/etc/hosts外再读取指定文件;若同时使用–no-hosts(不读取/etc/hosts),则只读取此文件;可重复使用添加多个文件,给定目录则读取该目录下所有文件。大白话:指定dnsmasq读取的自定义hosts文件,不用修改系统默认hosts,更灵活。 | # 1. 先创建自定义hosts文件,写入静态解析记录echo “192.168.1.100 server.local” > /etc/dnsmasq.hosts# 2. 指定dnsmasq读取这个文件(不读取系统hosts)dnsmasq -H /etc/dnsmasq.hosts –no-hosts# 3. 读取目录下所有hosts文件dnsmasq -H /etc/dnsmasq/hosts.d |
| –bogus-nxdomain= | 将包含指定IP/子网的应答转换为“无此域”(NXDOMAIN);用于对抗恶意运营商将不存在域名指向广告页的行为;支持子网掩码限定。大白话:DNS反劫持参数,有些运营商会把不存在的域名解析到广告IP,用这个参数屏蔽该IP,避免被劫持。 | # 假设劫持IP是10.0.0.1,屏蔽单个IPdnsmasq –bogus-nxdomain=10.0.0.1# 屏蔽整个子网(10.0.0.0/24)dnsmasq –bogus-nxdomain=10.0.0.0/24# 补充:忽略劫持IP(不报错,继续等待其他应答)dnsmasq –ignore-address=10.0.0.1 |
3.4 DHCP相关参数(内网自动分配IP,实用功能)
如果你的局域网里有很多设备(比如10台电脑、手机),手动给每台设备设置IP太麻烦,还容易冲突,这时就可以用dnsmasq的DHCP功能,自动分配IP,省心又高效。DHCP功能支持IPv4/IPv6,可设置标签、静态分配、租约管理,兼容PXE/BOOTP网络启动。
注意:开启DHCP功能前,要确保你的dnsmasq服务器的IP是“静态IP”(比如192.168.1.100),不能是动态IP(否则服务器IP变了,DHCP服务会失效)。
| 参数 | 详细说明 | 实战示例 | |
|---|---|---|---|
| –dhcp-range=<起始IP>,<结束IP>,<子网掩码>,<租期> | –dhcp-range=[tag:<标签>,][set:<标签>,]<起始地址>[,<结束地址> | <模式>][,<掩码>[,<广播>]][,<租约时间>];启用DHCP服务器,支持标签、静态模式、代理模式;租约时间支持秒/分/小时/infinite(永久)/deprecated;IPv6支持自动生成范围。大白话:最核心的DHCP参数,指定IP分配范围、子网掩码、IP租期(设备占用IP的时间,到期可续租),默认租期12小时,建议设为2h-24h。 | # 示例1:IPv4动态分配(范围192.168.1.101-200,掩码255.255.255.0,租期2小时)dnsmasq –dhcp-range=192.168.1.101,192.168.1.200,255.255.255.0,2h# 示例2:仅静态分配(不动态分配IP)dnsmasq –dhcp-range=192.168.1.101,192.168.1.200,255.255.255.0,static# 示例3:永久租约(谨慎使用)dnsmasq –dhcp-range=192.168.1.101,192.168.1.200,255.255.255.0,infinite |
| –dhcp-option=<选项号>,<值> | –dhcp-option=[tag:<标签>,][option:<选项名> | 编号],[<值>…];设置DHCP选项(网关、DNS、域名、NTP等);支持按标签给不同设备下发不同配置。大白话:给DHCP客户端分配额外的网络参数,常用选项号:3(网关)、6(DNS服务器)、1(子网掩码)、28(广播地址);DNS建议设为dnsmasq自身IP。 | # 示例:分配网关192.168.1.1,DNS服务器192.168.1.100(自身IP)dnsmasq –dhcp-range=192.168.1.101,192.168.1.200,255.255.255.0,2h –dhcp-option=3,192.168.1.1 \ # 网关(选项号3)–dhcp-option=6,192.168.1.100 \ # DNS服务器(选项号6)–dhcp-option=option:domain-name,local # 分配域名后缀(用选项名) |
| –dhcp-host=,<固定IP>,<主机名> | 静态分配DHCP地址、主机名、MAC绑定;支持MAC通配符、客户端ID、DUID、标签;可省略主机名,仅绑定MAC与IP。大白话:给指定设备分配“固定IP”(静态DHCP),比如路由器、服务器,需要固定IP;需知道设备MAC地址,主机名可选(给设备起名字)。 | # 示例1:绑定MAC与固定IP,指定主机名dnsmasq –dhcp-range=192.168.1.101,192.168.1.200,255.255.255.0,2h –dhcp-option=3,192.168.1.1 –dhcp-option=6,192.168.1.100 –dhcp-host=00:11:22:33:44:55,192.168.1.10,router# 示例2:MAC通配符(匹配00:11:22开头的设备)dnsmasq –dhcp-host=00:11:22:::*,192.168.1.11,test-pc | |
| –no-dhcp-interface=<网卡名> | –no-dhcp-interface=<接口名>,在指定接口不提供DHCP/TFTP,但提供DNS;支持接口通配符;优先级高于–interface。大白话:禁止在某个网卡上提供DHCP服务,比如服务器有外网、内网网卡,只让内网网卡提供DHCP,避免给外网设备分配IP。 | # 禁止在外网网卡eth1上提供DHCP服务,只在eth0上提供dnsmasq –dhcp-range=192.168.1.101,192.168.1.200,255.255.255.0,2h –no-dhcp-interface=eth1# 禁止所有eth开头的网卡提供DHCPdnsmasq –dhcp-range=192.168.1.101,192.168.1.200,255.255.255.0,2h –no-dhcp-interface=eth* |
3.5 其他实用参数(锦上添花,解决特殊需求)
| 参数 | 详细说明 | 示例 |
|---|---|---|
| –enable-tftp | 启用TFTP服务器(只读,用于网络启动);可指定接口,仅在该接口提供TFTP服务;内置安全、只读的TFTP服务器,支持DHCP主机网络启动/PXE启动。大白话:启用TFTP服务(简单文件传输协议),配合dhcp-boot参数,可实现PXE网络启动(批量安装系统),适合机房、多服务器场景。 | # 启用TFTP服务,指定TFTP根目录为/tftpdnsmasq –enable-tftp –tftp-root=/tftp# 仅在ens33网卡提供TFTP服务dnsmasq –enable-tftp=ens33 –tftp-root=/tftp |
| –dhcp-boot=<文件名>,<服务器名>,<服务器IP> | –dhcp-boot=[tag:<标签>,]<文件名>,[<服务器名>[,<服务器地址>]];PXE启动相关参数,指定PXE启动文件的路径、服务器名和IP;支持按标签给不同设备指定不同启动文件;配合TFTP服务使用。大白话:PXE启动核心参数,指定启动文件路径,批量安装系统时常用。 | # 指定PXE启动文件为/boot/pxelinux.0,服务器IP为192.168.1.100dnsmasq –enable-tftp –tftp-root=/tftp –dhcp-boot=/boot/pxelinux.0,pxeserver,192.168.1.100# 按标签指定不同启动文件(仅tag:pxe的设备生效)dnsmasq –enable-tftp –tftp-root=/tftp –dhcp-boot=tag:pxe,/boot/pxelinux.0,pxeserver,192.168.1.100 |
| –log-dhcp | 详细记录DHCP日志(选项、标签、租约分配/释放信息);可配合–quiet-dhcp静默常规日志,只打印错误信息。大白话:开启DHCP日志,记录每台设备的IP分配情况,排查DHCP问题时有用(比如设备拿不到IP,看日志找原因)。 | # 开启DHCP日志,同时开启DNS查询日志,前台运行dnsmasq -k –log-queries –log-dhcp# 静默常规DHCP日志,只打印错误dnsmasq -k –log-queries –log-dhcp –quiet-dhcp |
四、实战演练:3个最常用场景
前面讲了很多参数,可能大家会觉得复杂,没关系!下面这3个场景,是日常用得最多的,每个场景都给了“完整命令+步骤说明”,不管是Rocky Linux还是Ubuntu,只要替换成自己的IP,就能直接用。
前提:假设你的dnsmasq服务器,内网IP是192.168.1.100(静态IP),网卡名是ens33(根据自己的网卡名修改)。
场景1:仅开启DNS缓存(优化局域网DNS解析速度)
需求:让局域网里所有设备,通过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
场景2:DNS缓存+内网静态解析(给内网设备起“小名”)
需求:在场景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配置,更便于管理。
场景3:DNS缓存+DHCP自动分配IP(内网全自动化网络管理)
需求:实现局域网全自动化网络管理——开启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服务前,必须确保dnsmasq服务器IP为静态IP,否则服务器IP变动后,DHCP客户端将无法正常获取网络配置;
- DHCP分配范围(192.168.1.101-200)需避开静态IP(如服务器192.168.1.100、路由器192.168.1.10),避免IP冲突;
- 若局域网内已有其他DHCP服务器(如路由器自带DHCP),需先停止其他DHCP服务,否则会出现IP分配冲突,导致设备无法正常上网;
-
静态DHCP配置中,MAC地址需准确(可通过ip addr show命令在对应设备上查看),MAC地址错误会导致设备无法获取固定IP;
- 租期建议设为2-24小时,租期过短会导致设备频繁续租,增加服务器压力;租期过长(如infinite永久)适合固定设备,不适合移动设备(如手机、临时接入的电脑)。
补充技巧:若需批量设置静态DHCP(如多台服务器),可在配置文件中添加多个dhcp-host配置,或创建dhcp-hostsfile文件,将所有MAC-IP对应关系写入该文件,再在主配置文件中添加dhcp-hostsfile=/etc/dnsmasq.dhcp,便于批量管理。