dnsmasq适合轻量局域网场景,集dns、dhcp、本地域名解析于一体,配置简洁(

为什么直接用 dnsmasq 而不是 bind9 或 isc-dhcp-server
因为你要的不是企业级 DNS 权威解析或 DHCP 高可用集群,而是让局域网几台设备快速上网、访问本地服务(比如 dev.local),同时避免改每台机器的 /etc/hosts。dnsmasq 把 DNS + DHCP + 本地域名映射全塞进一个进程里,配置文件不到 20 行就能跑起来,内存常驻不到 2MB。
它不支持 DNSSEC 验证、不处理区域传输、不能当递归服务器对外提供服务——这些不是缺陷,是设计取舍。如果你在树莓派、OpenWrt 或 CI 测试环境里搭个临时网络,dnsmasq 就是那个“装完就忘”的工具。
dnsmasq 的最小可行 DHCP 配置长什么样
关键不是写全,而是避开默认开启的冲突行为:它默认会尝试读取 /etc/hosts 并监听所有接口,而你往往只想管 192.168.50.0/24 这个网段。
- 先关掉自动加载:
no-hosts(否则/etc/hosts里的条目会偷偷进 DNS) - 指定监听接口:
interface=eth1(别用bind-interfaces,它在 systemd 下容易和 NetworkManager 冲突) - DHCP 段必须带租期和网关:
dhcp-range=192.168.50.100,192.168.50.200,12h - 强制下发 DNS 服务器为自己:
dhcp-option=option:dns-server,192.168.50.1 - 如果网关不是本机 IP,得额外加:
dhcp-option=option:router,192.168.50.1
配完记得 sudo systemctl restart dnsmasq,然后用另一台机器 dhclient -v eth0 测试是否拿到地址和 DNS —— 不要只看 IP,重点看 resolv.conf 里有没有写入你设的 DNS 地址。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
如何让 foo.dev 解析到 192.168.50.10 而不碰 /etc/hosts
直接写 /etc/hosts 看似快,但一来它对 DHCP 分配的客户端无效,二来多人协作时难同步。dnsmasq 提供两种干净方式:
- 用
address=/foo.dev/192.168.50.10:精确匹配该域名,不带子域名(api.foo.dev不命中) - 用
address=/.dev/192.168.50.10:匹配所有.dev后缀,适合整个开发域
注意:这两种写法都要求客户端 DNS 查询发到 dnsmasq 才生效;如果客户端手动设置了公共 DNS(如 8.8.8.8),这条路就走不通。真实场景中,建议配合 DHCP 的 dns-server 选项一起用,确保下发的 DNS 就是它自己。
启动失败常见报错和对应检查点
dnsmasq 启动静默失败很常见,systemd 日志里往往只有 exited with code 2。实际问题集中在三处:
-
Failed to bind port 53: Address already in use→ 先查sudo ss -tulpn | grep ':53',Ubuntu/Debian 默认装了systemd-resolved,它占着 53 端口。要么sudo systemctl disable --now systemd-resolved,要么在dnsmasq.conf加port=5353并改 DHCP 的dns-server为192.168.50.1:5353 -
ignoring nameserver 127.0.0.1→ 配置里写了server=127.0.0.1,但本机没运行其他 DNS 服务,删掉这行即可 - DHCP 分配了 IP 但无法上网 → 检查 Linux 内核 IP 转发是否打开:
sysctl net.ipv4.ip_forward应为1,且防火墙(iptables或nftables)没丢弃 FORWARD 链
真正麻烦的是跨网段转发或 IPv6 场景:一旦开了 enable-ra 或 dhcp-range=::,配置复杂度会指数上升,建议初始阶段彻底禁用 IPv6(bind-interfaces 改成 bind-dynamic 并加 except-interface=lo,再配 no-dhcp-interface=lo)。










