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

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 章学习安装与初始配置

1.10 扩展阅读