Debian 12 部署 DHCP 与 DNS Server

1. 文档目的

在 Debian 12 上部署内网 DHCP 和 DNS 服务,实现:

  • DHCPv4:自动分配 IPv4 地址。
  • DHCPv6:自动分配 IPv6 地址。
  • DNS:接收和处理内网客户端的 DNS 查询。
  • 内网域名解析:支持手动配置 A、AAAA 等记录。
  • 服务独立运行,不依赖公网 DNS 或外部网络。

本方案使用:

组件 软件 作用
DHCPv4 Kea DHCPv4 IPv4 地址分配
DHCPv6 Kea DHCPv6 IPv6 地址分配
DNS Unbound DNS 查询处理及内网记录解析
IPv6 RA radvd 通告 IPv6 网络前缀及 DHCPv6 管理标志

注意:Kea DHCP 不提供 DNS 查询服务,因此需要额外部署 DNS Server。


2. 环境信息

以下参数以当前服务器为例,部署到其他环境时需要调整。

项目 配置
操作系统 Debian 12
网卡 enp6s18
IPv4 地址 192.168.1.1/24
IPv4 网段 192.168.1.0/24
IPv6 地址 fd42:1234:5678:1::1/64
IPv6 网段 fd42:1234:5678:1::/64
IPv4 DNS 192.168.1.1
IPv6 DNS fd42:1234:5678:1::1
IPv4 租约文件 /var/lib/kea/kea-leases4.csv
IPv6 租约文件 /var/lib/kea/kea-leases6.csv
DNS 内网域名示例 lab.home.arpa

本方案假设客户端和服务器位于同一个二层网络。跨网段 DHCP 需要额外配置 DHCP Relay。

3. 配置服务器网络

先确认网卡和 IP 地址:

1
2
3
4
ip -br addr
ip -6 addr show dev enp6s18
ip route
ip -6 route

确认服务器具有以下地址:

1
2
192.168.1.1/24
fd42:1234:5678:1::1/64

如果地址已配置并持久生效,无需重复配置。

检查网卡名称:

1
ip link show

后续配置必须使用实际网卡名,不能直接假设所有机器都叫 enp6s18。

4. 安装软件

4.1 安装 Kea、Unbound 和 radvd

如果服务器能够访问配置好的 Debian 软件源:

1
2
apt update
apt install kea-dhcp4-server kea-dhcp6-server unbound radvd dnsutils tcpdump

如果服务器完全离线,需要提前准备相应 Debian 12 软件包及其依赖,或使用内网 Debian 软件源。

4.2 检查软件版本和服务

1
2
3
4
5
6
7
kea-dhcp4 -V
kea-dhcp6 -V
unbound -V

systemctl status kea-dhcp4-server --no-pager
systemctl status kea-dhcp6-server --no-pager
systemctl status unbound --no-pager

配置完成前,服务可能尚未正常启动。


5. 配置 DHCPv4

配置文件:

1
/etc/kea/kea-dhcp4.conf

5.1 示例配置

以下示例分配 192.168.1.100 至 192.168.1.200 的地址,并向客户端下发 DNS 服务器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
{
"Dhcp4": {
"interfaces-config": {
"interfaces": ["enp6s18"]
},

"lease-database": {
"type": "memfile",
"persist": true,
"name": "/var/lib/kea/kea-leases4.csv"
},

"valid-lifetime": 86400,
"renew-timer": 21600,
"rebind-timer": 43200,

"subnet4": [
{
"id": 1,
"subnet": "192.168.1.0/24",

"pools": [
{
"pool": "192.168.1.100 - 192.168.1.200"
}
],

"option-data": [
{
"name": "domain-name-servers",
"data": "192.168.1.1"
},
{
"name": "domain-name",
"data": "lab.home.arpa"
}
]
}
]
}
}

说明:

  • interfaces:指定 DHCPv4 服务监听的网卡。
  • lease-database:配置租约持久化方式。
  • valid-lifetime:租约有效期,单位为秒。
  • renew-timer:建议客户端续租的时间。
  • rebind-timer:客户端向任意可用 DHCP 服务器重新绑定的时间。
  • domain-name-servers:DHCP Option 6,下发 DNS 服务器地址。
  • domain-name:DHCP Option 15,下发默认域名。

以上地址池只是示例。部署前必须确认池内地址没有被静态设备、BMC 或其他 DHCP 服务器占用。

如果已有配置文件,建议只修改对应字段,不要直接覆盖原有配置,以免丢失现有设置或其他选项。

5.2 验证并重启

1
kea-dhcp4 -t /etc/kea/kea-dhcp4.conf

只有配置检查通过后才重启:

1
2
3
systemctl restart kea-dhcp4-server
systemctl enable kea-dhcp4-server
systemctl status kea-dhcp4-server --no-pager

查看日志:

1
journalctl -u kea-dhcp4-server -n 100 --no-pager

抓取 DHCPv4 流量:

1
tcpdump -ni enp6s18 -nn -vv 'udp port 67 or udp port 68'

正常的地址获取流程通常包括 Discover、Offer、Request、ACK。


6. 配置 DHCPv6

配置文件:

1
/etc/kea/kea-dhcp6.conf

6.1 示例配置

以下配置分配 ULA IPv6 地址,并下发 IPv6 DNS 服务器地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
{
"Dhcp6": {
"interfaces-config": {
"interfaces": ["enp6s18"]
},

"lease-database": {
"type": "memfile",
"persist": true,
"name": "/var/lib/kea/kea-leases6.csv"
},

"preferred-lifetime": 2592000,
"valid-lifetime": 2592000,
"renew-timer": 604800,
"rebind-timer": 1209600,

"subnet6": [
{
"id": 1,
"subnet": "fd42:1234:5678:1::/64",

"pools": [
{
"pool": "fd42:1234:5678:1::100 - fd42:1234:5678:1::ffff"
}
],

"option-data": [
{
"name": "dns-servers",
"data": "fd42:1234:5678:1::1"
},
{
"name": "domain-search",
"data": "lab.home.arpa"
}
]
}
]
}
}

说明:

  • dns-servers:DHCPv6 Option 23,用于下发 DNS 服务器地址。
  • domain-search:DHCPv6 搜索域选项。
  • IPv6 地址池必须属于配置的 IPv6 子网。
  • 以上计时器是示例值,应结合客户端行为和实际需求调整。

6.2 验证并重启

1
kea-dhcp6 -t /etc/kea/kea-dhcp6.conf

通过后执行:

1
2
3
systemctl restart kea-dhcp6-server
systemctl enable kea-dhcp6-server
systemctl status kea-dhcp6-server --no-pager

查看日志:

1
journalctl -u kea-dhcp6-server -n 100 --no-pager

抓取 DHCPv6 流量:

1
2
tcpdump -ni enp6s18 -nn -vv \
'ip6 and (udp port 546 or udp port 547)'

正常 DHCPv6 地址获取通常包括 Solicit、Advertise、Request、Reply;具体流程可能因 Rapid Commit 等配置而不同。


7. 配置 IPv6 Router Advertisement

DHCPv6 地址分配依赖客户端的 IPv6 配置行为。对于需要通过 DHCPv6 获取地址的客户端,通常需要通过 Router Advertisement(RA)设置 Managed Flag。

安装并配置 radvd 后,编辑:

1
/etc/radvd.conf

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
interface enp6s18
{
AdvSendAdvert on;
AdvManagedFlag on;
AdvOtherConfigFlag off;
AdvDefaultLifetime 0;

prefix fd42:1234:5678:1::/64
{
AdvOnLink on;
AdvAutonomous off;
};
};

说明:

  • AdvManagedFlag on:提示客户端使用 DHCPv6 获取受管理的地址。
  • AdvAutonomous off:不通过该前缀执行 SLAAC 自主地址配置。
  • AdvDefaultLifetime 0:不通过这条 RA 宣告本机为 IPv6 默认路由器。

如果该网络需要 IPv6 默认网关,应另行设计和配置路由,不要直接沿用 AdvDefaultLifetime 0。

启动服务:

1
2
3
systemctl enable --now radvd
systemctl status radvd --no-pager
journalctl -u radvd -n 50 --no-pager

注意:DHCPv6 本身不提供默认网关。IPv6 默认路由通常由 RA 通告。


8. 配置 Unbound DNS

8.1 设计原则

Unbound 负责监听 DNS 的 UDP/TCP 53 端口并处理 DNS 查询。

在纯内网环境中:

  • 可以解析配置在本机的内网记录。
  • 可以回答已有的有效缓存记录。
  • 没有公网连接时,不能保证解析未配置的公网域名。
  • DNS 查询收到响应不代表域名解析成功,必须检查 DNS 返回码及答案内容。

8.2 配置文件

创建:

1
/etc/unbound/unbound.conf.d/lan.conf

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server:
interface: 127.0.0.1
interface: 192.168.1.1
interface: ::1
interface: fd42:1234:5678:1::1

access-control: 127.0.0.0/8 allow
access-control: 192.168.1.0/24 allow
access-control: ::1 allow
access-control: fd42:1234:5678:1::/64 allow

do-ip4: yes
do-ip6: yes
do-udp: yes
do-tcp: yes

local-zone: "lab.home.arpa." static

local-data: "dns.lab.home.arpa. 3600 IN A 192.168.1.1"
local-data: "dns.lab.home.arpa. 3600 IN AAAA fd42:1234:5678:1::1"

local-data: "server1.lab.home.arpa. 3600 IN A 192.168.1.10"
local-data: "server1.lab.home.arpa. 3600 IN AAAA fd42:1234:5678:1::10"

请根据实际环境修改内网记录,尤其是 192.168.1.10 和 fd42:1234:5678:1::10,不要将示例地址误认为真实设备地址。

这里使用 lab.home.arpa 作为内部域名。home.arpa 专门用于家庭网络环境;在企业实验室环境中,也可以使用由组织控制的内部子域。

local-zone: ... static 表示该区域由本机静态记录负责。对于这个区域中未定义的记录,Unbound 会根据该区域的配置返回本地结果,而不是转发到公网 DNS。

8.3 检查配置并启动

1
unbound-checkconf

如果检查通过:

1
2
3
systemctl enable --now unbound
systemctl restart unbound
systemctl status unbound --no-pager

确认监听端口:

1
ss -lnutp | grep ':53'

应检查 UDP 53 和 TCP 53 是否监听在预期的内网地址上。


9. DNS 功能验证

9.1 查询 IPv4 记录

在 DNS 服务器上执行:

1
dig @192.168.1.1 server1.lab.home.arpa A

预期结果:

1
2
3
4
status: NOERROR
ANSWER: 1

server1.lab.home.arpa. 3600 IN A 192.168.1.10

9.2 查询 IPv6 记录

1
dig @192.168.1.1 server1.lab.home.arpa AAAA

或者直接通过 IPv6 DNS 地址查询:

1
dig @fd42:1234:5678:1::1 server1.lab.home.arpa AAAA

9.3 验证 DNS 服务器能否处理请求

1
dig @192.168.1.1 server1.lab.home.arpa A +time=2 +tries=1

需要重点检查:

  • SERVER:是否为预期的 DNS 地址。
  • status:成功解析通常返回 NOERROR。
  • ANSWER SECTION:是否返回预期记录。

如果查询 example.com 返回 SERVFAIL,在没有公网连接或上游 DNS 的情况下,这是可能出现的结果。它不能单独证明 Unbound 故障。

9.4 抓取 DNS 流量

1
2
tcpdump -ni enp6s18 -nn -vv \
'port 53 and (host 192.168.1.1 or host fd42:1234:5678:1::1)'

抓包可以验证 DNS 请求和响应是否经过网卡,但最终仍应以 dig 的查询结果判断解析功能是否成功。


10. 防火墙与端口

如果服务器启用了防火墙,需要允许来自内网的以下流量。

服务 协议与端口 用途
DHCPv4 UDP 67 DHCP 服务器
DHCPv6 UDP 547 DHCPv6 服务器
DNS UDP 53 常规 DNS 查询
DNS TCP 53 TCP DNS 查询及较大响应
IPv6 RA ICMPv6 IPv6 网络配置通告

客户端 DHCP 使用的源端口通常为 UDP 68(IPv4)和 UDP 546(IPv6)。防火墙应按实际规则允许相应请求及响应。

RA 使用 ICMPv6,不是 UDP 端口。

DNS 应限制为内网访问,不要在没有访问控制的情况下将递归 DNS 开放给不可信网络。


11. 租约文件与 LFC 维护

Kea 使用 memfile 时,租约通常保存在:

1
2
/var/lib/kea/kea-leases4.csv
/var/lib/kea/kea-leases6.csv

检查文件:

1
ls -lah /var/lib/kea/*leases*

查看 IPv4 租约:

1
cat /var/lib/kea/kea-leases4.csv

查看 IPv6 租约:

1
cat /var/lib/kea/kea-leases6.csv

11.1 LFC 文件清理

Kea 的 Lease File Cleanup(LFC)会清理、合并和轮转 memfile 租约文件。过程中可能出现 .1、.2、.output、.completed 等辅助文件。

例如:

1
2
3
kea-leases4.csv
kea-leases4.csv.1
kea-leases4.csv.2

这些文件名应结合 LFC 日志和实际版本的文件轮转行为判断,不能单凭扩展名断定哪份文件就是当前数据库。

查看日志:

1
journalctl -u kea-dhcp4-server --since "1 hour ago" --no-pager

关注:

  • LFC_START
  • LFC_READ_STATS
  • LFC_WRITE_STATS
  • LFC_ROTATING
  • LFC_TERMINATE

如果日志显示 errors: 0,并且清理程序正常结束,说明本次 LFC 没有报告读写错误,但这本身并不能保证服务当前所有租约状态都正确。

不要在 Kea 运行期间手动删除、移动或重命名租约文件。 如果主文件只有表头、租约却在轮转文件中,应先结合完整日志、服务状态及客户端实际租约验证,再决定是否需要进一步处理。


12. 常用故障排查

12.1 DHCPv4 客户端无法获取地址

检查服务:

1
2
systemctl status kea-dhcp4-server --no-pager -l
journalctl -u kea-dhcp4-server -n 100 --no-pager

检查配置:

1
kea-dhcp4 -t /etc/kea/kea-dhcp4.conf

抓包:

1
tcpdump -ni enp6s18 -nn -vv 'udp port 67 or udp port 68'

12.2 DHCPv6 客户端无法获取地址

检查服务:

1
2
systemctl status kea-dhcp6-server --no-pager -l
journalctl -u kea-dhcp6-server -n 100 --no-pager

检查配置:

1
kea-dhcp6 -t /etc/kea/kea-dhcp6.conf

抓包:

1
2
tcpdump -ni enp6s18 -nn -vv \
'ip6 and (udp port 546 or udp port 547)'

同时确认 radvd 正常运行,以及客户端是否收到了带 Managed Flag 的 RA。

12.3 DNS 返回 SERVFAIL

检查:

1
2
3
4
systemctl status unbound --no-pager -l
unbound-checkconf
journalctl -u unbound -n 100 --no-pager
ss -lnutp | grep ':53'

使用已配置的内网记录验证:

1
dig @192.168.1.1 server1.lab.home.arpa A

如果内网记录正常,但公网域名失败,在完全隔离的网络中属于预期情况。

12.4 其他注意事项

  • 如果服务器与客户端不在同一子网,需检查 DHCP Relay 和路由。
  • DHCPv6 不负责分配 IPv6 默认网关。
  • DHCPv4 与 DHCPv6 租约数据库相互独立。
  • DHCP 地址池不能与静态地址或其他 DHCP 服务器的地址池冲突。
  • 变更配置前应先备份,使用配置检查命令验证后再重启服务。
  • 如果存在多个 DHCP 服务器,必须确认它们的地址池、网段和职责,避免重复分配地址。

13. 部署验收清单

  • 服务器 IPv4/IPv6 地址正确且持久生效。
  • Kea DHCPv4 配置检查通过,服务运行正常。
  • 客户端能通过 DHCPv4 获取地址、租约及 DNS 配置。
  • Kea DHCPv6 配置检查通过,服务运行正常。
  • radvd 正常发送 IPv6 RA。
  • 客户端能通过 DHCPv6 获取地址和 DNS 配置。
  • Unbound 配置检查通过,UDP/TCP 53 端口监听正常。
  • 内网 A 记录查询返回 NOERROR 和正确地址。
  • 内网 AAAA 记录查询返回 NOERROR 和正确地址。
  • 防火墙仅允许预期内网访问 DHCP、DNS 服务。
  • 服务日志无持续性错误。
  • 租约文件清理与轮转过程无未解决的错误。

14. 最终架构

部署完成后,服务器提供三项核心功能:

  1. Kea DHCPv4:为客户端分配 IPv4 地址。
  2. Kea DHCPv6 + radvd:为客户端提供 IPv6 地址分配及必要的 IPv6 网络通告。
  3. Unbound DNS:接收内网 DNS 查询并解析配置好的内网记录。

该方案可以在不接入公网的条件下运行。对于未配置的公网域名,服务器不会因为部署了 DHCP 或 DNS 就自动获得解析能力。