Kea 是 Internet Systems Consortium (ISC) 开发的下一代 DHCP 服务器,用纯 C++ 实现,支持 DHCPv4 和 DHCPv6 协议。它取代了已于 2022 年 EOL 的旧 ISC DHCP,专为现代网络设计:模块化架构、动态钩子扩展、REST API 在线重配置、高性能多线程处理,以及高可用 (HA) failover 机制。本文聚焦其核心协议处理架构、钩子库扩展、高可用参数配置,以及无状态 / 有状态操作的工程化落地要点,帮助你快速部署企业级 DHCP 服务。
模块化 C++ 架构:分离关注点,提升可维护性
Kea 的设计哲学是 “按需加载”,避免单体巨无霸。核心组件包括独立守护进程:
- kea-dhcp4:处理 DHCPv4 Discover/Offer/Request/Ack 等协议交互。
- kea-dhcp6:对应 DHCPv6 Solicit/Advertise/Request/Reply,支持 IA_NA/IA_TA/TEMP_ADDR。
- kea-dhcp-ddns:动态 DNS 更新模块,与 BIND 等集成。
- kea-ctrl-agent:RESTful API 网关,支持在线配置变更,如
kea-dhcp4 remote-set-config。
这些进程通过 JSON 配置文件 /etc/kea/kea-dhcp4.conf 统一管理,示例基础子网配置:
{
"Dhcp4": {
"interfaces-config": { "interfaces": ["eth0"] },
"valid-lifetime": 4000,
"renew-timer": 1000,
"rebind-timer": 2000,
"subnet4": [{
"subnet": "192.168.1.0/24",
"pools": [{ "pool": "192.168.1.100 - 192.168.1.200" }],
"option-data": [
{ "name": "routers", "data": "192.168.1.1" },
{ "name": "domain-name-servers", "data": "8.8.8.8" }
]
}]
}
}
C++ 核心库 libdhcpsrv 处理协议栈:解析 UDP 报文(端口 67/68)、租约分配逻辑、选项封装(Option 3 路由器、6 DNS)。相比单线程旧版,Kea 多线程 IO(默认 threads=4,可设 auto),支持短租期高并发场景,如数据中心 PD(前缀委派)分配。
验证配置:kea-dhcp4 -t /etc/kea/kea-dhcp4.conf,启动:systemctl start isc-kea-dhcp4-server。
钩子库:C++ 扩展点,实现自定义逻辑
钩子(Hooks)是 Kea 的杀手锏,允许动态加载 .so 库,在协议生命周期 12 个点注入代码:pkt4_receive(收包)、lease4_add(新增租约)等。无需重启服务器。
内置钩子示例:
- libdhcp_ha.so:HA 状态机。
- libdhcp_mysql.so:MySQL 后端。
- libdhcp_lease_cmds.so:REST 租约管理。
加载方式,在 Global.hooks-libraries:
{
"hooks-libraries": [{
"library": "/usr/lib/x86_64-linux-gnu/kea/hooks/libdhcp_ha.so",
"parameters": { "high-availability": { "this-server-name": "server1" } }
}]
}
自定义钩子:继承 ServerHook,实现 preSend 等回调,用 CMake 编译。风险:钩子崩溃不影响核心,但需单元测试。
高可用 Failover:负载均衡与热备参数优化
Kea HA 通过钩子实现 RFC 3074 兼容 failover,无需共享存储。支持三种模式:
| 模式 | 描述 | 适用场景 | 关键参数 |
|---|---|---|---|
| load-balancing | 双活共享负载,同步租约更新 | 高吞吐 | scope-id=0, max-response-delay=100ms |
| hot-standby | 主备切换,备机监控心跳 | 零丢包 | state-on-acquisition=hot-standby |
| passive-backup | 主备份,备份仅存副本 | 容灾备份 | no failover 服务中断 |
配置示例(热备,主服务器):
"high-availability": {
"mode": "hot-standby",
"peers": [{
"name": "server2",
"url": "http://192.168.1.2:8000/",
"role": "secondary",
"auto-failover": true,
"heartbeat-interval": 1000,
"dialout-interval": 10000,
"max-response-delay": 10000,
"max-heartbeat-delay": 20000
}],
"states": ["startup", "wait", "load-balancing", "hot-standby", "partner-down"]
}
监控要点:
- 时钟同步:NTP 确保偏差 <30s,超 60s 进入 terminate 状态。
- 心跳:REST
ha-heartbeat,备机检测 partner-down 后接管。 - Stork 仪表盘:部署 agent,监控 HA 状态、租约同步延迟。
- 回滚:
ha-disable-forwarding命令,手动 sync 数据库。
负载测试:perfdhcp -4 -u 0.0.0.0 -s 192.168.1.1 -n 100000 -l 10 -r TXRX,目标 >10k req/s。
无状态 / 有状态高性能操作参数
- 无状态 (stateless):仅选项(如 DNS),配置
"pd-pool"空,relay 模式。 - 有状态 (stateful):完整租约,DB 后端配置:
"lease-database": {
"type": "mysql",
"name": "kea_leases",
"user": "kea",
"password": "kea123",
"host": "localhost",
"port": 3306,
"connect-timeout": 5,
"pool-size": 10
}
初始化:kea-admin db-init mysql -u root -p -n kea_leases。
性能调优清单:
- 多线程:
"multi-threading": { "enable-multi-threading": true, "thread-pool-size": 32 }。 - 租约清理:
kea-lfc -d /var/lib/kea定时任务。 - 缓存:host-cache-size=10000,shared-networks 分流。
- 监控:Prometheus exporter hooks,阈值:延迟 > 50ms 告警,丢包 > 1%。
- 规模:单机 50k 客户端,HA 双机 100k+,DB 读写分离。
部署清单:
- 安装:
apt install isc-kea-dhcp4-server isc-kea-admin stork-agent。 - DB:MySQL 8.0+,索引 leases4.ip_address。
- 防火墙:UDP 67/68,TCP 8000 (API)。
- 测试:Wireshark 捕包验证 DORA 流程。
- 回滚:备机 memfile 模式,
keactrl stop。
Kea 的 C++ 模块化设计,确保了协议鲁棒性与扩展性,HA 参数如 heartbeat-interval=1s、max-response-delay=10s 是生产阈值起点,根据负载微调(参考 perf 测试)。
资料来源:
- ISC 官网:Kea 采用模块化组件设计,通过钩子模块扩展。[1]
- HN 讨论:强调 HA 钩子的高可用策略。[2]
[1] https://www.isc.org/kea/
[2] https://news.ycombinator.com/item?id=419xxxx (Kea DHCP HN post)