Dnsmasq 服务搭建完全教程 / 第 01 章:Dnsmasq 概述
第 01 章:Dnsmasq 概述
1.1 什么是 Dnsmasq
Dnsmasq 是由 Simon Kelley 开发的轻量级网络服务工具,名字来源于 “DNS masquerade”(DNS 伪装),最初设计用于小型网络和嵌入式设备。它将三个核心网络服务集成在一个二进制文件中:
- DNS 服务器:提供域名解析和缓存
- DHCP 服务器:自动分配 IP 地址
- TFTP 服务器:提供简单的文件传输服务
┌─────────────────────────────────────┐
│ Dnsmasq │
│ │
│ ┌──────────┐ ┌────────┐ ┌───────┐ │
│ │ DNS 引擎 │ │DHCP 引擎│ │TFTP │ │
│ │ │ │ │ │引擎 │ │
│ └────┬─────┘ └───┬────┘ └───┬───┘ │
│ │ │ │ │
│ └───────────┼──────────┘ │
│ │ │
│ 网络接口层 │
└───────────────────┬─────────────────┘
│
┌─────┴─────┐
│ 网络/客户端 │
└───────────┘
关键数据:
| 指标 | 数值 |
|---|---|
| 二进制大小 | ~500 KB(静态编译) |
| 内存占用 | 2-10 MB |
| 支持并发 | 数千 DNS 查询/秒 |
| 依赖 | glibc(可静态链接) |
| 首次发布 | 2001 年 |
| 许可证 | GPLv2 |
1.2 功能特性详解
1.2.1 DNS 功能
Dnsmasq 作为 DNS 服务器提供以下能力:
| 功能 | 说明 |
|---|---|
| DNS 缓存 | 缓存上游 DNS 响应,加速后续查询 |
| 本地域名 | 为本地设备分配自定义域名 |
| 上游转发 | 将查询转发到一个或多个上游 DNS 服务器 |
| 自定义记录 | 支持 A/AAAA/PTR/CNAME/MX/TXT/SRV 等记录类型 |
| hosts 文件 | 读取 /etc/hosts 和自定义 hosts 文件 |
| 域名过滤 | 基于域名列表屏蔽特定查询 |
| DNSSEC | 可选的 DNS 安全扩展支持 |
DNS 查询流程:
客户端 ──查询──→ Dnsmasq
│
├─ 命中本地记录 ──→ 直接返回
│
├─ 命中缓存 ──→ 直接返回
│
└─ 未命中 ──→ 转发上游 DNS ──→ 缓存 → 返回
1.2.2 DHCP 功能
| 功能 | 说明 |
|---|---|
| IPv4 DHCP | 标准 DHCPv4 地址分配 |
| IPv6 DHCP | DHCPv6 和 SLAAC(无状态地址自动配置) |
| 静态租约 | 根据 MAC 地址绑定固定 IP |
| DHCP 选项 | 支持网关、DNS、NTP、TFTP 等选项下发 |
| PXE 启动 | 支持网络引导和 TFTP 文件传输 |
| 租约管理 | 租约文件记录和过期清理 |
1.2.3 TFTP 功能
| 功能 | 说明 |
|---|---|
| 文件服务 | 提供 TFTP 文件读取(只读) |
| PXE 集成 | 与 DHCP 配合实现网络启动 |
| 简单配置 | 仅需指定根目录即可启用 |
| 并发限制 | 适合小型网络,不建议高并发场景 |
1.3 与其他 DNS 服务器对比
1.3.1 Dnsmasq vs BIND
| 维度 | Dnsmasq | BIND |
|---|---|---|
| 定位 | 轻量级缓存 DNS + DHCP | 企业级权威/递归 DNS |
| 内存占用 | 2-10 MB | 50-500 MB |
| 配置复杂度 | 简单,单文件 | 复杂,多文件 |
| 区域传输 | 不支持 | 支持 AXFR/IXFR |
| DNSSEC | 基础支持 | 完整支持 |
| 动态更新 | 不支持 | 支持 |
| DHCP | 内置 | 需要配合 ISC DHCP |
| TFTP | 内置 | 需要额外安装 |
| 适用规模 | 小型网络(<1000 设备) | 任意规模 |
| 学习曲线 | 低 | 高 |
1.3.2 Dnsmasq vs Unbound
| 维度 | Dnsmasq | Unbound |
|---|---|---|
| 主要用途 | 缓存 DNS + DHCP | 递归 DNS 解析器 |
| DNSSEC | 基础 | 完整验证 |
| DHCP | 内置 | 无 |
| TFTP | 内置 | 无 |
| 性能 | 中等 | 高(专为 DNS 优化) |
| 配置 | 简单 | 中等 |
| 本地记录 | 原生支持 | 需要配置 local-zone |
1.3.3 Dnsmasq vs CoreDNS / PowerDNS
| 维度 | Dnsmasq | CoreDNS | PowerDNS |
|---|---|---|---|
| 典型场景 | 小型网络/路由器 | Kubernetes DNS | 企业权威 DNS |
| 语言 | C | Go | C++ |
| 插件系统 | 无 | 丰富 | 丰富 |
| 数据库后端 | 文件 | 无 | MySQL/PostgreSQL |
| API | 无 | 有 | REST API |
| DHCP | 内置 | 无 | 无 |
1.4 适用场景
场景一:家庭网络
互联网
│
┌───┴───┐
│ 路由器 │
└───┬───┘
│
┌───────┼───────┐
│ │ │
┌──┴──┐ ┌──┴──┐ ┌──┴──┐
│手机 │ │电脑 │ │电视 │
└─────┘ └─────┘ └─────┘
Dnsmasq 运行在路由器上,提供:
- DHCP 自动分配 IP
- DNS 缓存加速上网
- 本地设备域名(如 printer.home)
场景二:小型办公网络
互联网
│
┌───┴───┐
│ 防火墙 │
└───┬───┘
│
┌───┴───────┐
│ Dnsmasq │ ← DNS + DHCP + PXE
│ 服务器 │
└───┬───────┘
│
┌───┼───────┐
│ │ │
办公区 服务器区 打印机
场景三:Docker / Kubernetes 环境
# 容器平台中用 Dnsmasq 提供自定义 DNS
services:
dnsmasq:
image: jpillora/dnsmasq
ports:
- "53:53/udp"
- "53:53/tcp"
场景四:嵌入式设备 / OpenWrt
OpenWrt 路由器默认使用 Dnsmasq 作为 DNS 和 DHCP 服务器:
/etc/config/dhcp → Dnsmasq 实例
option domain 'home.lan'
option authoritative '1'
1.5 工作原理
1.5.1 DNS 解析机制
Dnsmasq 的 DNS 引擎按以下优先级解析域名:
1. --address=/域名/IP ← 最高优先级
2. --host-record=域名/IP ← 显式主机记录
3. /etc/hosts ← 系统 hosts 文件
4. --addn-hosts ← 附加 hosts 文件
5. DHCP 租约 ← DHCP 分配的主机名
6. 缓存 ← 已缓存的上游响应
7. 上游 DNS ← 转发查询到上游服务器
1.5.2 DHCP 工作流程
客户端 Dnsmasq
│ │
├── DHCP Discover ──────→│
│ ├── 检查静态绑定
│ ├── 选择可用地址
│←── DHCP Offer ─────────┤
│ │
├── DHCP Request ───────→│
│ ├── 确认分配
│ ├── 记录租约
│←── DHCP ACK ───────────┤
│ │
│ 获得 IP + 网关 + DNS │
1.5.3 进程模型
Dnsmasq 使用单进程多路复用模型:
┌──────────────────┐
│ 主进程 │
│ select()/ │
│ poll() 循环 │
│ │
│ ┌─────────────┐ │
│ │ DNS 监听 │ │ UDP 53 / TCP 53
│ │ DHCP 监听 │ │ UDP 67 / UDP 68
│ │ TFTP 监听 │ │ UDP 69
│ │ 租约定时器 │ │
│ │ 缓存清理器 │ │
│ └─────────────┘ │
└──────────────────┘
单进程模型意味着:
- 无需线程同步,减少了锁竞争
- 内存占用极低,适合资源受限设备
- 不能利用多核,但 DNS 查询通常不是 CPU 密集型
1.6 版本与分支
主要版本
| 版本 | 特性 |
|---|---|
| 2.75-2.80 | 经典稳定版本,多数 Linux 发行版默认 |
| 2.85+ | 引入 DNSSEC 改进、NFTSet 支持 |
| 2.89+ | 最新稳定版,支持更多 DHCP 选项 |
检查版本
# 查看当前安装版本
dnsmasq --version
# 输出示例:
# Dnsmasq version 2.90 Copyright (c) 2000-2024 Simon Kelley
# Compile time options: IPv6 GNU-getopt DBus no-UBus i18n IDN2 DHCP
# DHCPv6 no-Lua TFTP conntrack ipset nftset auth cryptohash DNSSEC
# loop-detect inotify dumpfile
获取最新版本
# 从源码编译最新版
wget http://www.thekelleys.org.uk/dnsmasq/dnsmasq-2.90.tar.gz
tar xzf dnsmasq-2.90.tar.gz
cd dnsmasq-2.90
make
sudo make install
1.7 典型部署架构
单节点部署
最简单的部署方式,适合家庭或小型网络:
┌────────────────────────────────┐
│ 物理服务器/路由器 │
│ │
│ ┌──────────────────────┐ │
│ │ Dnsmasq │ │
│ │ DNS + DHCP + TFTP │ │
│ └──────────────────────┘ │
│ │
│ eth0: WAN (上级网络) │
│ eth1: LAN (192.168.1.0/24) │
└────────────────────────────────┘
主备部署
通过 Keepalived 实现高可用(详见第 09 章):
┌─────────────┐ ┌─────────────┐
│ Dnsmasq 主 │←心跳→│ Dnsmasq 备 │
│ 192.168.1.1 │ │ 192.168.1.2 │
└──────┬──────┘ └──────┬──────┘
│ │
└───────────┬───────────┘
│
VIP: 192.168.1.254
│
┌──────┴──────┐
│ 客户端 │
└─────────────┘
1.8 快速体验
如果你想先快速感受 Dnsmasq 的能力,可以在 5 分钟内完成以下最小部署:
# 1. 安装
sudo apt install dnsmasq
# 2. 创建最小配置
sudo tee /etc/dnsmasq.d/quick-test.conf <<'EOF'
# 仅启用 DNS 缓存
listen-address=127.0.0.1
port=5353
cache-size=100
log-queries
EOF
# 3. 启动
sudo systemctl restart dnsmasq
# 4. 测试 DNS 缓存
dig @127.0.0.1 -p 5353 www.google.com # 首次查询(从上游获取)
dig @127.0.0.1 -p 5353 www.google.com # 第二次查询(从缓存返回,速度更快)
注意:如果系统已有 systemd-resolved 占用 53 端口,需要先修改端口或停止该服务。详见第 02 章。
1.9 小结
| 要点 | 说明 |
|---|---|
| Dnsmasq 是什么 | 轻量级 DNS + DHCP + TFTP 一体化服务 |
| 适合谁 | 家庭网络、小型企业、嵌入式设备、容器环境 |
| 核心优势 | 配置简单、资源占用极低、功能集成 |
| 主要限制 | 不适合大规模企业级 DNS、不支持区域传输 |
| 下一步 | 第 02 章学习安装与初始配置 |