什么是Dnsmasq

Dnsmasq 是一个轻量级但功能强大的 DNS 转发器和 DHCP 服务器软件,由 Simon Kelley 开发并维护。它专为小型网络环境设计,具有以下显著特点:

  1. 轻量高效:
  • 单个进程同时提供 DNS 和 DHCP 服务
  • 内存占用极低(通常在 10MB 以下)
  • 支持并发处理数百个请求
  1. 主要功能:
  • DNS 转发与缓存:可缓存 DNS 查询结果,显著提高重复查询速度
  • DHCP 服务:支持 IPv4 地址分配,可配置静态 IP 映射
  • TFTP 服务器(可选):用于网络启动场景
  • 支持 PXE 网络引导
  1. 典型应用场景:
  • 家庭网络:在路由器上运行,提供本地 DNS 解析和 IP 分配
  • 小型办公室:20-50 台设备的网络环境
  • 开发测试:
    • 本地开发环境搭建
    • 容器/Kubernetes 测试环境
    • CI/CD 流水线中的网络服务模拟
  • 嵌入式系统:因其小巧高效,常被集成到各种网络设备中
  1. 配置文件示例:
# DNS 配置
server=8.8.8.8       # 上游 DNS 服务器
cache-size=1000      # 缓存条目数
local=/example.com/  # 本地域名解析

# DHCP 配置
dhcp-range=192.168.1.100,192.168.1.200,24h
dhcp-host=00:1A:2B:3C:4D:5E,192.168.1.50  # 静态 IP 分配

  1. 优势对比: 相比 BIND 等全功能 DNS 服务器,Dnsmasq 更简单易用;相比传统 DHCP 服务,它提供了 DNS 集成功能,特别适合资源有限的环境。

  2. 安全性:

  • 支持 DNSSEC 验证
  • 可配置访问控制列表
  • 支持查询日志记录和监控

目前最新稳定版本为 2.89(截至2023年),支持包括 Linux、BSD 和 macOS 在内的多种 Unix-like 系统,在 OpenWrt 等路由器固件中被广泛采用。

安装Dnsmasq

在Linux系统上安装

  1. Debian/Ubuntu系统:

    sudo apt update
    sudo apt install dnsmasq
    

  2. CentOS/RHEL系统:

    sudo yum install dnsmasq
    

  3. Arch Linux:

    sudo pacman -S dnsmasq
    

基本配置

主要配置文件

Dnsmasq的主配置文件通常位于:

/etc/dnsmasq.conf

常用配置选项

  1. 监听接口:

    interface=eth0
    listen-address=127.0.0.1
    

  2. 上游DNS服务器:

    server=8.8.8.8
    server=8.8.4.4
    

  3. 本地域名解析(hosts文件):

    expand-hosts
    local=/example.com/
    domain=example.com
    

  4. DNS缓存设置:

    cache-size=1000
    no-negcache
    

高级功能配置

自定义域名解析

  1. 添加本地域名解析记录:

    address=/example.com/192.168.1.100
    

  2. 使用单独的hosts文件:

    addn-hosts=/etc/dnsmasq.hosts
    

DHCP服务配置

dhcp-range=192.168.1.100,192.168.1.200,12h
dhcp-option=option:router,192.168.1.1
dhcp-option=option:dns-server,192.168.1.1

日志配置

log-queries
log-facility=/var/log/dnsmasq.log

启动与管理

  1. 启动服务:

    sudo systemctl start dnsmasq
    

  2. 设置开机自启:

    sudo systemctl enable dnsmasq
    

  3. 检查服务状态:

    sudo systemctl status dnsmasq
    

  4. 重新加载配置:

    sudo systemctl reload dnsmasq
    

测试与验证

  1. 测试DNS解析:

    dig example.com @127.0.0.1
    

  2. 查看缓存内容:

    sudo kill -SIGUSR1 $(pgrep dnsmasq)
    grep "reply" /var/log/dnsmasq.log
    

  3. 清空DNS缓存:

    sudo systemctl restart dnsmasq
    

常见问题解决

  1. 端口冲突:

    • 检查53端口是否被占用:sudo netstat -tulnp | grep 53
    • 停止其他DNS服务如systemd-resolved:sudo systemctl stop systemd-resolved
  2. 解析失败:

    • 检查配置文件语法:sudo dnsmasq --test
    • 查看详细日志:sudo journalctl -u dnsmasq -f
  3. 性能优化:

    • 增加缓存大小:cache-size=5000
    • 禁用IPv6查询:filter-AAAA

安全配置建议

  1. 限制访问:

    local-service
    bind-interfaces
    

  2. 防止DNS污染:

    bogus-priv
    stop-dns-rebind
    

  3. 启用DNSSEC:

    dnssec
    dnssec-check-unsigned
    

  4. 限制查询:

    no-resolv
    server=/example.com/192.168.1.1
    

通过以上配置,您可以搭建一个功能完善且安全的本地DNS服务器,满足各种网络环境的需求。

使用Dnsmasq搭建DNS服务器指南的常见问题

安装问题

  1. Dnsmasq安装失败

    • 常见于包管理系统问题,如Ubuntu/Debian系统可使用sudo apt-get update && sudo apt-get install dnsmasq
    • CentOS/RHEL系统使用sudo yum install dnsmasq
    • 如遇依赖问题,可尝试sudo apt-get -f install修复依赖关系
  2. 端口53被占用

    • 检查是否有其他DNS服务运行:sudo netstat -tulnp | grep 53
    • 常见占用服务包括systemd-resolved(ubuntu 17.10+)、named(bind)
    • 解决方案:禁用systemd-resolved:sudo systemctl disable --now systemd-resolved并编辑/etc/resolv.conf

配置问题

  1. 配置文件错误

    • 主配置文件位置:/etc/dnsmasq.conf
    • 常见语法错误:缺少分号、错误的主机名格式
    • 建议使用dnsmasq --test测试配置语法
  2. 本地域名解析不生效

    • 确保配置了正确的本地域名:
    address=/example.com/192.168.1.100
    

    • 检查客户端DNS设置是否指向Dnsmasq服务器
    • 清除本地DNS缓存:sudo systemd-resolve --flush-caches(Linux)或ipconfig /flushdns(Windows)

运行问题

  1. Dnsmasq无法启动

    • 查看日志:journalctl -u dnsmasq或tail -f /var/log/syslog
    • 常见原因:配置文件语法错误、权限问题、端口冲突
    • 调试模式启动:sudo dnsmasq -d(前台运行)
  2. DNS查询响应慢

    • 启用查询缓存:cache-size=1000(默认150)
    • 配置上游DNS服务器:
    server=8.8.8.8
    server=8.8.4.4
    

    • 禁用IPv6查询:no-resolv和no-ipv6

高级问题

  1. DHCP与DNS整合问题

    • 确保启用DHCP功能:
    dhcp-range=192.168.1.50,192.168.1.150,12h
    dhcp-option=option:router,192.168.1.1
    

    • 动态DNS更新:dhcp-leasefile=/var/lib/misc/dnsmasq.leases
  2. 安全性问题

    • 限制查询来源:listen-address=127.0.0.1,192.168.1.1
    • 防止DNS放大攻击:filterwin2k和no-negcache
    • 启用详细日志:log-queries和log-dhcp

客户端配置

  1. 客户端无法使用DNS服务

    • 确保网络配置指向Dnsmasq服务器IP
    • 测试连通性:dig @dns_server_ip example.com
    • Windows客户端:检查网络适配器DNS设置
    • Linux客户端:检查/etc/resolv.conf是否配置正确
  2. 多子网环境问题

    • 多子网配置示例:
    interface=eth0
    dhcp-range=192.168.1.50,192.168.1.150,12h
    interface=eth1
    dhcp-range=10.0.0.50,10.0.0.150,12h
    

    • 确保IP转发已启用:sysctl net.ipv4.ip_forward=1

 

更多推荐