dnsmasq 故障排查与参考一、退出代码1. 退出代码含义0：正常退出1：配置错误2：网络错误3：文件访问错误二、常见问题1. DHCP 客户端无法获取地址# 检查服务状态 systemctl status dnsmasq # 检查端口监听 netstat -tulnp | grep 67 # 查看日志 journalctl -u dnsmasq -f2. DNS 解析缓慢# 检查上游服务器 ping -c 5 8.8.8.8 # 查看缓存 dig +short chaos txt cachesize.bind @127.0.0.1三、案例分析1. PXE 启动失败# 检查 TFTP 服务 netstat -tulnp | grep 69 # 检查文件权限 ls -la /var/tftpboot/ # 测试 TFTP tftp 192.168.1.1 -c get pxelinux.0标签：dnsmasq、故障排查
dnsmasq 配置文件与管理一、配置文件语法1. 基本语法# 配置文件格式 option=value # 注释 # 这是注释 # 多值选项 server=8.8.8.8 server=8.8.4.42. 配置文件组织# 主配置文件 /etc/dnsmasq.conf # 额外配置目录 conf-dir=/etc/dnsmasq.d conf-file=/etc/dnsmasq/custom.conf二、信号处理与热重载1. 信号处理# SIGHUP - 重载 hosts 文件 sudo systemctl kill -s HUP dnsmasq # SIGUSR1 - 输出统计信息 sudo systemctl kill -s USR1 dnsmasq # SIGUSR2 - 重新打开日志文件 sudo systemctl kill -s USR2 dnsmasq三、实战案例1. 配置文件自动化# 分离配置 mkdir -p /etc/dnsmasq.d echo "server=8.8.8.8" > /etc/dnsmasq.d/dns.conf echo "dhcp-range=192.168.1.100,192.168.1.200" > /etc/dnsmasq.d/dhcp.conf标签：dnsmasq、运维
dnsmasq 高级配置一、标签系统1. 标签工作原理# 设置标签 dhcp-range=set:tag1,192.168.1.100,192.168.1.150 dhcp-option=tag:tag1,3,192.168.1.1 # 条件标签 dhcp-option=tag:known,3,192.168.1.12. 动态标签# 基于厂商的标签 dhcp-vendorclass=set:pxeclient,PXEClient dhcp-option=tag:pxeclient,17,/var/tftpboot二、脚本事件1. DHCP 事件脚本# 配置脚本 dhcp-script=/usr/local/bin/dhcp-event.sh # 脚本内容 #!/bin/bash case "$1" in add) logger "New device: $2 ($3)" ;; del) logger "Device left: $2 ($3)" ;; esac三、实战案例1. 多 VLAN 部署# VLAN 10 - 办公网络 interface=eth0.10 dhcp-range=eth0.10,192.168.10.100,192.168.10.200,12h dhcp-option=eth0.10,3,192.168.10.1 # VLAN 20 - 客人网络 interface=eth0.20 dhcp-range=eth0.20,192.168.20.100,192.168.20.200,2h dhcp-option=eth0.20,3,192.168.20.1标签：dnsmasq、网络技术
dnsmasq TFTP 与网络启动一、TFTP 协议原理TFTP（Trivial File Transfer Protocol）是一个简单文件传输协议，主要用于网络启动场景。1. TFTP 配置# 启用 TFTP enable-tftp tftp-root=/var/tftpboot # 安全模式 tftp-secure tftp-max=50二、PXE 启动配置1. PXE 配置# PXE 提示 pxe-prompt="Press F8 for menu", 5 # PXE 服务 pxe-service=x86PC, "Install Linux", pxelinux pxe-service=x86PC, "Boot from local disk", 02. 引导菜单配置# /srv/tftp/pxelinux.cfg/default DEFAULT linux LABEL linux KERNEL vmlinuz APPEND initrd=initrd.img ip=dhcp LABEL local LOCALBOOT 0三、实战案例1. PXE 批量装机# 完整 PXE 配置 enable-tftp tftp-root=/srv/tftp dhcp-range=192.168.1.100,192.168.1.200,12h pxe-prompt="Install System", 10 pxe-service=x86PC, "Install Ubuntu", ubuntu-installer2. 多系统启动环境# 多启动选项 pxe-service=x86PC, "Ubuntu 22.04", ubuntu22 pxe-service=x86PC, "CentOS 8", centos8 pxe-service=x86PC, "Windows PE", winpe pxe-service=x86PC, "Local Disk", 0标签：dnsmasq、TFTP、PXE
dnsmasq DHCPv6 与 IPv6一、IPv6 地址基础1. 地址类型链路本地地址：fe80::/10唯一本地地址：fd00::/8全球单播地址：2000::/32. DHCPv6 配置# 有状态 DHCPv6 dhcp-range=tag:br0,2001:db8::100,2001:db8::200,64,12h # 无状态 DHCPv6（仅提供 DNS） dhcp-range=::,constructor:br0,ra-stateless,ra-names # 路由器通告 enable-ra ra-param=br0,0,18003. 双栈网络配置# IPv4 和 IPv6 同时启用 dhcp-range=192.168.1.100,192.168.1.200,12h dhcp-range=tag:br0,2001:db8::100,2001:db8::200,64,12h二、实战案例1. 纯 IPv6 家庭网络# 启用 RA enable-ra dhcp-range=::,constructor:eth0,ra-stateless,ra-names2. 双栈企业网络# 双栈配置 dhcp-range=192.168.1.100,192.168.1.200,12h dhcp-range=2001:db8::100,2001:db8::200,64,12h ra-param=eth0,mtu:1500,1800标签：dnsmasq、IPv6、DHCP
dnsmasq DHCPv4 配置一、DHCPv4 协议深度讲解1. DORA 流程sequenceDiagram participant C as 客户端 participant S as DHCP 服务器 C->>S: DHCP Discover (广播) S->>C: DHCP Offer (广播) C->>S: DHCP Request (广播) S->>C: DHCP Ack (广播)2. 地址池配置# 基本地址池 dhcp-range=192.168.1.100,192.168.1.200,12h # 多地址池 dhcp-range=eth0,192.168.1.100,192.168.1.200,12h dhcp-range=eth1,192.168.2.100,192.168.2.200,2h # 指定网关和掩码 dhcp-range=192.168.1.100,192.168.1.200,255.255.255.0,12h3. 静态地址分配# 通过 MAC 地址 dhcp-host=AA:BB:CC:DD:EE:FF,192.168.1.10,server1,infinite # 通过主机名 dhcp-host=printer,192.168.1.20 # 忽略设备 dhcp-host=AA:BB:CC:DD:EE:FF,ignore4. DHCP 选项# 网关 dhcp-option=3,192.168.1.1 # DNS 服务器 dhcp-option=6,8.8.8.8,8.8.4.4 # 域名后缀 dhcp-option=15,example.com二、实战案例1. 家庭网络配置interface=eth0 dhcp-range=192.168.1.100,192.168.1.200,12h dhcp-option=3,192.168.1.1 dhcp-option=6,192.168.1.1 dhcp-host=AA:BB:CC:DD:EE:FF,192.168.1.10,myserver,infinite2. 多网段企业网络# VLAN 接口 interface=eth0.10 dhcp-range=eth0.10,192.168.10.100,192.168.10.200,12h dhcp-option=eth0.10,3,192.168.10.1 interface=eth0.20 dhcp-range=eth0.20,192.168.20.100,192.168.20.200,12h dhcp-option=eth0.20,3,192.168.20.1标签：dnsmasq、DHCP、网络技术
dnsmasq DNS 记录与解析一、概述1. DNS 记录类型深度解析A. 什么是 DNS 记录DNS 记录（Resource Record，RR）是 DNS 系统中存储域名相关信息的基本单位。每条记录包含以下信息：名称（Name）：记录所属的域名类型（Type）：记录的类型（A、AAAA、CNAME、MX 等）类（Class）：通常是 IN（Internet）TTL：生存时间数据（Data）：记录的具体内容B. dnsmasq 支持的记录类型dnsmasq 支持以下 DNS 记录类型的配置：记录类型用途配置选项AIPv4 地址映射--host-record, --addressAAAAIPv6 地址映射--host-record, --addressCNAME域名别名--cnameMX邮件服务器--mx-host, --mx-targetSRV服务定位--srv-hostTXT文本信息--txt-recordPTR反向解析--ptr-recordNS域名服务器(权威模式自动生成)NAPTR命名权限指针--naptr-recordCAA证书颁发机构授权--caa-record二、各类记录详细配置1. A 和 AAAA 记录A. host-record 选项--host-record 是最灵活的主机记录配置方式：# 基本语法 host-record=name[,name...],[IPv4],[IPv6],[TTL] # 单个主机 host-record=server1,192.168.1.10 # 多个名称指向同一地址 host-record=www,web,server,192.168.1.10 # 同时配置 IPv4 和 IPv6 host-record=server1,192.168.1.10,2001:db8::10 # 指定 TTL host-record=server1,192.168.1.10,3600 # 完整示例 host-record=laptop,laptop.local.lan,192.168.1.100,fd00::100B. address 选项--address 选项主要用于域名重定向：# 基本语法 address=/domain/ipaddr # 广告拦截 address=/ad.example.com/0.0.0.0 # 服务重定向 address=/api.old.com/192.168.1.50 # 通配符重定向 address=/.internal.com/192.168.1.12. CNAME 记录A. 基本配置# 基本语法 cname=cname[,cname...],target[,TTL] # 单个别名 cname=www,server1 # 多个别名 cname=www,web,server1 # 指定 TTL cname=api,v2.api,backend.example.com,300 # 通配符别名 cname=*.example.com,default.example.comB. CNAME 链dnsmasq 支持多级 CNAME：# 配置示例 cname=blog,www cname=www,server1 host-record=server1,192.168.1.10 # 解析链：blog -> www -> server1 -> 192.168.1.103. MX 记录A. 邮件服务器配置# 指定邮件服务器 mx-host=mail.example.com,mail.example.com,10 # 使用 mx-target 设置默认目标 mx-target=mailserver.example.com mx-host=example.com # 多个 MX 记录（优先级不同） mx-host=mail1.example.com,mail1.example.com,10 mx-host=mail2.example.com,mail2.example.com,20B. MX 记录详解graph LR A[邮件发送者] -->|查询 MX| B[DNS 服务器] B -->|返回 MX 记录| C[邮件服务器列表] C --> D[MX 10: mail1] C --> E[MX 20: mail2] D -->|尝试连接| F[投递邮件] E -->|备用| F4. SRV 记录A. 服务定位配置# 基本语法 srv-host=_service._proto[.domain],[target][,port][,priority][,weight] # LDAP 服务器 srv-host=_ldap._tcp.example.com,ldap.example.com,389,10,100 # 多个服务实例（负载均衡） srv-host=_http._tcp.example.com,web1.example.com,8080,10,60 srv-host=_http._tcp.example.com,web2.example.com,8080,10,405. TXT 记录A. 文本信息配置# SPF 记录 txt-record=example.com,"v=spf1 mx a ip4:192.168.1.0/24 -all" # DKIM 记录 txt-record=default._domainkey.example.com,"v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC..." # 验证记录 txt-record=_acme-challenge.example.com,"abc123def456"6. PTR 记录A. 反向解析配置# 基本语法 ptr-record=name[,target] # 手动 PTR 记录 ptr-record=10.1.168.192.in-addr.arpa,server1.example.comB. DHCP 自动 PTRdnsmasq 会自动为 DHCP 分配的地址创建 PTR 记录：# 启用 DHCP dhcp-range=192.168.1.100,192.168.1.200,12h # 客户端获取 192.168.1.100 # 自动创建 PTR: 100.1.168.192.in-addr.arpa -> hostname三、权威 DNS 配置1. auth-zone 选项# 基本语法 auth-zone=domain[,subnet...] # 配置权威区域 auth-zone=example.com,192.168.1.0/24 # 指定接口 auth-zone=example.com,192.168.1.0/24,eth0 # 排除子网 auth-zone=example.com,192.168.1.0/24,exclude:192.168.1.100/322. 权威记录配置# 完整权威配置示例 auth-zone=internal.lan,192.168.100.0/24 host-record=server.internal.lan,192.168.100.10 mx-host=internal.lan,mail.internal.lan,10 txt-record=internal.lan,"v=spf1 mx -all"四、实战案例1. 内网 DNS 完整配置# 完整内网 DNS 配置 interface=eth0 domain=internal.lan expand-hosts # A/AAAA 记录 host-record=server1,192.168.1.10 host-record=server2,192.168.1.11 host-record=printer,192.168.1.20 # CNAME 记录 cname=www,server1 cname=api,server2 # MX 记录 mx-host=internal.lan,mail.internal.lan,10 # TXT 记录 txt-record=internal.lan,"v=spf1 mx -all"2. 广告拦截与家长控制# 广告域名列表 address=/ad.doubleclick.net/0.0.0.0 address=/ads.google.com/0.0.0.0 address=/tracker.analytics.com/0.0.0.0 # 家长控制 - 拦截不良网站 address=/bad-site.com/127.0.0.1 address=/adult-site.com/0.0.0.0 # 重定向儿童网站 cname=/kids.google.com/safe-kids.example.com标签：dnsmasq、DNS、网络技术
dnsmasq DNS 配置基础一、概述1. DNS 服务概述A. 什么是 DNS 转发器dnsmasq 的 DNS 功能本质上是一个转发器（Forwarder）和缓存服务器的组合，而不是一个完整的递归解析器。这意味着 dnsmasq 不会像 BIND 那样从根服务器开始逐级查询域名，而是将客户端的 DNS 查询请求转发到上游的递归 DNS 服务器，然后将结果返回给客户端。这种设计有以下几个优势：资源占用小：不需要维护完整的域名树数据结构，内存占用极小响应速度快：利用缓存机制，重复查询直接从内存返回配置简单：不需要配置根区域、区域文件等复杂概念安全性高：不直接与互联网上的 DNS 服务器通信，减少攻击面B. DNS 转发工作原理当一个 DNS 查询到达 dnsmasq 时，会经历以下处理流程：flowchart TD A[客户端 DNS 查询] --> B{检查本地配置} B -->|有 address 配置| C[返回指定 IP] B -->|无配置| D{检查 /etc/hosts} D -->|找到记录| E[返回 hosts 记录] D -->|未找到| F{检查 DNS 缓存} F -->|缓存命中| G[返回缓存结果] F -->|缓存未命中| H[转发到上游 DNS] H --> I[等待上游响应] I --> J[存入缓存] J --> K[返回给客户端]C. 为什么使用 DNS 转发器使用 DNS 转发器而不是直接使用上游 DNS 服务器有以下好处：降低延迟：本地缓存可以显著减少查询延迟，尤其是对于频繁访问的域名减轻上游压力：减少对上游 DNS 服务器的查询次数，节省网络带宽提高可靠性：当上游服务器不可用时，缓存中的记录仍然可以提供服务灵活性：可以根据域名智能选择不同的上游服务器隐私保护：减少与外部 DNS 服务器的通信次数2. 前置知识A. DNS 基础概念域名结构：DNS 采用分层树状结构，从根域（.）开始，向下分为顶级域（.com、.cn）、二级域（example.com）、子域（www.example.com）等。记录类型：A 记录：将域名映射到 IPv4 地址AAAA 记录：将域名映射到 IPv6 地址CNAME 记录：域名别名MX 记录：邮件服务器TXT 记录：文本信息NS 记录：域名服务器PTR 记录：反向解析（IP 到域名）递归查询 vs 迭代查询：递归查询：DNS 服务器负责查询并返回最终结果迭代查询：DNS 服务器返回下一步应该查询的服务器地址B. 推荐知识了解 /etc/resolv.conf 文件的作用了解 dig 或 nslookup 工具的基本用法了解 DNS 查询日志如何查看和分析二、DNS 转发器配置1. 上游服务器设置A. 基本配置dnsmasq 默认从 /etc/resolv.conf 文件读取上游 DNS 服务器。对于大多数 Linux 发行版，这个文件由网络管理器（如 NetworkManager、systemd-networkd）自动维护。查看当前上游服务器：cat /etc/resolv.conf手动指定上游服务器：使用 --server 选项可以指定上游 DNS 服务器：# 配置文件语法 server=8.8.8.8 server=8.8.4.4 server=114.114.114.114完全禁用 /etc/resolv.conf：如果不想使用 /etc/resolv.conf 中的服务器，可以使用 --no-resolv 选项：# 完整配置示例 no-resolv server=8.8.8.8 server=8.8.4.4B. 指定域名使用特定服务器dnsmasq 最强大的功能之一是可以根据域名将查询转发到不同的上游服务器。这在国际网络环境下特别有用，可以实现国内外 DNS 分流。基本语法：# 将特定域名的查询转发到指定服务器 server=/domain/upstream_dns实际应用示例：# 国内域名使用国内 DNS server=/cn/114.114.114.114 server=/qq.com/119.29.29.29 server=/taobao.com/223.5.5.5 # 国外域名使用国外 DNS server=/com/8.8.8.8 server=/org/8.8.8.8 server=/net/1.1.1.1 # 企业内网域名 server=/internal.corp.com/192.168.1.1C. 域名匹配规则详解dnsmasq 的域名匹配规则非常灵活，支持多种匹配模式：精确匹配：# 只匹配 example.com，不匹配 www.example.com server=/example.com/192.168.1.1子域名匹配：# 匹配 example.com 和所有子域名 # 包括 www.example.com、api.example.com 等 # 但不包括 notexample.com server=/example.com/192.168.1.1 # 匹配所有以 .google.com 结尾的域名 server=/google.com/8.8.8.8通配符匹配：# * 在开头表示匹配任何前缀 # 匹配 google.com、www.google.com、mygoogle.com 等 server=/*google.com/8.8.8.8 # /*.google.com 只匹配子域名，不匹配 google.com 本身 server=/*.google.com/8.8.8.8优先级规则：更具体的规则优先于通配符规则：# 这个配置会这样工作： # - www.google.com 使用 8.8.4.4 # - google.com 使用 8.8.8.8 # - mygoogle.com 使用 1.1.1.1 server=/google.com/8.8.8.8 server=/www.google.com/8.8.4.4 server=/*google.com/1.1.1.1D. 本地域名配置对于不应该转发到上游服务器的本地域名，使用 --local 或 --server 选项（不带服务器地址）：# 声明本地域名 local=/local.lan/ local=/home.lan/ # 或使用 server 语法（效果相同） server=/local.lan/ server=/home.lan/ # 禁用特定域名的转发 server=/example.local/这样配置后，对于这些域名的查询：如果在 /etc/hosts 或 DHCP 租约中找到，返回对应记录如果找不到，返回 NXDOMAIN（不存在）永远不会转发到上游服务器2. 高级转发配置A. 指定源地址或接口在复杂网络环境中，可能需要指定 dnsmasq 向特定上游服务器发送查询时使用的源地址或网络接口：# 指定源 IP 地址 server=8.8.8.8@192.168.1.10 # 指定网络接口 server=8.8.8.8@eth0 # 同时指定 IP 地址和接口 server=8.8.8.8@192.168.1.10@eth0 # 为特定域名指定路由 server=/vpn.example.com/10.0.0.1@tun0B. 反向解析配置使用 --rev-server 选项可以简化反向解析区域的配置：# 传统方法（使用 server 选项） server=/1.168.192.in-addr.arpa/192.168.1.1 # 使用 rev-server（更简洁） rev-server=192.168.1.0/24,192.168.1.1 # IPv6 反向解析 rev-server=2001:db8::/32,2001:db8::1C. 多服务器策略默认情况下，dnsmasq 只向第一个可用的上游服务器发送查询。要改变这种行为：# 向所有可用服务器发送查询（最快响应者胜出） all-servers # 严格按顺序使用服务器 strict-order # 设置服务器超时时间 timeout=5all-servers 的效果：# 配置示例 server=8.8.8.8 server=114.114.114.114 all-servers # 工作原理： # - 对于每个查询，向所有服务器同时发送 # - 使用第一个收到的响应 # - 优点：响应速度更快 # - 缺点：网络流量增加strict-order 的效果：# 配置示例 server=8.8.8.8 server=114.114.114.114 strict-order # 工作原理： # - 总是先尝试第一个服务器 # - 只有第一个服务器超时或失败才尝试第二个 # - 优点：可预测的行为 # - 缺点：第一个服务器故障时响应慢D. DNSSEC 配置DNSSEC（DNS Security Extensions）是一组 DNS 安全扩展，用于验证 DNS 响应的真实性。启用 DNSSEC：# 启用 DNSSEC 验证 dnssec # 信任特定域名（忽略其 DNSSEC 状态） trust-anchor=/com/,. DS 20326 8 2 E06D44B80B8F1D39A95C0B0D7C65D08458E8804 9B4587B016A3C8E21B4D4D5A2F9A26E3B8B1 # 将特定域名视为未签名 dnssec-check-unsigned=noDNSSEC 工作原理：sequenceDiagram participant C as 客户端 participant D as dnsmasq participant U as 上游 DNS participant R as 根服务器 C->>D: DNS 查询 D->>U: 转发查询 U->>R: 验证链查询 R-->>U: DNSKEY 记录 U-->>D: 答案 + RRSIG D->>D: 验证签名 D-->>C: 验证结果注意事项：启用 DNSSEC 会增加查询延迟和 CPU 使用某些上游 DNS 服务器可能不完全支持 DNSSEC需要系统时间准确，否则验证可能失败3. DNS 缓存配置A. 缓存大小设置缓存大小直接影响 DNS 查询性能和内存使用：# 设置缓存条目数量 cache-size=10000 # 查看实际缓存大小 dig +short chaos txt cachesize.bind @127.0.0.1缓存大小建议：网络规模设备数量建议缓存大小内存占用家庭网络1-201000-3000约 2-5 MB小型办公室20-1003000-10000约 5-15 MB中型企业100-50010000-50000约 15-50 MBB. TTL 控制选项TTL（Time To Live）决定 DNS 记录在缓存中的存活时间：# 本地记录的 TTL（/etc/hosts、DHCP、配置） local-ttl=3600 # DHCP 租约记录的 TTL dhcp-ttl=3600 # 否定响应的缓存时间 neg-ttl=1800 # 返回给客户端的最大 TTL max-ttl=86400 # 缓存条目的最大 TTL max-cache-ttl=86400 # 缓存条目的最小 TTL min-cache-ttl=1800 # 权威服务器的 TTL auth-ttl=3600TTL 配置建议：# 平衡性能和数据新鲜度 # 对于家庭网络，可以适当延长 TTL max-cache-ttl=86400 min-cache-ttl=3600 # 对于需要频繁变更的环境 max-cache-ttl=3600 min-cache-ttl=300 # 防止否定响应被缓存太久 neg-ttl=600C. 缓存管理查看缓存统计：# 发送 SIGUSR1 信号查看统计 sudo systemctl kill -s USR1 dnsmasq sudo journalctl -u dnsmasq --since "1 second ago"输出示例：dnsmasq[1234]: cache size 10000, 0/50 cache insertions re-used unexpired cache entries. dnsmasq[1234]: queries forwarded 1234, queries answered locally 5678 dnsmasq[1234]: queries for authoritative zones 123清空缓存：# 方法一：重载服务（清空缓存并重读 hosts） sudo systemctl kill -s HUP dnsmasq # 方法二：重启服务 sudo systemctl restart dnsmasq # 方法三：使用 dbus（如果支持） dbus-send --system --dest=uk.org.thekelleys.dnsmasq /uk/org/thekelleys/dnsmasq uk.org.thekelleys.dnsmasq.ClearCache三、本地主机名解析1. /etc/hosts 文件A. 基本使用dnsmasq 自动读取 /etc/hosts 文件，并将其内容用于本地主机名解析：# /etc/hosts 文件示例 127.0.0.1 localhost 192.168.1.1 router 192.168.1.10 server1 192.168.1.20 printer禁用 /etc/hosts：# 完全禁用 /etc/hosts no-hosts # 禁用 /etc/hosts，但使用其他 hosts 文件 no-hosts addn-hosts=/etc/dnsmasq.hostsB. 域名扩展使用 --expand-hosts 选项可以自动将简单主机名扩展为完全限定域名：# 配置示例 domain=local.lan expand-hosts # /etc/hosts 中的简单主机名 192.168.1.10 server1 # 实际解析为 server1.local.lan -> 192.168.1.102. 额外 hosts 文件A. 静态 hosts 文件使用 --addn-hosts 选项可以指定额外的 hosts 文件：# 单个额外文件 addn-hosts=/etc/dnsmasq.hosts # 多个额外文件 addn-hosts=/etc/dnsmasq.hosts addn-hosts=/etc/dnsmasq.static # 指定目录（读取目录下所有文件） addn-hosts=/etc/dnsmasq.dB. 动态 hosts 目录使用 --hostsdir 选项可以监控目录变化，自动加载新增或修改的文件：# 监控目录 hostsdir=/etc/dnsmasq.hosts.d # 创建目录 sudo mkdir -p /etc/dnsmasq.hosts.d # 添加 hosts 文件 sudo tee /etc/dnsmasq.hosts.d/custom.conf <<EOF 192.168.1.100 device1.local.lan 192.168.1.101 device2.local.lan EOF # 无需重启，dnsmasq 会自动检测变化3. DNS 重定向与拦截A. 域名重定向使用 --address 选项可以将特定域名解析到指定 IP 地址：# 基本语法 address=/domain/ip_address # 重定向示例 address=/ad.example.com/0.0.0.0 address=/tracker.analytics.com/127.0.0.1 address=/oldsite.com/192.168.1.100 # 重定向所有未匹配的域名 address=/#/192.168.1.1B. 广告拦截通过配置大量广告域名指向 0.0.0.0，可以实现广告拦截功能：# 方法一：手动配置 address=/ad.doubleclick.net/0.0.0.0 address=/ads.google.com/0.0.0.0 address=/tracking.example.com/0.0.0.0 # 方法二：使用现成的 hosts 文件 addn-hosts=/etc/dnsmasq.adblock.list # 下载广告拦截列表 sudo wget -O /etc/dnsmasq.adblock.list https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts # 或使用 blocklist.site 格式 sudo curl -s https://blocklist.site/app/dl/hosts | \ sudo sed 's/^0.0.0.0/address=/' | \ sudo sed 's/$/\//' >> /etc/dnsmasq.adblock.list四、域名匹配规则与通配符1. 匹配模式详解A. 标准匹配# 精确域名匹配 server=/example.com/192.168.1.1 # 匹配：example.com # 匹配：www.example.com # 不匹配：notexample.com # 使用 . 前缀的等价形式 server=/.example.com/192.168.1.1 # 效果同上B. 子域名匹配# 只匹配子域名 server=/*.example.com/192.168.1.1 # 匹配：www.example.com # 匹配：api.example.com # 不匹配：example.comC. 通配符匹配# 通配符在开头 server=/*google.com/8.8.8.8 # 匹配：google.com # 匹配：www.google.com # 匹配：mygoogle.comD. 优先级规则# 更具体的规则优先 server=/google.com/8.8.8.8 server=/www.google.com/8.8.4.4 server=/*google.com/1.1.1.1 # 结果： # www.google.com -> 8.8.4.4 (最具体) # google.com -> 8.8.8.8 # mygoogle.com -> 1.1.1.1 (通配符)2. 高级匹配技巧A. 特殊域名# 空域名 = 不带点的域名 server=//192.168.1.1 # 只匹配 "localhost" 这样的单段名称 # # 符号 = 使用标准服务器 server=/google.com/1.2.3.4 server=/www.google.com/# # www.google.com 使用标准服务器，google.com 其他子域名使用 1.2.3.4B. IP 版本控制# 过滤 AAAA 记录（禁用 IPv6） filter-AAAA # 过滤 A 记录（禁用 IPv4） filter-A # 过滤特定记录类型 filter-rr=TXT filter-rr=SRV五、配置示例与最佳实践1. 常见配置场景A. 家庭网络配置# 家庭网络完整配置 interface=eth0 bind-interfaces # 上游 DNS server=8.8.8.8 server=8.8.4.4 # 本地域名 domain=home.lan expand-hosts local=/home.lan/ # DHCP 同步 dhcp-range=192.168.1.100,192.168.1.200,12h # 缓存设置 cache-size=5000 max-cache-ttl=86400 # 日志 log-queries log-facility=/var/log/dnsmasq.logB. 企业内网配置# 企业内网 DNS 配置 # 内网域名服务器 server=/corp.example.com/192.168.1.1 server=/ad.corp.example.com/192.168.1.2 # 本地域段 local=/corp.example.com/ # 外网查询 server=8.8.8.8 server=8.8.4.4 # 反向解析 rev-server=192.168.0.0/16,192.168.1.1 # 安全设置 bogus-priv local-service stop-dns-rebind2. 性能优化建议# 缓存优化 cache-size=10000 max-cache-ttl=86400 min-cache-ttl=1800 # 并发查询 dns-forward-max=5000 # 快速重试 fast-dns-retry=1000,10000 # 端口范围 min-port=1024 max-port=65535六、实战案例1. 构建企业内网 DNS 服务场景描述某企业需要搭建内网 DNS 服务，需求如下：内网域名使用 .corp.example.com 后缀内网域名由独立的 DNS 服务器管理（192.168.1.1）外网域名查询使用公共 DNS支持反向解析启用 DNSSEC 验证实现步骤步骤一：基础配置sudo tee /etc/dnsmasq.conf <<EOF # ==================== 网络配置 ==================== interface=eth0 bind-interfaces # ==================== DNS 配置 ==================== # 内网域名服务器 server=/corp.example.com/192.168.1.1 server=/ad.corp.example.com/192.168.1.1 # 声明内网域名 local=/corp.example.com/ local=/ad.corp.example.com/ # 外网 DNS 服务器 server=8.8.8.8 server=8.8.4.4 # 反向解析 rev-server=192.168.0.0/16,192.168.1.1 rev-server=10.0.0.0/8,192.168.1.1 # DNSSEC 验证 dnssec # ==================== 缓存配置 ==================== cache-size=10000 max-cache-ttl=86400 min-cache-ttl=1800 # ==================== 安全配置 ==================== bogus-priv local-service stop-dns-rebind # ==================== 日志配置 ==================== log-queries log-facility=/var/log/dnsmasq.log EOF步骤二：测试配置# 测试配置文件语法 dnsmasq --test --conf-file=/etc/dnsmasq.conf # 重启服务 sudo systemctl restart dnsmasq # 测试内网域名解析 dig @192.168.1.10 server1.corp.example.com # 测试外网域名解析 dig @192.168.1.10 google.com # 测试反向解析 dig @192.168.1.10 -x 192.168.1.100验证结果# 查看缓存统计 sudo systemctl kill -s USR1 dnsmasq sudo journalctl -u dnsmasq --since "1 second ago" | grep cache # 查看查询统计 sudo journalctl -u dnsmasq --since "1 minute ago" | grep "queries"2. 实现 DNS 分流场景描述在国内网络环境下，需要实现以下 DNS 分流策略：国内域名使用国内 DNS 服务器（114.114.114.114、223.5.5.5）国外域名使用国外 DNS 服务器（8.8.8.8、1.1.1.1）某些特定网站使用专用 DNS 服务器启用广告拦截功能实现步骤步骤一：创建分流配置sudo tee /etc/dnsmasq.conf <<EOF # ==================== 网络配置 ==================== interface=eth0 bind-interfaces # ==================== DNS 分流配置 ==================== # 国内主要域名后缀使用国内 DNS server=/cn/114.114.114.114 server=/com.cn/114.114.114.114 server=/net.cn/114.114.114.114 server=/org.cn/114.114.114.114 server=/gov.cn/114.114.114.114 # 国内大型网站 server=/qq.com/119.29.29.29 server=/taobao.com/223.5.5.5 server=/tmall.com/223.5.5.5 server=/jd.com/223.6.6.6 server=/baidu.com/180.76.76.76 server=/sina.com.cn/114.114.114.114 server=/sohu.com/114.114.114.114 server=/163.com/114.114.114.114 server=/126.com/114.114.114.114 # 国外主要域名后缀使用国外 DNS server=/com/8.8.8.8 server=/org/8.8.8.8 server=/net/1.1.1.1 server=/io/8.8.8.8 server=/co/8.8.8.8 # 特定网站使用专用 DNS server=/youtube.com/8.8.8.8 server=/google.com/8.8.8.8 server=/facebook.com/1.1.1.1 server=/twitter.com/8.8.8.8 # 默认 DNS（用于未匹配的域名） server=8.8.8.8 server=1.1.1.1 # ==================== 广告拦截 ==================== addn-hosts=/etc/dnsmasq.adblock.list # ==================== 缓存配置 ==================== cache-size=10000 max-cache-ttl=86400 min-cache-ttl=1800 # ==================== 性能配置 ==================== all-servers dns-forward-max=5000 # ==================== 日志配置 ==================== log-queries log-facility=/var/log/dnsmasq.log EOF步骤二：下载广告拦截列表# 下载 hosts 格式的广告列表 sudo wget -O /etc/dnsmasq.adblock.list https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts # 转换为 dnsmasq 格式 sudo sed -i 's/^0.0.0.0/address=/' /etc/dnsmasq.adblock.list sudo sed -i 's/$/\//' /etc/dnsmasq.adblock.list # 或直接下载 dnsmasq 格式 sudo wget -O /etc/dnsmasq.adblock.list https://raw.githubusercontent.com/AdguardTeam/AdguardFilters/master/MobileFilter/sections/adservers.txt sudo sed -i 's/^||address=/' /etc/dnsmasq.adblock.list sudo sed -i 's/\^/\//' /etc/dnsmasq.adblock.list步骤三：创建自定义广告规则sudo tee -a /etc/dnsmasq.adblock.list <<EOF # 自定义广告域名 address=/ad.doubleclick.net/ address=/ads.google.com/ address=/googlesyndication.com/ address=/googleadservices.com/ address=/tracker.analytics.com/ EOF步骤四：测试配置# 测试国内域名 dig @192.168.1.10 baidu.com dig @192.168.1.10 qq.com # 测试国外域名 dig @192.168.1.10 google.com dig @192.168.1.10 youtube.com # 测试广告拦截 dig @192.168.1.10 ad.doubleclick.net dig @192.168.1.10 ads.google.com # 查看查询日志 sudo tail -f /var/log/dnsmasq.log验证与调优查看分流效果：# 分析日志，查看各域名使用的上游服务器 sudo grep "server" /var/log/dnsmasq.log | tail -20 # 统计各上游服务器的查询次数 sudo grep "queries forwarded" /var/log/dnsmasq.log性能调优：# 根据实际使用情况调整缓存大小 # 查看缓存命中率 sudo systemctl kill -s USR1 dnsmasq sudo journalctl -u dnsmasq --since "1 second ago" | grep "cache" # 调整并发连接数 echo "dns-forward-max=10000" | sudo tee -a /etc/dnsmasq.conf七、常见问题1. 配置问题Q: DNS 查询没有响应A: 检查以下几点：# 1. 检查服务状态 sudo systemctl status dnsmasq # 2. 检查端口监听 sudo netstat -tulnp | grep 53 # 3. 测试本地 DNS dig @127.0.0.1 google.com # 4. 检查防火墙 sudo iptables -L -n -v | grep 53 # 5. 启用详细日志 log-queries=extraQ: 某些域名无法解析A: 可能的原因和解决方案：# 1. 检查是否被本地配置拦截 grep domain /etc/dnsmasq.conf grep address /etc/dnsmasq.conf # 2. 检查 DNSSEC 验证是否失败 grep dnssec /etc/dnsmasq.conf # 3. 尝试禁用 DNSSEC # dnssec-check-unsigned=no # 4. 查看详细查询日志 log-queries=extra sudo tail -f /var/log/dnsmasq.log2. 性能问题Q: DNS 解析速度慢A: 优化建议：# 1. 增大缓存 cache-size=20000 # 2. 启用快速重试 fast-dns-retry=500,5000 # 3. 使用 all-servers all-servers # 4. 检查网络延迟 ping -c 10 8.8.8.8 ping -c 10 114.114.114.114Q: 内存占用过高A: 调整配置：# 1. 减小缓存大小 cache-size=1000 # 2. 减少并发连接 dns-forward-max=1000 # 3. 减少 TTL 值 max-cache-ttl=36003. 安全问题Q: 防止 DNS 放大攻击A: 安全配置：# 限制服务范围 local-service # 限制 TTL limit-ttl=100 # 限制递归 bogus-priv # 禁止查询特定记录 filter-rr=ANY标签：dnsmasq、DNS、网络技术相关文档：dnsmasq-简介与安装dnsmasq-DNS记录与解析dnsmasq-配置文件与管理
dnsmasq 简介与安装一、概述1. 简介A. 是什么dnsmasq 是一个轻量级的网络服务器软件，集成了 DNS、DHCP、TFTP、PXE 和路由器通告等多种网络服务功能。它最初由 Simon Kelley 开发，专为嵌入式系统和资源受限环境设计，因此在保持功能强大的同时，对系统资源的需求非常小。dnsmasq 的核心设计理念是提供耦合的 DNS 和 DHCP 服务，这两种服务在网络环境中通常是紧密相关的。当 DHCP 服务器为客户端分配 IP 地址时，DNS 服务器需要能够解析这些客户端的主机名，dnsmasq 将这两种功能无缝集成在一起。B. 为什么学学习 dnsmasq 有以下几个重要理由：广泛的应用场景：dnsmasq 被众多网络设备和系统采用。许多家用路由器（如 OpenWrt、DD-WRT）、Linux 发行版、虚拟化平台（如 libvirt）都默认使用 dnsmasq 作为网络服务组件。资源占用极小：相比 BIND 等重量级 DNS 服务器，dnsmasq 的内存占用和 CPU 使用率都非常低，适合在资源受限的环境中运行。配置简单直观：dnsmasq 的配置文件语法简洁明了，一个简单的配置文件就能实现复杂的网络服务需求，学习成本低。功能全面：虽然轻量，但 dnsmasq 提供了企业级网络服务所需的大部分功能，包括 DNS 缓存、DHCP 地址分配、静态地址绑定、TFTP 网络启动等。开源免费：dnsmasq 采用 GPL 许可证发布，完全免费且源代码开放，可以自由使用、修改和分发。C. 学完能做什么掌握 dnsmasq 后，你可以实现以下功能：搭建家庭网络服务：为家庭网络提供 DNS 解析和 DHCP 服务，实现设备自动获取 IP 地址和本地域名解析。构建企业内网 DNS：为企业内部网络提供高效的 DNS 缓存和转发服务，减轻公网 DNS 服务器压力，提高解析速度。部署 PXE 网络启动：搭建网络启动服务器，实现操作系统无人值守批量安装。实现 DNS 分流：配置智能 DNS 转发，将不同的域名查询转发到不同的上游服务器，实现国内外域名分流解析。搭建开发测试环境：为开发测试环境提供灵活的网络服务，支持多网段、多接口配置。实现广告拦截：通过 DNS 重定向和拦截功能，实现网络广告过滤和家长控制。2. 前置知识A. 必备技能基本 Linux 操作：熟悉 Linux 命令行，能够使用文本编辑器（如 vim、nano）编辑配置文件网络基础概念：了解 IP 地址、子网掩码、网关、DNS 服务器等基本网络概念服务管理：了解如何使用 systemd 或 init.d 管理系统服务B. 推荐知识DNS 协议基础：了解 DNS 域名结构、记录类型（A 记录、CNAME 等）、递归查询等概念DHCP 协议基础：了解 DHCP 地址分配流程、租期、选项等概念网络调试工具：熟悉 ping、dig、nslookup、tcpdump 等网络诊断工具的使用二、环境准备1. 系统要求dnsmasq 支持多种操作系统和平台：Linux 发行版：Ubuntu、Debian、CentOS、Red Hat、Fedora、Arch Linux、openSUSE 等BSD 系统：FreeBSD、OpenBSD、NetBSDUnix 系统：macOS、Solaris嵌入式系统：OpenWrt、DD-WRT、Tomato 等路由器系统最低硬件要求：内存：几 MB 即可运行（典型占用约 2-5 MB）存储：dnsmasq 二进制文件约 200-500 KBCPU：无特殊要求，任何支持运行 Linux 的处理器均可2. 安装步骤A. Debian/Ubuntu 系统使用 apt 包管理器安装：# 更新软件源 sudo apt update # 安装 dnsmasq sudo apt install dnsmasq -y安装完成后，dnsmasq 服务会自动启动。可以使用以下命令检查服务状态：# 检查服务状态 sudo systemctl status dnsmasq # 查看版本信息 dnsmasq --versionB. CentOS/RHEL 系统使用 yum 或 dnf 包管理器安装：# CentOS 7/RHEL 7 使用 yum sudo yum install dnsmasq -y # CentOS 8/RHEL 8/Fedora 使用 dnf sudo dnf install dnsmasq -y # 启动服务 sudo systemctl start dnsmasq # 设置开机自启 sudo systemctl enable dnsmasqC. Arch Linux使用 pacman 包管理器安装：# 安装 dnsmasq sudo pacman -S dnsmasq # 启动服务 sudo systemctl start dnsmasq # 设置开机自启 sudo systemctl enable dnsmasqD. FreeBSD 系统使用 pkg 包管理器安装：# 安装 dnsmasq sudo pkg install dnsmasq # 启用服务 echo 'dnsmasq_enable="YES"' | sudo tee -a /etc/rc.conf # 启动服务 sudo service dnsmasq startE. OpenWrt 路由器系统OpenWrt 系统通常默认已安装 dnsmasq。如需手动安装：# 使用 opkg 包管理器安装 opkg update opkg install dnsmasq # 配置文件位于 /etc/config/dhcp # OpenWrt 使用 UCI 配置系统，与标准配置文件有所不同F. macOS 系统使用 Homebrew 安装：# 安装 Homebrew（如果尚未安装） /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" # 安装 dnsmasq brew install dnsmasq # 启动服务 brew services start dnsmasqG. 源码编译如果需要从源码编译安装最新版本，可以按照以下步骤操作：# 安装编译依赖 # Debian/Ubuntu sudo apt install build-essential libidn11-dev libnetfilter-conntrack-dev # CentOS/RHEL sudo yum groupinstall "Development Tools" sudo yum install libidn-devel libnetfilter_conntrack-devel # 下载源码 wget http://thekelleys.org.uk/dnsmasq/dnsmasq-2.90.tar.gz tar -xzf dnsmasq-2.90.tar.gz cd dnsmasq-2.90 # 编译安装 make sudo make install # 创建 systemd 服务文件 sudo tee /etc/systemd/system/dnsmasq.service <<EOF [Unit] Description=dnsmasq After=network.target [Service] Type=forking PIDFile=/var/run/dnsmasq.pid ExecStart=/usr/local/sbin/dnsmasq -k ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure [Install] WantedBy=multi-user.target EOF # 重载 systemd 并启动服务 sudo systemctl daemon-reload sudo systemctl start dnsmasq sudo systemctl enable dnsmasq编译时可以禁用不需要的功能以减小二进制文件大小：# 仅编译 DNS 和 DHCP 功能 make COPTS="-DHAVE_DHCP -DHAVE_DHCP6" # 禁用 IPv6 支持 make COPTS="-DNO_IPV6" # 禁用 TFTP 功能 make COPTS="-DNO_TFTP"3. 验证安装安装完成后，使用以下方法验证 dnsmasq 是否正常工作：# 检查服务状态 sudo systemctl status dnsmasq # 查看进程 ps aux | grep dnsmasq # 检查端口监听 sudo netstat -tulnp | grep dnsmasq # 或使用 ss 命令 sudo ss -tulnp | grep dnsmasq # 测试 DNS 解析 dig @127.0.0.1 google.com # 查看 dnsmasq 版本 dnsmasq --version三、核心概念1. 基本术语在深入了解 dnsmasq 之前，需要理解以下几个核心术语：DNS 转发器：dnsmasq 本身不是递归 DNS 服务器，它不直接从根服务器开始解析域名，而是将客户端的 DNS 查询转发到上游的递归 DNS 服务器（如 ISP 提供的 DNS 服务器或公共 DNS 服务）。DNS 缓存：dnsmasq 会缓存上游 DNS 服务器返回的查询结果，当客户端再次查询相同域名时，直接从缓存返回结果，无需向上游服务器查询，显著提高解析速度。DHCP 地址池：DHCP 服务器可以分配的 IP 地址范围。dnsmasq 支持配置多个地址池，每个地址池可以有不同的网络参数。静态地址分配：为特定的设备（通过 MAC 地址或客户端 ID 识别）分配固定的 IP 地址，确保设备每次获取的 IP 地址不变。TFTP 服务器：简单文件传输协议服务器，主要用于网络启动场景，为客户端提供启动镜像文件。PXE 启动：预启动执行环境，允许计算机通过网络启动操作系统，无需本地存储设备。路由器通告（RA）：IPv6 路由器向网络中的设备通告网络前缀和其他网络参数的机制，是 IPv6 网络的基础功能。2. 工作原理dnsmasq 的工作原理可以用一个架构图来清晰地表示：graph TB subgraph 客户端 A[DHCP 客户端] B[DNS 客户端] C[PXE 客户端] end subgraph dnsmasq 服务 D[DHCP 服务器] E[DNS 转发器] F[DNS 缓存] G[TFTP 服务器] H[路由器通告 RA] end subgraph 上游服务 I[上游 DNS 服务器] J[启动镜像文件] end A -->|DORA 流程| D B -->|DNS 查询| E E -->|缓存未命中| I E -->|缓存命中| F C -->|启动请求| G G -->|读取文件| J H -->|RA 消息| A D -->|分配 IP| ADNS 工作流程：客户端向 dnsmasq 发送 DNS 查询请求dnsmasq 首先检查本地缓存，如果缓存中有结果，直接返回如果缓存中没有，dnsmasq 将查询转发到上游 DNS 服务器收到上游服务器的响应后，dnsmasq 将结果存入缓存并返回给客户端dnsmasq 还会读取 /etc/hosts 文件，可以解析本地主机名DHCP 工作流程（DORA）：Discover（发现）：客户端广播 DHCP Discover 报文寻找 DHCP 服务器Offer（提供）：dnsmasq 响应 DHCP Offer 报文，提供可用的 IP 地址Request（请求）：客户端广播 DHCP Request 报文，请求使用该 IP 地址Acknowledge（确认）：dnsmasq 响应 DHCP Ack 报文，确认地址分配PXE 启动流程：客户端通过 DHCP 获取 IP 地址和 TFTP 服务器地址客户端从 TFTP 服务器下载启动引导程序（pxelinux.0）执行引导程序，显示启动菜单用户选择启动项，下载对应的内核和initrd启动操作系统3. 架构图dnsmasq 在网络中的典型部署架构如下：graph LR Internet[互联网] -->|WAN 连接| Router[路由器] Router -->|LAN 接口| Switch[交换机] Switch --> S1[服务器 dnsmasq] Switch --> S2[PC 客户端] Switch --> S3[手机/平板] Switch --> S4[网络打印机] S1 -->|DNS 转发| DNS8[8.8.8.8] S1 -->|DNS 转发| DNS114[114.114.114.114] S2 -->|DHCP 请求| S1 S3 -->|DHCP 请求| S1 S4 -->|DHCP 请求| S1在这种架构中，dnsmasq 服务器承担以下角色：DHCP 服务器：为网络中的所有设备分配 IP 地址、网关、DNS 服务器等网络参数DNS 缓存服务器：缓存 DNS 查询结果，加快解析速度，减少带宽消耗本地 DNS 服务器：解析本地主机名，提供内网域名服务可选的 TFTP 服务器：为 PXE 网络启动提供启动镜像文件四、快速上手1. Hello World 示例让我们从一个最简单的配置开始，快速体验 dnsmasq 的基本功能。步骤一：备份原配置文件sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.backup步骤二：创建最小配置# 清空原配置文件 sudo tee /etc/dnsmasq.conf <<EOF # 监听接口 interface=eth0 # DHCP 地址池 dhcp-range=192.168.1.100,192.168.1.200,12h # 上游 DNS 服务器 server=8.8.8.8 server=114.114.114.114 # 缓存大小 cache-size=1000 EOF步骤三：重启服务# 重启 dnsmasq 服务 sudo systemctl restart dnsmasq # 检查服务状态 sudo systemctl status dnsmasq步骤四：测试 DNS 功能# 测试 DNS 解析 dig @127.0.0.1 google.com # 查询缓存统计 dig +short chaos txt cachesize.bind @127.0.0.1步骤五：测试 DHCP 功能将其他设备的网络设置改为自动获取 IP 地址，观察是否能够获取到 192.168.1.100-192.168.1.200 范围内的 IP 地址。查看 DHCP 租约：# 查看 DHCP 租约文件 sudo cat /var/lib/misc/dnsmasq.leases # 或在 FreeBSD 上 sudo cat /var/db/dnsmasq.leases2. 核心功能演示让我们通过更丰富的配置来展示 dnsmasq 的核心功能：sudo tee /etc/dnsmasq.conf <<EOF # ==================== 网络接口配置 ==================== # 监听指定网络接口 interface=eth0 # 绑定接口地址（避免绑定所有地址） bind-interfaces # ==================== DNS 配置 ==================== # 上游 DNS 服务器 server=8.8.8.8 server=8.8.4.4 # 指定域名使用特定 DNS 服务器 server=/cn/114.114.114.114 server=/apple.com/1.1.1.1 # DNS 缓存设置 cache-size=10000 # 缓存条目的最大 TTL max-cache-ttl=86400 # 缓存条目的最小 TTL min-cache-ttl=1800 # 否定响应的缓存时间 neg-ttl=3600 # 本地主机名解析 expand-hosts domain=local.lan # 读取额外的 hosts 文件 addn-hosts=/etc/dnsmasq.hosts # ==================== DHCP 配置 ==================== # DHCP 地址池（地址范围，租期） dhcp-range=eth0,192.168.1.100,192.168.1.200,12h # DHCP 选项 dhcp-option=eth0,3,192.168.1.1 dhcp-option=eth0,6,192.168.1.1,8.8.8.8 # 默认租期时间 dhcp-lease-max=1000 # 静态地址分配示例 # dhcp-host=AA:BB:CC:DD:EE:FF,192.168.1.10,server1,infinite # ==================== TFTP 配置 ==================== # 启用 TFTP 服务器 enable-tftp tftp-root=/var/tftpboot # TFTP 安全模式 tftp-secure # ==================== 日志配置 ==================== # 记录 DNS 查询 log-queries # 日志设施 log-facility=/var/log/dnsmasq.log EOF # 创建额外的 hosts 文件 sudo tee /etc/dnsmasq.hosts <<EOF 192.168.1.1 router.local.lan 192.168.1.10 server1.local.lan 192.168.1.20 printer.local.lan EOF # 创建 TFTP 根目录 sudo mkdir -p /var/tftpboot sudo chown nobody:nogroup /var/tftpboot # 重启服务 sudo systemctl restart dnsmasq3. 代码讲解让我们详细讲解上述配置文件中的关键选项：interface=eth0：指定 dnsmasq 监听的网络接口。默认情况下，dnsmasq 会监听所有活动接口，使用此选项可以限制服务只在特定接口上提供。bind-interfaces：强制 dnsmasq 绑定到指定的接口地址，而不是使用通配符地址。这在同一台机器上运行多个 DNS 服务器时很有用。server=8.8.8.8：指定上游 DNS 服务器。可以指定多个服务器，dnsmasq 会根据响应速度智能选择。server=/cn/114.114.114.114：通配符语法，表示所有以 .cn 结尾的域名查询都转发到 114.114.114.114 服务器。这可以实现国内外 DNS 分流。cache-size=10000：设置 DNS 缓存条目数量。默认值通常较小（如 150），建议根据实际需求调大。expand-hosts：自动将本地主机名扩展为完全限定域名（FQDN）。例如，将 hostname 扩展为 hostname.local.lan。dhcp-range=eth0,192.168.1.100,192.168.1.200,12h：定义 DHCP 地址池。格式为 接口,起始IP,结束IP,租期。租期单位可以是 s（秒）、m（分钟）、h（小时）、d（天）。dhcp-option=eth0,3,192.168.1.1：设置 DHCP 选项。选项编号 3 表示默认网关。常见选项编号：3=网关，6=DNS 服务器，15=域名后缀。enable-tftp：启用内置 TFTP 服务器。tftp-root=/var/tftpboot：指定 TFTP 服务的根目录。log-queries：记录所有 DNS 查询日志，便于调试。log-facility=/var/log/dnsmasq.log：指定日志文件路径。五、进阶内容1. 常用功能A. 多子网支持dnsmasq 支持在多个网络接口上提供 DHCP 服务，每个接口可以有独立的配置：# 主网络（eth0） interface=eth0 dhcp-range=eth0,192.168.1.100,192.168.1.200,12h dhcp-option=eth0,3,192.168.1.1 dhcp-option=eth0,6,192.168.1.1 # 客人网络（eth1） interface=eth1 dhcp-range=eth1,192.168.2.100,192.168.2.200,2h dhcp-option=eth1,3,192.168.2.1 dhcp-option=eth1,6,8.8.8.8 # 禁用 eth1 的 DNS 服务 no-dhcp-interface=eth1B. 静态地址分配为特定设备分配固定 IP 地址：# 通过 MAC 地址分配 dhcp-host=11:22:33:44:55:66,192.168.1.10,server1,infinite # 通过主机名分配 dhcp-host=laptop,192.168.1.20 # 组合使用 dhcp-host=AA:BB:CC:DD:EE:FF,printer,192.168.1.30,infinite # 忽略特定设备 dhcp-host=11:22:33:44:55:66,ignoreC. DNS 重定向将特定域名解析到指定 IP 地址：# 拦截广告域名 address=/ad.example.com/0.0.0.0 address=/tracker.analytics.com/0.0.0.0 # 重定向到本地服务器 address=/api.local/192.168.1.10 # 使用 CNAME cname=www.local.lan,server1.local.lanD. DHCP 启动脚本当 DHCP 租约发生变化时执行脚本：# 在配置文件中指定脚本 dhcp-script=/usr/local/bin/dhcp-event.sh # 创建脚本 sudo tee /usr/local/bin/dhcp-event.sh <<EOF #!/bin/bash # 参数：$1=add/del/old，$2=MAC地址，$3=IP地址，$4=主机名 case "$1" in add) logger "DHCP: 新设备上线 - $2 ($3) $4" # 发送通知或执行其他操作 ;; del) logger "DHCP: 设备离线 - $2 ($3) $4" ;; esac exit 0 EOF sudo chmod +x /usr/local/bin/dhcp-event.sh2. 最佳实践A. 安全配置# 仅服务本地网络 local-service # 防止 DNS 放大攻击 limit-ttl=100 # 禁止查询私有 IP 反向解析 bogus-priv # 忽略包含特定地址的 DNS 响应 stop-dns-rebind rebind-localhost-ok # 仅允许特定接口 interface=eth0 # 排除特定接口 except-interface=eth1B. 性能优化# 增大 DNS 缓存 cache-size=10000 # 并发处理查询 dns-forward-max=5000 # 设置合理的端口范围 min-port=1024 max-port=65535 # 启用 DNS 快速重试 fast-dns-retry=1000,10000C. 日志管理# 详细日志 log-queries=extra # 记录 DHCP 事务 log-dhcp # 异步日志 log-async=20 # 按日期轮转日志 log-facility=/var/log/dnsmasq.log3. 性能调优dnsmasq 的性能调优主要关注以下几个方面：缓存大小：根据网络规模和查询频率调整 cache-size。对于小型网络（50 台设备以下），1000-5000 个缓存条目足够；对于中型网络（50-500 台设备），建议 5000-20000 个缓存条目。并发查询：dns-forward-max 参数控制最大并发 DNS 查询数。默认值通常较小，可以根据硬件能力适当提高。端口范围：min-port 和 max-port 参数控制用于发送 DNS 查询的源端口范围。在某些防火墙环境下，需要限制端口范围。TTL 控制：通过 max-cache-ttl、min-cache-ttl、neg-ttl 等参数控制缓存条目的生存时间，平衡缓存命中率和数据新鲜度。六、实战案例1. 家庭路由器场景快速部署场景描述你在家中有一台性能不错的 Linux 服务器，希望用它来替代家用路由器的部分功能，提供更强大的 DNS 和 DHCP 服务。网络环境如下：服务器通过 eth0 接口连接到主路由器（192.168.1.1）服务器静态 IP 地址为 192.168.1.10需要为家庭网络设备分配 192.168.1.100-192.168.1.200 的 IP 地址希望实现广告拦截功能为家庭设备提供本地域名解析实现步骤步骤一：配置服务器网络# 设置静态 IP 地址 sudo tee /etc/netplan/01-netcfg.yaml <<EOF network: version: 2 renderer: networkd ethernets: eth0: dhcp4: no addresses: - 192.168.1.10/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: [8.8.8.8, 8.8.4.4] EOF sudo netplan apply步骤二：配置 dnsmasqsudo tee /etc/dnsmasq.conf <<EOF # ==================== 网络配置 ==================== interface=eth0 bind-interfaces # ==================== DNS 配置 ==================== # 上游 DNS 服务器 server=8.8.8.8 server=8.8.4.4 # DNS 缓存 cache-size=5000 max-cache-ttl=86400 # 本地域名 domain=home.lan expand-hosts addn-hosts=/etc/dnsmasq.hosts # 广告拦截列表 addn-hosts=/etc/dnsmasq.adblock.list # ==================== DHCP 配置 ==================== # DHCP 地址池 dhcp-range=192.168.1.100,192.168.1.200,12h dhcp-option=3,192.168.1.1 dhcp-option=6,192.168.1.10 # 必略网关设备的 DHCP 请求 dhcp-host=192.168.1.1,ignore # ==================== 安全配置 ==================== bogus-priv local-service stop-dns-rebind # ==================== 日志配置 ==================== log-queries log-dhcp log-facility=/var/log/dnsmasq.log EOF步骤三：创建本地主机名文件sudo tee /etc/dnsmasq.hosts <<EOF # 网络设备 192.168.1.1 router.home.lan 192.168.1.10 server.home.lan # 个人设备 192.168.1.100 phone-mine.home.lan 192.168.1.101 tablet-mine.home.lan 192.168.1.102 laptop-mine.home.lan # 家人设备 192.168.1.110 phone-dad.home.lan 192.168.1.111 phone-mom.home.lan EOF步骤四：配置广告拦截# 下载广告域名列表 sudo wget -O /etc/dnsmasq.adblock.list https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts # 或者创建简单的拦截规则 sudo tee /etc/dnsmasq.adblock.list <<EOF # 广告域名 0.0.0.0 ad.doubleclick.net 0.0.0.0 ads.google.com 0.0.0.0 tracking.example.com 0.0.0.0 analytics.example.com EOF步骤五：启动服务并测试# 重启 dnsmasq sudo systemctl restart dnsmasq # 检查服务状态 sudo systemctl status dnsmasq # 测试本地域名解析 dig @192.168.1.10 router.home.lan # 测试广告拦截 dig @192.168.1.10 ad.doubleclick.net # 查看日志 sudo tail -f /var/log/dnsmasq.log步骤六：配置客户端将家庭网络中的设备 DNS 服务器设置为 192.168.1.10，或关闭主路由器的 DHCP 功能，让 dnsmasq 统一管理。验证结果# 查看 DHCP 租约 cat /var/lib/misc/dnsmasq.leases # 查看 DNS 缓存统计 dig +short chaos txt cachesize.bind @192.168.1.10 # 测试广告拦截 curl -I http://ad.doubleclick.net2. 开发测试环境搭建场景描述作为开发人员，你需要搭建一个与生产环境隔离的测试网络环境，用于：测试 DNS 分流功能测试 DHCP 静态地址分配模拟多子网环境测试网络启动功能实现步骤步骤一：创建虚拟网络接口# 创建网桥 sudo brctl addbr br-test sudo ip addr add 192.168.100.1/24 dev br-test sudo ip link set br-test up # 创建测试网络接口（用于虚拟机） sudo ip link add link br-test name br-test.100 type vlan id 100 sudo ip link set br-test.100 up步骤二：配置 dnsmasqsudo tee /etc/dnsmasq.conf <<EOF # ==================== 网络配置 ==================== interface=br-test bind-interfaces # ==================== DNS 配置 ==================== # 多上游服务器 server=8.8.8.8 server=114.114.114.114 # DNS 分流测试 server=/test.local/192.168.100.1 server=/dev.local/8.8.8.8 # DNS 缓存 cache-size=2000 # 本地域名 domain=test.local expand-hosts # ==================== DHCP 配置 ==================== # 主地址池 dhcp-range=192.168.100.100,192.168.100.200,1h dhcp-option=3,192.168.100.1 dhcp-option=6,192.168.100.1 # 静态地址分配（虚拟机） dhcp-host=52:54:00:00:01:01,vm-web,192.168.100.10,infinite dhcp-host=52:54:00:00:01:02,vm-db,192.168.100.11,infinite dhcp-host=52:54:00:00:01:03,vm-cache,192.168.100.12,infinite # ==================== TFTP 配置 ==================== enable-tftp tftp-root=/srv/tftp tftp-secure # PXE 启动 pxe-prompt="Press F8 for boot menu", 5 pxe-service=x86PC, "Install Linux", pxelinux pxe-service=x86PC, "Boot from local disk", 0 # ==================== 日志配置 ==================== log-queries log-dhcp log-facility=/var/log/dnsmasq-test.log EOF步骤三：创建 TFTP 目录结构# 创建 TFTP 根目录 sudo mkdir -p /srv/tftp/pxelinux.cfg sudo chown nobody:nogroup /srv/tftp # 创建简单的 PXE 配置 sudo tee /srv/tftp/pxelinux.cfg/default <<EOF DEFAULT linux LABEL linux KERNEL vmlinuz APPEND initrd=initrd.img ip=dhcp LABEL local LOCALBOOT 0 EOF步骤四：创建测试用 hosts 文件sudo tee /etc/dnsmasq-test.hosts <<EOF # 测试服务器 192.168.100.10 web.test.local 192.168.100.11 db.test.local 192.168.100.12 cache.test.local # 开发环境别名 192.168.100.10 www.dev.local 192.168.100.11 api.dev.local 192.168.100.12 cdn.dev.local EOF # 在配置中引用 echo "addn-hosts=/etc/dnsmasq-test.hosts" | sudo tee -a /etc/dnsmasq.conf步骤五：启动并测试# 重启服务 sudo systemctl restart dnsmasq # 测试 DNS 分流 dig @192.168.100.1 www.test.local dig @192.168.100.1 www.dev.local # 测试静态地址 # 在虚拟机中请求 DHCP，观察是否获得正确 IP # 测试 TFTP tftp 192.168.100.1 -c get pxelinux.0 # 查看详细日志 sudo tail -f /var/log/dnsmasq-test.log验证结果# 验证 DHCP 静态地址分配 cat /var/lib/misc/dnsmasq.leases | grep vm-web # 验证 DNS 分流 dig @192.168.100.1 +short test.local dig @192.168.100.1 +short dev.local # 验证 TFTP 服务 sudo netstat -tulnp | grep 69七、常见问题1. 安装问题Q: 安装后服务无法启动A: 检查配置文件语法是否正确，使用测试模式：# 测试配置文件 dnsmasq --test --conf-file=/etc/dnsmasq.conf # 查看详细错误信息 dnsmasq -k --log-debug --conf-file=/etc/dnsmasq.confQ: 端口已被占用A: dnsmasq 默认使用 53 端口（DNS），检查是否有其他服务占用：# 查看端口占用 sudo netstat -tulnp | grep 53 # 停止冲突的服务 sudo systemctl stop systemd-resolved sudo systemctl stop named2. 配置问题Q: DHCP 客户端无法获取 IP 地址A: 检查以下几点：# 1. 检查 dnsmasq 是否在正确的接口上监听 sudo netstat -tulnp | grep dnsmasq # 2. 检查防火墙规则 sudo iptables -L -n -v | grep 67 sudo iptables -L -n -v | grep 68 # 3. 检查 DHCP 地址池配置 grep dhcp-range /etc/dnsmasq.conf # 4. 查看详细日志 sudo tail -f /var/log/dnsmasq.logQ: DNS 解析不生效A: 检查 DNS 配置：# 1. 测试本地 DNS dig @127.0.0.1 google.com # 2. 检查上游服务器配置 grep server /etc/dnsmasq.conf # 3. 查看 DNS 缓存 dig +short chaos txt cachesize.bind @127.0.0.1 # 4. 启用查询日志调试 log-queries=extra3. 运行问题Q: 配置修改后如何生效A: dnsmasq 支持热重载部分配置：# 重载 hosts 文件和租约文件（不重读主配置） sudo systemctl kill -s HUP dnsmasq # 完全重启服务 sudo systemctl restart dnsmasq # 重新加载配置并查看缓存统计 sudo systemctl kill -s USR1 dnsmasqQ: 如何查看运行状态A: 使用信号和日志：# 发送 SIGUSR1 查看统计信息 sudo systemctl kill -s USR1 dnsmasq sudo journalctl -u dnsmasq -n 50 # 查看缓存内容 sudo systemctl kill -s USR1 dnsmasq sudo journalctl -u dnsmasq --since "1 second ago"八、参考资料标签：dnsmasq、网络技术、服务器相关文档：dnsmasq-DNS配置基础dnsmasq-DHCPv4配置dnsmasq-配置文件与管理
dnsmasq min-cache-ttl 参数工作原理技术分析一、概述1. 问题定义在使用 dnsmasq 作为 DNS 缓存服务器时，min-cache-ttl 参数是一个重要但常被误解的配置选项。本文将深入分析该参数的工作原理、限制条件以及实际应用场景。2. 核心问题什么是 min-cache-ttl 参数？它与普通的 DNS TTL 有什么区别？为什么设置 min-cache-ttl=36000（10 小时）会遇到问题？3. 分析目标理解 dnsmasq 的 DNS 缓存机制掌握 min-cache-ttl 参数的工作原理了解该参数的限制和替代方案二、背景知识1. DNS TTL 基础概念DNS TTL（Time To Live）是指 DNS 记录在缓存中的生存时间，单位为秒。当 DNS 解析器查询域名时，会将结果缓存指定时长，过期后需要重新查询。2. dnsmasq 简介dnsmasq 是一个轻量级的 DNS 转发器和 DHCP 服务器，广泛用于家庭路由器、嵌入式设备和小型网络环境。其主要功能包括：DNS 缓存：缓存 DNS 查询结果，提高解析速度DHCP 服务：为网络设备分配 IP 地址DNS 转发：将查询请求转发到上游 DNS 服务器三、dnsmasq 缓存机制1. 缓存工作流程graph TD A[客户端 DNS 查询] --> B{检查本地缓存} B -->|命中| C[返回缓存结果] B -->|未命中| D[转发到上游 DNS] D --> E[接收上游响应] E --> F[应用 TTL 规则] F --> G[存入缓存] G --> C C --> H[返回给客户端]2. TTL 相关参数dnsmasq 提供了多个与 TTL 相关的配置参数：参数作用默认值cache-ttl缓存条目的默认 TTL无min-cache-ttl最小缓存 TTL0max-cache-ttl最大缓存 TTL无限制max-ttl返回给客户端的最大 TTL无限制local-ttl本地记录（如 /etc/hosts）的 TTL0neg-ttl否定响应（NXDOMAIN）的缓存时间无四、min-cache-ttl 参数详解1. 参数定义min-cache-ttl= 用于设置 DNS 缓存条目的最小生存时间。2. 工作原理A. 首次查询当客户端首次查询某个域名时：dnsmasq 将查询转发到上游 DNS 服务器上游服务器返回 DNS 记录及其 TTL 值dnsmasq 将记录存入缓存，返回给客户端的 TTL 为原始值B. 后续查询当客户端再次查询同一域名时：dnsmasq 检查本地缓存如果缓存未过期，直接返回结果返回给客户端的 TTL 是缓存中剩余的时间C. TTL 扩展机制min-cache-ttl 的核心功能是扩展短 TTL 值：graph LR A[上游返回 TTL=60s] --> B{min-cache-ttl 设置值} B -->|min-cache-ttl=300| C[缓存 TTL 扩展为 300s] B -->|min-cache-ttl=0| D[使用原始 TTL=60s] C --> E[减少上游查询] D --> F[遵守原始 TTL]3. 代码实现原理根据 dnsmasq 源码分析，min-cache-ttl 的实现逻辑如下：// src/cache.c 中的 TTL 调整逻辑 if (daemon->min_cache_ttl != 0 && ttl < daemon->min_cache_ttl) ttl = daemon->min_cache_ttl;这段代码的核心含义是：如果配置了 min-cache-ttl 且上游返回的 TTL 小于该值，则强制使用 min-cache-ttl 作为缓存时间。4. 关键限制A. 硬编码限制dnsmasq 在源码中对 min-cache-ttl 设置了硬编码限制：// src/config.h #define TTL_FLOOR_LIMIT 3600 /* 不允许 min-cache-ttl 超过 1 小时 */这意味着：即使配置文件中设置 min-cache-ttl=36000，dnsmasq 实际使用的最大值只能是 3600 秒（1 小时）。B. 为什么有此限制？DNS 协议设计原则：TTL 反映了域名所有者对该记录变化频率的预期，人为延长可能违反这一原则数据新鲜度：过长的缓存时间可能导致客户端使用过期的 IP 地址故障恢复：当需要紧急切换 DNS 记录时，过长的缓存会延迟生效五、36000 秒配置的问题1. 问题分析用户设置 min-cache-ttl=36000（10 小时）的初衷可能是：减少频繁的 DNS 查询降低上游 DNS 服务器负载提高域名解析速度2. 实际效果由于 dnsmasq 的硬编码限制：配置 min-cache-ttl=36000 不会生效实际使用的最大值为 3600 秒配置文件中的值会被静默截断3. 验证方法检查 dnsmasq 日志或使用以下命令验证：# 查看当前配置 dnsmasq --test # 查看缓存中的 TTL dig @127.0.0.1 example.com六、解决方案1. 方案对比方案优点缺点适用场景使用默认值安全、符合 DNS 协议无法减少查询频率一般场景重新编译 dnsmasq可突破限制维护成本高特殊需求使用上游 DNS 缓存配置灵活需要额外服务复杂网络修改源码限制完全控制升级困难定制化部署2. 推荐方案A. 一般场景使用 max-cache-ttl 控制最大缓存时间，而非强制延长最小时间：# /etc/dnsmasq.conf max-cache-ttl=3600 # 最大缓存 1 小时 cache-size=1000 # 缓存 1000 条记录B. 特殊需求场景如确需更长的缓存时间，考虑重新编译 dnsmasq：# 1. 修改源码中的 TTL_FLOOR_LIMIT # 2. 重新编译 make && make install # 3. 验证修改 dnsmasq --versionC. 替代方案使用支持更长 TTL 的 DNS 缓存服务，如：UnboundPowerDNS RecursorBIND 9七、最佳实践1. 配置建议大多数情况下不需要设置 min-cache-ttl如需设置，建议值不超过 300-600 秒优先使用 max-cache-ttl 控制缓存时长2. 监控指标DNS 查询响应时间缓存命中率上游 DNS 查询频率3. 故障排查当 DNS 解析出现异常时，检查：配置文件语法是否正确dnsmasq 日志中的警告信息实际生效的配置值八、总结min-cache-ttl 参数是 dnsmasq 中一个强大的配置选项，但也存在内置限制。理解其工作原理和限制条件，有助于更好地配置 DNS 缓存策略。关键要点：min-cache-ttl 用于扩展短 TTL 值，减少上游查询dnsmasq 硬编码限制该参数最大值为 3600 秒设置 min-cache-ttl=36000 不会生效，会被截断为 3600 秒大多数场景不需要设置此参数，使用默认配置即可如需更长缓存时间，考虑重新编译或使用替代方案参考资料dnsmasq 官方文档dnsmasq 源码 GitHub 仓库dnsmasq 详细解析与配置dnsmasq 白名单限制 DNS 缓存设置Linux DNS 解析优化方案