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

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 选项编号速查

选项号名称说明
1subnet-mask子网掩码
3router默认网关
6dns-serverDNS 服务器
12hostname主机名
15domain-name域名
42ntp-serverNTP 服务器
43vendor-encapsulated厂商自定义
44netbios-name-serverNetBIOS 名称服务
66tftp-server-nameTFTP 服务器
67bootfile-name启动文件名
119domain-searchDNS 搜索域
150tftp-server-addressTFTP 服务器地址

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 架构识别

客户端架构值类型启动文件
0BIOS/legacypxelinux.0
6EFI IA32bootia32.efi
7EFI x86-64grubx64.efi / shimx64.efi
9EFI x86-64 (HTTP)grubx64.efi
11EFI ARM64grubaa64.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-hostMAC-IP 绑定
DHCP 选项dhcp-option网关、DNS、NTP 等
DHCPv6dhcp-range=...,slaacIPv6 地址分配
PXEdhcp-boot网络引导
权威模式dhcp-authoritative快速响应,拒绝无效

4.12 扩展阅读