Dnsmasq 服务搭建完全教程 / 第 04 章:DHCP 配置
第 04 章:DHCP 配置
4.1 DHCP 基础概念
4.1.1 DHCP 工作流程(DORA)
客户端 Dnsmasq DHCP 服务器
│ │
│──── 1. DHCP Discover ────────→│ 广播:谁能给我 IP?
│ │
│←─── 2. DHCP Offer ───────────┤ 单播/广播:我有 192.168.1.100
│ │
│──── 3. DHCP Request ─────────→│ 广播:我要用这个 IP
│ │
│←─── 4. DHCP ACK ─────────────┤ 单播:确认,租约 24 小时
│ │
│ 使用 IP:192.168.1.100 │
│ 网关:192.168.1.1 │
│ DNS:192.168.1.1 │
4.1.2 DHCP 关键参数
| 参数 | 说明 | 典型值 |
|---|
| 租约时间 | IP 地址的使用期限 | 1h - 24h |
| 地址池 | 可分配的 IP 范围 | 192.168.1.100-200 |
| 子网掩码 | 网络划分 | 255.255.255.0 |
| 默认网关 | 出口路由 | 192.168.1.1 |
| DNS 服务器 | 域名解析 | 192.168.1.1 |
| NTP 服务器 | 时间同步 | 192.168.1.1 |
4.2 基本 DHCP 配置
4.2.1 最小 DHCP 配置
# /etc/dnsmasq.d/10-dhcp.conf
# 在 eth1 接口上启用 DHCP
interface=eth1
# 地址池:起始IP,结束IP,子网掩码,租约时间
dhcp-range=192.168.1.100,192.168.1.200,255.255.255.0,24h
# 默认网关
dhcp-option=option:router,192.168.1.1
# DNS 服务器
dhcp-option=option:dns-server,192.168.1.1
# 标记为权威 DHCP 服务器(快速响应,不等待其他 DHCP)
dhcp-authoritative
4.2.2 dhcp-range 详解
# 完整格式
dhcp-range=<起始IP>,<结束IP>,<掩码>,<租约时间>
# 示例
dhcp-range=192.168.1.100,192.168.1.200,255.255.255.0,24h
# 简写(自动计算掩码,假设 /24)
dhcp-range=192.168.1.100,192.168.1.200,24h
# 使用 tagged ranges(多网段)
dhcp-range=set:office,192.168.1.100,192.168.1.200,255.255.255.0,12h
dhcp-range=set:guest,192.168.2.100,192.168.2.200,255.255.255.0,1h
# 仅启用 DHCPv6(无状态)
dhcp-range=::,constructor:eth1,ra-stateless
# 有状态 DHCPv6
dhcp-range=fd00::100,fd00::fff,slaac,64,12h
| 参数 | 说明 |
|---|
| 起始 IP | 地址池起始 |
| 结束 IP | 地址池结束 |
| 掩码 | 子网掩码,可省略 |
| 租约时间 | 默认单位秒,支持 m(分)、h(时)、d(天)、w(周) |
static | 只分配静态绑定的地址 |
tag:NAME | 标记此范围用于条件分配 |
slaac | 同时启用 SLAAC |
4.3 DHCP 选项
4.3.1 常用 DHCP 选项
# /etc/dnsmasq.d/11-dhcp-options.conf
# === 网络基础 ===
dhcp-option=option:router,192.168.1.1 # 默认网关
dhcp-option=option:dns-server,192.168.1.1 # DNS 服务器
dhcp-option=option:domain-name,"home.lan" # 域名后缀
dhcp-option=option:netmask,255.255.255.0 # 子网掩码
# === 多 DNS 服务器 ===
dhcp-option=option:dns-server,192.168.1.1,8.8.8.8
# === 时间服务 ===
dhcp-option=option:ntp-server,192.168.1.1 # NTP 服务器
# === TFTP/PXE ===
dhcp-option=option:tftp-server,192.168.1.1 # TFTP 服务器
dhcp-option=option:bootfile-name,"pxelinux.0" # 启动文件
dhcp-option=66,"192.168.1.1" # TFTP 服务器(选项66)
# === WPAD(Web 代理自动发现)===
dhcp-option=252,"http://proxy.home.lan/wpad.dat"
# === 自定义选项(厂商自定义,选项 43)===
dhcp-option=43,"01:04:00:00:00:01"
4.3.2 DHCP 选项编号速查
| 选项号 | 名称 | 说明 |
|---|
| 1 | subnet-mask | 子网掩码 |
| 3 | router | 默认网关 |
| 6 | dns-server | DNS 服务器 |
| 12 | hostname | 主机名 |
| 15 | domain-name | 域名 |
| 42 | ntp-server | NTP 服务器 |
| 43 | vendor-encapsulated | 厂商自定义 |
| 44 | netbios-name-server | NetBIOS 名称服务 |
| 66 | tftp-server-name | TFTP 服务器 |
| 67 | bootfile-name | 启动文件名 |
| 119 | domain-search | DNS 搜索域 |
| 150 | tftp-server-address | TFTP 服务器地址 |
4.3.3 按客户端类型分配选项
# 为不同类型的设备分配不同的网关
# 使用 vendor class 匹配
# PC 设备
dhcp-vendorclass=set:pc,MSFT
dhcp-option=tag:pc,option:router,192.168.1.1
# VoIP 电话
dhcp-vendorclass=set:phone,Polycom
dhcp-option=tag:phone,option:router,192.168.1.1
dhcp-option=tag:phone,option:tftp-server,192.168.1.50
4.4 静态租约(MAC 地址绑定)
4.4.1 静态绑定配置
# /etc/dnsmasq.d/12-static-leases.conf
# 格式:dhcp-host=<MAC>,<IP>,<主机名>,<租约时间>
dhcp-host=aa:bb:cc:dd:ee:01,192.168.1.10,nas,24h
dhcp-host=aa:bb:cc:dd:ee:02,192.168.1.11,webserver,24h
dhcp-host=aa:bb:cc:dd:ee:03,192.168.1.12,dbserver,24h
dhcp-host=aa:bb:cc:dd:ee:04,192.168.1.20,printer,infinite
# 仅绑定 IP(不指定主机名)
dhcp-host=aa:bb:cc:dd:ee:05,192.168.1.50
# 仅绑定主机名(不限定 IP)
dhcp-host=aa:bb:cc:dd:ee:06,mydevice
# 通配 MAC 前缀(OUI 匹配)
dhcp-host=aa:bb:cc:*:,192.168.1.100,iot-device,1h
4.4.2 获取设备 MAC 地址
# 方法 1:从 ARP 表获取
arp -a | grep 192.168.1
# 方法 2:查看 Dnsmasq 租约文件
cat /var/lib/misc/dnsmasq.leases
# 输出格式:时间戳 MAC地址 IP地址 主机名 客户端ID
# 方法 3:扫描网络
sudo nmap -sn 192.168.1.0/24
# 方法 4:在路由器上抓包
sudo tcpdump -i eth1 -n port 67 or port 68 -c 10
4.4.3 限制只分配静态租约
# 只为已知设备(dhcp-host 定义的)分配地址
# 不响应未知设备的 DHCP 请求
dhcp-range=192.168.1.10,192.168.1.50,static
dhcp-authoritative
业务场景:企业网络中,只有登记过的设备才能获得 IP 地址,防止未授权设备接入。
4.5 多网段 DHCP
4.5.1 基于 VLAN 的多网段
# /etc/dnsmasq.d/13-multi-subnet.conf
# VLAN 10 - 办公网络
interface=eth1.10
dhcp-range=set:office,192.168.10.100,192.168.10.200,255.255.255.0,12h
dhcp-option=tag:office,option:router,192.168.10.1
dhcp-option=tag:office,option:dns-server,192.168.10.1
# VLAN 20 - 访客网络
interface=eth1.20
dhcp-range=set:guest,192.168.20.100,192.168.20.200,255.255.255.0,1h
dhcp-option=tag:guest,option:router,192.168.20.1
dhcp-option=tag:guest,option:dns-server,223.5.5.5
# VLAN 30 - IoT 设备
interface=eth1.30
dhcp-range=set:iot,192.168.30.100,192.168.30.250,255.255.255.0,168h
dhcp-option=tag:iot,option:router,192.168.30.1
4.5.2 基于 relay 的远程网段
当 DHCP 请求通过 relay 转发时,Dnsmasq 根据 giaddr(网关地址)自动识别网段:
# Dnsmasq 自动识别 relay 转发的请求
# 只需配置所有可能的地址池
dhcp-range=192.168.1.100,192.168.1.200,255.255.255.0,12h
dhcp-range=192.168.2.100,192.168.2.200,255.255.255.0,12h
dhcp-range=192.168.3.100,192.168.3.200,255.255.255.0,12h
# 设置 relay 回复地址
dhcp-relay=192.168.1.1,192.168.10.1
4.6 DHCPv6 配置
4.6.1 无状态 DHCPv6(SLAAC + DHCPv6)
# /etc/dnsmasq.d/14-dhcpv6.conf
# 启用 IPv6 路由器通告
enable-ra
# 无状态模式:客户端通过 SLAAC 获取 IPv6,DHCPv6 提供额外信息
dhcp-range=::,constructor:eth1,ra-stateless,ra-names
# 提供 DNS 信息
dhcp-option=option6:dns-server,[fd00::1]
# 有状态模式:DHCPv6 分配地址
dhcp-range=fd00::100,fd00::fff,slaac,64,12h
4.6.2 IPv6 路由器通告(RA)
# 手动配置 RA
enable-ra
ra-param=eth1,high,0,0
# ra-param 说明:
# ra-param=<接口>,<优先级>,<路由器生命周期>,<最大间隔>
# 优先级: high / medium / low
4.6.3 DHCPv6 选项
# DHCPv6 DNS 服务器
dhcp-option=option6:dns-server,[fd00::1],[fd00::2]
# DHCPv6 域名搜索
dhcp-option=option6:domain-search,home.lan,internal.lan
# DHCPv6 NTP 服务器
dhcp-option=option6:ntp-server,[fd00::1]
4.7 PXE 网络引导
4.7.1 基本 PXE 配置
# /etc/dnsmasq.d/15-pxe.conf
# 启用 TFTP
enable-tftp
tftp-root=/var/lib/tftpboot
# PXE 引导(BIOS 模式)
dhcp-boot=pxelinux.0,,192.168.1.1
# PXE 引导(UEFI 模式)
dhcp-match=set:efi-x86_64,option:client-arch,7
dhcp-match=set:efi-x86_64,option:client-arch,9
dhcp-boot=tag:efi-x86_64,grubx64.efi,,192.168.1.1
# BIOS 模式
dhcp-match=set:bios,option:client-arch,0
dhcp-boot=tag:bios,pxelinux.0,,192.168.1.1
4.7.2 PXE 架构识别
| 客户端架构值 | 类型 | 启动文件 |
|---|
| 0 | BIOS/legacy | pxelinux.0 |
| 6 | EFI IA32 | bootia32.efi |
| 7 | EFI x86-64 | grubx64.efi / shimx64.efi |
| 9 | EFI x86-64 (HTTP) | grubx64.efi |
| 11 | EFI ARM64 | grubaa64.efi |
# 完整的 PXE 引导策略
dhcp-match=set:bios,option:client-arch,0
dhcp-match=set:efi32,option:client-arch,6
dhcp-match=set:efi64,option:client-arch,7
dhcp-match=set:efi64,option:client-arch,9
dhcp-match=set:efiarm,option:client-arch,11
dhcp-boot=tag:bios,pxelinux.0,,192.168.1.1
dhcp-boot=tag:efi32,bootia32.efi,,192.168.1.1
dhcp-boot=tag:efi64,grubx64.efi,,192.168.1.1
dhcp-boot=tag:efiarm,grubaa64.efi,,192.168.1.1
4.8 租约管理
4.8.1 租约文件
# 租约文件路径(默认)
# /var/lib/misc/dnsmasq.leases
# 自定义路径
leasefile=/var/lib/dnsmasq/dnsmasq.leases
# 查看当前租约
cat /var/lib/misc/dnsmasq.leases
租约文件格式:
# <过期时间戳> <MAC地址> <IP地址> <主机名> <客户端ID>
1715404800 aa:bb:cc:dd:ee:01 192.168.1.100 mylaptop 01:aa:bb:cc:dd:ee:01
1715408400 aa:bb:cc:dd:ee:02 192.168.1.101 android-abc *
4.8.2 租约时间设置
# 不同场景的租约时间建议
dhcp-range=192.168.1.100,192.168.1.200,24h # 普通设备
dhcp-range=192.168.2.100,192.168.2.200,1h # 访客(短租约)
dhcp-host=aa:bb:cc:dd:ee:01,192.168.1.10,infinite # 服务器(永久)
# 租约时间参考
# 1h - 访客网络、临时设备
# 12h - 办公网络
# 24h - 家庭网络
# 168h - IoT 设备(一周)
# infinite - 固定设备、服务器
4.8.3 手动管理租约
# 删除特定租约(编辑租约文件后重载)
sudo vim /var/lib/misc/dnsmasq.leases
sudo systemctl reload dnsmasq
# 清除所有租约
sudo truncate -s 0 /var/lib/misc/dnsmasq.leases
sudo systemctl reload dnsmasq
# 在 Dnsmasq 运行时发送 SIGUSR2 输出租约信息
sudo kill -USR2 $(pidof dnsmasq)
sudo journalctl -u dnsmasq --since "10 sec ago"
4.9 DHCP 安全
4.9.1 防止 Rogue DHCP
# 标记为权威服务器(快速响应,拒绝无效请求)
dhcp-authoritative
# 快速提交模式(跳过 Offer 直接到 ACK)
# 适用于已知设备的快速重连
rapid-commit
# 只为已知 MAC 分配地址
dhcp-range=192.168.1.10,192.168.1.50,static
4.9.2 DHCP 请求过滤
# 忽略未知客户端
dhcp-ignore=tag:!known
# 不响应特定接口
except-interface=eth0
# 只在指定接口响应
interface=eth1
4.9.3 DHCP 限速
# 设置每秒最大 DHCP 请求(防 flood)
# Dnsmasq 没有内建限速,但可以通过 iptables 实现
# iptables -A INPUT -p udp --dport 67 -m limit --limit 10/s -j ACCEPT
# iptables -A INPUT -p udp --dport 67 -j DROP
4.10 完整 DHCP 配置示例
# /etc/dnsmasq.d/10-dhcp-full.conf
# === 接口 ===
interface=eth1
bind-interfaces
# === 办公网段 (VLAN 10) ===
dhcp-range=set:office,192.168.10.100,192.168.10.200,255.255.255.0,12h
dhcp-option=tag:office,option:router,192.168.10.1
dhcp-option=tag:office,option:dns-server,192.168.10.1,8.8.8.8
dhcp-option=tag:office,option:ntp-server,192.168.10.1
dhcp-option=tag:office,option:domain-name,"office.lan"
# === 访客网段 (VLAN 20) ===
dhcp-range=set:guest,192.168.20.100,192.168.20.200,255.255.255.0,1h
dhcp-option=tag:guest,option:router,192.168.20.1
dhcp-option=tag:guest,option:dns-server,223.5.5.5
# === IoT 网段 (VLAN 30) ===
dhcp-range=set:iot,192.168.30.100,192.168.30.250,255.255.255.0,168h
dhcp-option=tag:iot,option:router,192.168.30.1
# === 静态绑定 ===
dhcp-host=aa:bb:cc:dd:ee:01,192.168.10.10,nas,24h
dhcp-host=aa:bb:cc:dd:ee:02,192.168.10.11,webserver,infinite
dhcp-host=aa:bb:cc:dd:ee:03,192.168.10.20,printer,infinite
# === DHCP 设置 ===
dhcp-authoritative
enable-ra
dhcp-leasefile=/var/lib/misc/dnsmasq.leases
# === PXE 引导 ===
enable-tftp
tftp-root=/var/lib/tftpboot
dhcp-match=set:efi64,option:client-arch,7
dhcp-boot=tag:efi64,grubx64.efi,,192.168.10.1
dhcp-boot=pxelinux.0,,192.168.10.1
# === 日志 ===
log-dhcp
4.11 小结
| 功能 | 关键配置项 | 说明 |
|---|
| 地址池 | dhcp-range | 定义可分配的 IP 范围 |
| 静态绑定 | dhcp-host | MAC-IP 绑定 |
| DHCP 选项 | dhcp-option | 网关、DNS、NTP 等 |
| DHCPv6 | dhcp-range=...,slaac | IPv6 地址分配 |
| PXE | dhcp-boot | 网络引导 |
| 权威模式 | dhcp-authoritative | 快速响应,拒绝无效 |
4.12 扩展阅读