Hotdry.
systems-engineering

Kea 模块化 DHCPv4/v6 服务器:钩子扩展与高可用部署

ISC Kea 的模块化 C++ 架构,支持 Lua/Python/REST 钩子扩展、高性能租约管理和多种 HA failover 模式,提供工程化参数与监控要点。

Kea 是由 ISC 开发的现代开源 DHCPv4/v6 服务器,采用模块化 C++ 设计,完全取代已 EOL 的 ISC DHCP。它通过分离的守护进程(如 kea-dhcp4、kea-dhcp6 和 kea-dhcp-ddns)实现高内聚低耦合,仅加载所需组件,避免资源浪费。这种架构支持动态加载钩子模块,实现自定义扩展,同时结合多线程和数据库后端,确保高吞吐租约管理,并在高可用场景下无缝 failover。

模块化架构与钩子扩展框架

Kea 的核心在于其模块化组件设计。DHCPv4 和 DHCPv6 服务独立运行,DDNS 更新模块可选加载。这种分离允许按需部署,例如仅需 IPv4 支持时,只启动 kea-dhcp4。证据显示,Kea 使用 JSON 配置,支持在线 REST API 重载,无需重启服务,远优于 ISC DHCP 的静态配置。

扩展性通过钩子(Hooks)框架实现,支持 Lua、Python 和 REST 接口。Lua 钩子(libdhcp_lua.so)允许在 DHCP 生命周期(如 pkt4_receive、lease4_add)注入脚本,实现轻量自定义逻辑,例如基于 MAC 地址的客户端分类或外部 API 调用。Python 钩子类似,提供更丰富的库生态。REST 钩子则通过 kea-ctrl-agent(默认端口 8080)暴露 API,如 POST /commands 以 lease4-add 更新租约。

可落地参数清单

  • 加载钩子:在 kea.conf 的 "Dhcp4.hooks-libraries" 中指定路径,如 [{"library": "/usr/lib/x86_64-linux-gnu/kea/hooks/libdhcp_lua.so"}]
  • Lua 脚本示例(pkt4_send 前调用):
    function lease4_renew(ctx)
      if ctx.subnet[1].id == 1 then
        ctx.response.options:add(ctx.server.tag, "custom-option")
      end
    end
    
  • Python 钩子阈值:脚本执行超时设为 100ms,避免阻塞主线程。
  • REST API 认证:启用 TLS,证书路径 "cert-file": "/etc/kea/ca.pem",用户 / 密码 via Basic Auth。

钩子是同步执行的,适用于低延迟场景;高负载下,优先异步库如 runscript(外部 shell)。

高吞吐租约管理

Kea 的多线程 IO 引擎支持数万 QPS,结合 MySQL/PostgreSQL 后端实现共享租约数据库。高吞吐依赖短租约(<1min)和连接池优化。数据库后端分离数据与执行,支持多服务器共享 leases,避免 JSON 文件锁竞争。

证据:官方基准显示,优化后 Kea 处理 10k+ 短租约 / 秒,远超单线程 ISC DHCP。Stork 仪表板监控池利用率、CPU / 内存。

部署参数

  • 数据库配置
    "lease-database": {
      "type": "mysql",
      "host": "db.example.com",
      "name": "kea_leases",
      "user": "kea",
      "password": "secret",
      "pool-size": 20,  // 连接池,推荐 CPU 核数 * 2
      "max-row-size": 1000  // 批量插入阈值
    }
    
  • 性能调优
    参数 推荐值 说明
    threads CPU 核数 IO 线程池
    renew-timer 1h 租约续期间隔
    cache-size 1M 内存缓存 leases
    MySQL innodb_buffer_pool 70% RAM DB 优化

初始化 DB:kea-admin db-init mysql -u kea -p kea_leases -H localhost

风险:DB 延迟 >50ms 导致分配失败,回滚至 memfile 后端。

HA Failover 配置

Kea HA 钩子支持三种模式:负载均衡(load-balancing)、热备(hot-standby)和被动备份(passive-backup)。通过 REST heartbeat(默认 10s)同步状态和租约更新,实现自动 failover。

模式参数

  • 热备(推荐中小规模)
    "high-availability": [{
      "this-server-name": "primary",
      "mode": "hot-standby",
      "peers": [{
        "name": "secondary",
        "url": "http://secondary:8080/",
        "role": "secondary",
        "auto-failover": true,
        "dialout-interval": 10  // heartbeat 秒数
      }],
      "heartbeat-timeout": 30  // 超时切换
    }]
    
  • 负载均衡:需客户端分类分割池,如 test 类 50% 地址,避免冲突。
  • 时钟同步:NTP 必需,偏差 >30s 警告,>60s 终止 HA。

Failover 流程

  1. Primary 分配租约,REST POST lease4-add 到 secondary。
  2. Heartbeat 失败 > timeout,切换 partner-down 状态,接管流量。
  3. 恢复:DB 同步(primary 优先)。

监控要点

  • Stork Agent:部署于各节点,中央 dashboard 视池利用、HA 状态、uptime。
  • 日志:severity: DEBUG,监控 HA_STATE 变化。
  • 回滚:单机模式 "high-availability": []

风险与限

  • HA 仅活动服务器间同步,备份服务器延迟可能增 5-10ms。
  • 网络分区:配置 scope-check 防脑裂。

总结与最佳实践

Kea 的模块化设计结合钩子、DB 和 HA,提供生产级 DHCP 服务。起步:包管理安装(如 apt install kea),示例 conf 测试。规模化:DB + Stork + HA。迁移 ISC DHCP:用 Kea Migration Assistant。

资料来源

查看归档