Loading... # 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、NetBSD **Unix 系统**:macOS、Solaris **嵌入式系统**:OpenWrt、DD-WRT、Tomato 等路由器系统 **最低硬件要求**: - 内存:几 MB 即可运行(典型占用约 2-5 MB) - 存储:dnsmasq 二进制文件约 200-500 KB - CPU:无特殊要求,任何支持运行 Linux 的处理器均可 ## 2. 安装步骤 ### A. Debian/Ubuntu 系统 使用 apt 包管理器安装: ```bash # 更新软件源 sudo apt update # 安装 dnsmasq sudo apt install dnsmasq -y ``` 安装完成后,dnsmasq 服务会自动启动。可以使用以下命令检查服务状态: ```bash # 检查服务状态 sudo systemctl status dnsmasq # 查看版本信息 dnsmasq --version ``` ### B. CentOS/RHEL 系统 使用 yum 或 dnf 包管理器安装: ```bash # 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 dnsmasq ``` ### C. Arch Linux 使用 pacman 包管理器安装: ```bash # 安装 dnsmasq sudo pacman -S dnsmasq # 启动服务 sudo systemctl start dnsmasq # 设置开机自启 sudo systemctl enable dnsmasq ``` ### D. FreeBSD 系统 使用 pkg 包管理器安装: ```bash # 安装 dnsmasq sudo pkg install dnsmasq # 启用服务 echo 'dnsmasq_enable="YES"' | sudo tee -a /etc/rc.conf # 启动服务 sudo service dnsmasq start ``` ### E. OpenWrt 路由器系统 OpenWrt 系统通常默认已安装 dnsmasq。如需手动安装: ```bash # 使用 opkg 包管理器安装 opkg update opkg install dnsmasq # 配置文件位于 /etc/config/dhcp # OpenWrt 使用 UCI 配置系统,与标准配置文件有所不同 ``` ### F. macOS 系统 使用 Homebrew 安装: ```bash # 安装 Homebrew(如果尚未安装) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" # 安装 dnsmasq brew install dnsmasq # 启动服务 brew services start dnsmasq ``` ### G. 源码编译 如果需要从源码编译安装最新版本,可以按照以下步骤操作: ```bash # 安装编译依赖 # 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 ``` 编译时可以禁用不需要的功能以减小二进制文件大小: ```bash # 仅编译 DNS 和 DHCP 功能 make COPTS="-DHAVE_DHCP -DHAVE_DHCP6" # 禁用 IPv6 支持 make COPTS="-DNO_IPV6" # 禁用 TFTP 功能 make COPTS="-DNO_TFTP" ``` ## 3. 验证安装 安装完成后,使用以下方法验证 dnsmasq 是否正常工作: ```bash # 检查服务状态 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 的工作原理可以用一个架构图来清晰地表示: ```mermaid 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| A ```  **DNS 工作流程**: 1. 客户端向 dnsmasq 发送 DNS 查询请求 2. dnsmasq 首先检查本地缓存,如果缓存中有结果,直接返回 3. 如果缓存中没有,dnsmasq 将查询转发到上游 DNS 服务器 4. 收到上游服务器的响应后,dnsmasq 将结果存入缓存并返回给客户端 5. dnsmasq 还会读取 /etc/hosts 文件,可以解析本地主机名 **DHCP 工作流程(DORA)**: 1. Discover(发现):客户端广播 DHCP Discover 报文寻找 DHCP 服务器 2. Offer(提供):dnsmasq 响应 DHCP Offer 报文,提供可用的 IP 地址 3. Request(请求):客户端广播 DHCP Request 报文,请求使用该 IP 地址 4. Acknowledge(确认):dnsmasq 响应 DHCP Ack 报文,确认地址分配 **PXE 启动流程**: 1. 客户端通过 DHCP 获取 IP 地址和 TFTP 服务器地址 2. 客户端从 TFTP 服务器下载启动引导程序(pxelinux.0) 3. 执行引导程序,显示启动菜单 4. 用户选择启动项,下载对应的内核和initrd 5. 启动操作系统 ## 3. 架构图 dnsmasq 在网络中的典型部署架构如下: ```mermaid 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 的基本功能。 **步骤一:备份原配置文件** ```bash sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.backup ``` **步骤二:创建最小配置** ```bash # 清空原配置文件 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 ``` **步骤三:重启服务** ```bash # 重启 dnsmasq 服务 sudo systemctl restart dnsmasq # 检查服务状态 sudo systemctl status dnsmasq ``` **步骤四:测试 DNS 功能** ```bash # 测试 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 租约: ```bash # 查看 DHCP 租约文件 sudo cat /var/lib/misc/dnsmasq.leases # 或在 FreeBSD 上 sudo cat /var/db/dnsmasq.leases ``` ## 2. 核心功能演示 让我们通过更丰富的配置来展示 dnsmasq 的核心功能: ```bash 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 dnsmasq ``` ## 3. 代码讲解 让我们详细讲解上述配置文件中的关键选项: **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 服务,每个接口可以有独立的配置: ```bash # 主网络(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=eth1 ``` ### B. 静态地址分配 为特定设备分配固定 IP 地址: ```bash # 通过 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,ignore ``` ### C. DNS 重定向 将特定域名解析到指定 IP 地址: ```bash # 拦截广告域名 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.lan ``` ### D. DHCP 启动脚本 当 DHCP 租约发生变化时执行脚本: ```bash # 在配置文件中指定脚本 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.sh ``` ## 2. 最佳实践 ### A. 安全配置 ```bash # 仅服务本地网络 local-service # 防止 DNS 放大攻击 limit-ttl=100 # 禁止查询私有 IP 反向解析 bogus-priv # 忽略包含特定地址的 DNS 响应 stop-dns-rebind rebind-localhost-ok # 仅允许特定接口 interface=eth0 # 排除特定接口 except-interface=eth1 ``` ### B. 性能优化 ```bash # 增大 DNS 缓存 cache-size=10000 # 并发处理查询 dns-forward-max=5000 # 设置合理的端口范围 min-port=1024 max-port=65535 # 启用 DNS 快速重试 fast-dns-retry=1000,10000 ``` ### C. 日志管理 ```bash # 详细日志 log-queries=extra # 记录 DHCP 事务 log-dhcp # 异步日志 log-async=20 # 按日期轮转日志 log-facility=/var/log/dnsmasq.log ``` ## 3. 性能调优 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 地址 - 希望实现广告拦截功能 - 为家庭设备提供本地域名解析 ### 实现步骤 **步骤一:配置服务器网络** ```bash # 设置静态 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 ``` **步骤二:配置 dnsmasq** ```bash sudo 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 ``` **步骤三:创建本地主机名文件** ```bash 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 ``` **步骤四:配置广告拦截** ```bash # 下载广告域名列表 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 ``` **步骤五:启动服务并测试** ```bash # 重启 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 统一管理。 ### 验证结果 ```bash # 查看 DHCP 租约 cat /var/lib/misc/dnsmasq.leases # 查看 DNS 缓存统计 dig +short chaos txt cachesize.bind @192.168.1.10 # 测试广告拦截 curl -I http://ad.doubleclick.net ``` ## 2. 开发测试环境搭建 ### 场景描述 作为开发人员,你需要搭建一个与生产环境隔离的测试网络环境,用于: - 测试 DNS 分流功能 - 测试 DHCP 静态地址分配 - 模拟多子网环境 - 测试网络启动功能 ### 实现步骤 **步骤一:创建虚拟网络接口** ```bash # 创建网桥 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 ``` **步骤二:配置 dnsmasq** ```bash sudo 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 目录结构** ```bash # 创建 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 文件** ```bash 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 ``` **步骤五:启动并测试** ```bash # 重启服务 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 ``` ### 验证结果 ```bash # 验证 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: 检查配置文件语法是否正确,使用测试模式: ```bash # 测试配置文件 dnsmasq --test --conf-file=/etc/dnsmasq.conf # 查看详细错误信息 dnsmasq -k --log-debug --conf-file=/etc/dnsmasq.conf ``` ### Q: 端口已被占用 A: dnsmasq 默认使用 53 端口(DNS),检查是否有其他服务占用: ```bash # 查看端口占用 sudo netstat -tulnp | grep 53 # 停止冲突的服务 sudo systemctl stop systemd-resolved sudo systemctl stop named ``` ## 2. 配置问题 ### Q: DHCP 客户端无法获取 IP 地址 A: 检查以下几点: ```bash # 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.log ``` ### Q: DNS 解析不生效 A: 检查 DNS 配置: ```bash # 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=extra ``` ## 3. 运行问题 ### Q: 配置修改后如何生效 A: dnsmasq 支持热重载部分配置: ```bash # 重载 hosts 文件和租约文件(不重读主配置) sudo systemctl kill -s HUP dnsmasq # 完全重启服务 sudo systemctl restart dnsmasq # 重新加载配置并查看缓存统计 sudo systemctl kill -s USR1 dnsmasq ``` ### Q: 如何查看运行状态 A: 使用信号和日志: ```bash # 发送 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-DNS配置基础.md) - [dnsmasq-DHCPv4配置](dnsmasq-DHCPv4配置.md) - [dnsmasq-配置文件与管理](dnsmasq-配置文件与管理.md) 最后修改:2026 年 01 月 30 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏