强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 DHCPDHCPv6 和 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

维度DnsmasqBIND
定位轻量级缓存 DNS + DHCP企业级权威/递归 DNS
内存占用2-10 MB50-500 MB
配置复杂度简单,单文件复杂,多文件
区域传输不支持支持 AXFR/IXFR
DNSSEC基础支持完整支持
动态更新不支持支持
DHCP内置需要配合 ISC DHCP
TFTP内置需要额外安装
适用规模小型网络(<1000 设备)任意规模
学习曲线

1.3.2 Dnsmasq vs Unbound

维度DnsmasqUnbound
主要用途缓存 DNS + DHCP递归 DNS 解析器
DNSSEC基础完整验证
DHCP内置
TFTP内置
性能中等高(专为 DNS 优化)
配置简单中等
本地记录原生支持需要配置 local-zone

1.3.3 Dnsmasq vs CoreDNS / PowerDNS

维度DnsmasqCoreDNSPowerDNS
典型场景小型网络/路由器Kubernetes DNS企业权威 DNS
语言CGoC++
插件系统丰富丰富
数据库后端文件MySQL/PostgreSQL
APIREST 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 章学习安装与初始配置

1.10 扩展阅读