kea DHCP 折腾小记

别问,问就是在摆烂

写在前面

因为isc-dhcp项目目前已不再更新,转向开发kea DHCP了,从官方的介绍中我们可以了解到kea DHCP有以下优点:

  • 灵活性:Kea DHCP 提供了广泛的配置选项和灵活的扩展机制,可以根据不同的网络需求进行高度定制。它支持动态更新配置、灵活的租约管理、多种地址分配策略以及丰富的选项定义。

  • 性能和可扩展性:Kea DHCP 通过优化的设计和实现,具有出色的性能和可扩展性。它采用了多线程和异步处理,以处理大规模网络环境下的高并发请求,并能有效地管理大量的租约信息。

  • 强大的管理和监控功能:Kea DHCP 提供了丰富的管理和监控功能,可通过命令行工具或REST API进行配置、状态查询和统计数据收集。管理员可以轻松地监视服务器状态、租约信息、日志记录,并进行动态配置和管理。

  • 安全性:Kea DHCP 提供了安全的通信和认证机制,以保护服务器和客户端之间的通信安全。它支持TLS加密和身份验证,可以防止未经授权的访问和数据泄露。

  • 兼容性:Kea DHCP 兼容标准的DHCPv4和DHCPv6协议,并支持常见的客户端操作系统和网络设备。它还支持动态DNS(DDNS)更新、网站指导模式(Captive Portal)、PXE引导、客户端分类和挂钩脚本等功能。

注意,这是官方说法,我也信了,但最后为什么选择不迁移了呢?且听我娓娓道来

环境介绍

这次测试使用的环境是在KVM虚拟化的环境中进行的,使用172.18.146.0/24作为测试网段

DHCP服务器将架设在一台运行UbuntuServer 22.04.2 LTS的虚拟机上,仅启用DHCPv4(v6用不上),此外是直接用root用户操作的(我懒得打sudo)

设备 IP 操作系统
DHCP Server 172.18.146.53 UbuntuServer 22.04.2 LTS
User DHCPv4 Windows 10 Pro

安装软件

安装kea可以直接使用apt进行安装,也可以编译安装,这里我们两者都会介绍到。

软件源安装

这种方法非常简单,一条命令即可完成安装

apt update && apt install kea

上述命令将会自动安装kea在软件源中的所有软件(但不是所有其项目的所有软件,后面会说)

以下是源中所有可选安装的组件

kea                   kea-ctrl-agent        kea-dhcp4-server
kea-admin             kea-dev               kea-dhcp6-server
kea-common            kea-dhcp-ddns-server  kea-doc

在本次实验中,使用下面的命令安装部分必要的组件即可

apt update && apt install kea-ctrl-agent kea-dhcp4-server kea-admin

安装好后配置文件均位于/etc/kea文件夹中

为什么不推荐源安装

源中的软件包缺失了很多kea所推荐或是新增的功能,例如源安装的kea并不能正常的与数据库进行交互(似乎是源预编译没有使用相关选项进行编译),同时缺失了hooks的支持,在版本上,也比官方的落后一些(目前ubuntu源的kea组件是2.0.2版本的)

源码安装

源码安装的好处是可以用上kea的所有功能,缺点是需要忍受很长的编译时间。
本次实验环境所编译的包为构建用于和mysql(也可以是mariadb)交互的。

安装编译所需包

首先根据官方文档所要求的安装编译所需的软件

apt install git curl libboost-all-dev openssl git g++ libssl-dev liblog4cplus-dev liblog4cplus-2.0.5 make cmake -y

由于需要在编译时加上--with-mysql的选项,所以需要额外安装以下的包

apt install mysql-client libmysqlclient-dev

拉取源码

直接从官方仓库拉取即可

git clone https://gitlab.isc.org/isc-projects/kea.git

编译并安装软件

进入项目文件夹
cd kea/
生成配置文件
autoreconf -i
生成构建环境

由于我们需要使用mysql数据库,所以此处需要加上–with-mysql`的选项

./configure --with-mysql
编译软件

通常情况下会花费很多时间,可以先出门吃个饭

make
安装
make install
更新链接缓存
cd /usr/local/lib
ldconfig

依照上述方法编译后配置文件夹默认位置为软件安装位置下的etc/kea子文件夹中

正式使用及配置文件解析

完成上一节操作后就可以正式开始使用kea了,但是!这里就要说一说kea不好的地方了,kea的配置文件,是json的格式,这意味着,会有一大堆的括号,极不利于阅读

简易使用教学

kea可以通过keactrl来启用各项服务(其实systemctl也可以用,如果是从源码编译的systemctl命令不能开箱即用),例如可以使用以下命令查看服务状态

root@testserver:/home/app/kea# keactrl status
DHCPv4 server: active
DHCPv6 server: active
DHCP DDNS: active
Control Agent: active
Kea DHCPv4 configuration file: /etc/kea/kea-dhcp4.conf
Kea DHCPv6 configuration file: /etc/kea/kea-dhcp6.conf
Kea DHCP DDNS configuration file: /etc/kea/kea-dhcp-ddns.conf
Kea Control Agent configuration file: /etc/kea/kea-ctrl-agent.conf
keactrl configuration file: /etc/kea/keactrl.conf

可以看到各项服务都启动了

在不添加选项的情况下,keactrl start将会根据配置文件夹下的keactrl.conf配置文件的内容来启动相关服务,例如我们不想启动DHCPv6的服务的话就可以将配置文件中的

# Start DHCPv6 server?
dhcp6=yes

改成

# Start DHCPv6 server?
dhcp6=no

配置文件解析

此处我们以DHCPv4来说(别的我也不想用),下面是一个配置文件的节选(不用仔细看,我会将其拆分的更仔细,仅注意我所添加的分割线即可)

"Dhcp4": {
    "interfaces-config": {
        "interfaces": [ ]
    },

// ################################ 此处分割 #######################################

    "control-socket": {
        "socket-type": "unix",
        "socket-name": "/tmp/kea4-ctrl-socket"
    },

// ################################ 此处分割 #######################################

    "lease-database": {
        // Memfile is the simplest and easiest backend to use. It's an in-memory
        // C++ database that stores its state in CSV file.
        "type": "memfile",
        "lfc-interval": 3600
    },
    "hosts-database": {
        "type": "mysql",
        "name": "kea",
        "user": "kea",
        "password": "kea",
        "host": "localhost",
        "port": 3306
    },

// ################################ 此处分割 #######################################

    "expired-leases-processing": {
        "reclaim-timer-wait-time": 10,
        "flush-reclaimed-timer-wait-time": 25,
        "hold-reclaimed-time": 3600,
        "max-reclaim-leases": 100,
        "max-reclaim-time": 250,
        "unwarned-reclaim-cycles": 5
    },
    "renew-timer": 900,
    "rebind-timer": 1800,
    "valid-lifetime": 3600,
    "option-data": [
        {
            "name": "domain-name-servers",
            "data": "192.0.2.1, 192.0.2.2"
        },
        {
            "code": 15,
            "data": "example.org"
        },
        {
            "name": "domain-search",
            "data": "mydomain.example.com, example.com"
        },
        {
            "name": "boot-file-name",
            "data": "EST5EDT4\\,M3.2.0/02:00\\,M11.1.0/02:00"
        },
        {
            "name": "default-ip-ttl",
            "data": "0xf0"
        }
    ],

// ################################ 此处分割 #######################################

    "client-classes": [
        {
            "name": "voip",
            "test": "substring(option[60].hex,0,6) == 'Aastra'",
            "next-server": "192.0.2.254",
            "server-hostname": "hal9000",
            "boot-file-name": "/dev/null"
        }
    ],

// ################################ 此处分割 #######################################

    // "hooks-libraries": [
    //   {
    //       // Forensic Logging library generates forensic type of audit trail
    //       // of all devices serviced by Kea, including their identifiers
    //       // (like MAC address), their location in the network, times
    //       // when they were active etc.
    //       "library": "/usr/lib/x86_64-linux-gnu/kea/hooks/libdhcp_legal_log.so",
    //       "parameters": {
    //           "path": "/var/lib/kea",
    //           "base-name": "kea-forensic4"
    //       }
    //   },
    //   {
    //       // Flexible identifier (flex-id). Kea software provides a way to
    //       // handle host reservations that include addresses, prefixes,
    //       // options, client classes and other features. The reservation can
    //       // be based on hardware address, DUID, circuit-id or client-id in
    //       // DHCPv4 and using hardware address or DUID in DHCPv6. However,
    //       // there are sometimes scenario where the reservation is more
    //       // complex, e.g. uses other options that mentioned above, uses part
    //       // of specific options or perhaps even a combination of several
    //       // options and fields to uniquely identify a client. Those scenarios
    //       // are addressed by the Flexible Identifiers hook application.
    //       "library": "/usr/lib/x86_64-linux-gnu/kea/hooks/libdhcp_flex_id.so",
    //       "parameters": {
    //           "identifier-expression": "relay4[2].hex"
    //       }
    //   }
    // ],

// ################################ 此处分割 #######################################

    "subnet4": [
        {
            "subnet": "192.0.2.0/24",
            "pools": [ { "pool": "192.0.2.1 - 192.0.2.200" } ],
            "option-data": [
                {
                    "name": "routers",
                    "data": "192.0.2.1"
                }
            ],
            "reservations": [
                {
                    "hw-address": "1a:1b:1c:1d:1e:1f",
                    "ip-address": "192.0.2.201"
                }
            ]
        }
    ],

// ################################ 此处分割 #######################################

    "loggers": [
    {
        "name": "kea-dhcp4",
        "output_options": [
            {
                // Specifies the output file. There are several special values
                // supported:
                // - stdout (prints on standard output)
                // - stderr (prints on standard error)
                // - syslog (logs to syslog)
                // - syslog:name (logs to syslog using specified name)
                // Any other value is considered a name of the file
                "output": "/var/log/kea-dhcp4.log"

                // Shorter log pattern suitable for use with systemd,
                // avoids redundant information
                // "pattern": "%-5p %m\n"

                // This governs whether the log output is flushed to disk after
                // every write.
                // "flush": false,

                // This specifies the maximum size of the file before it is
                // rotated.
                // "maxsize": 1048576,

                // This specifies the maximum number of rotated files to keep.
                // "maxver": 8
            }
        ],
        "severity": "INFO",
        "debuglevel": 0
    }
  ]
}
}

监听网卡配置

配置文件中的interfaces-config配置用于告诉软件应该监听什么端口,例如我们的网口为eth0,就应该将此项配置的"interfaces": [ ]改为如下

"interfaces": [ 'eth0' ]

数据库配置

数据库配置有两种,一种为以本地文件为数据库的形式,即下面这段

"lease-database": {
    // Memfile is the simplest and easiest backend to use. It's an in-memory
    // C++ database that stores its state in CSV file.
    "type": "memfile",
    "lfc-interval": 3600
},

还有一种是真数据库,即下面这段

"hosts-database": {
    "type": "mysql",
    "name": "kea",
    "user": "kea",
    "password": "kea",
    "host": "localhost",
    "port": 3306
},

可以根据自己的实际情况选择使用哪一种

全局的DHCP配置

"expired-leases-processing": {
    .......
},
"renew-timer": 900,
"rebind-timer": 1800,
"valid-lifetime": 3600,
"option-data": [
    .......
],

上面这段为全局下的dhcp配置

  • renew-timer表示客户端在租约过期前需要发起续租(Renew)请求的时间间隔。在默认配置中,客户端应在租约过期前的几秒内发送续租请求。如果客户端成功续租,则租约会得到更新,继续使用同一IP地址
  • rebind-timer表示在租约过期后,如果客户端无法与原DHCP服务器通信,客户端可以向任意可用的DHCP服务器发送绑定(Rebind)请求的时间间隔。在默认配置中,客户端可以在租约过期后的几秒内发送绑定请求,以尝试绑定到任意可用的DHCP服务器并获取新的租约
  • valid-lifetime表示租约的有效期,即客户端可以使用分配的IP地址的时间长度。在默认配置中,客户端获得的租约将在几秒后过期,除非在此期间成功进行了续租。

option-data中所填入的为RFC2132定义的DHCP的各类功能相关的配置,基本格式如下

{
    "code": 15,
    "data": "example.org"
},

上面这段代码的含义是定义了DHCP服务器的域名(Domain Name,DHCP代码为15),下面是部分的DHCP代码表提供参考

DHCP代码 含义
1 子网掩码(Subnet Mask)
2 时间偏移(Time Offset)
3 默认网关(Router)
4 时间服务器(Time Server)
5 名称服务器(Name Server)
6 DNS服务器(Domain Name Server)
7 日志服务器(Log Server)
8 Cookie服务器(Cookie Server)
9 LPR服务器(Line Printer Server)
12 主机名(Host Name)
15 域名(Domain Name)
17 根路径(Root Path)
18 扩展路径(Extensions Path)
19 IP层最大数据长度(IP Layer Maximum Datagram Size)
23 默认IP生存时间(Default IP Time-to-Live)
28 广播地址(Broadcast Address)
33 静态路由(Static Route)
43 供应商特定选项(Vendor Specific Information)
50 请求的IP地址(Requested IP Address)
51 租约时间(IP Address Lease Time)
53 DHCP消息类型(DHCP Message Type)
54 服务器标识(Server Identifier)
55 参数请求列表(Parameter Request List)
56 DHCP消息(Message)
57 最大DHCP消息大小(Maximum DHCP Message Size)
58 客户端唯一标识(Client Identifier)
59 客户端状态(Client System)
60 厂商类标识(Vendor class identifier)
61 客户机硬件地址(Client Identifier)
66 TFTP服务器名称(TFTP Server Name)
67 引导文件名称(Bootfile Name)
69 炸弹选项(DHCP Relay Agent Information)
150 TFTP服务器地址(TFTP Server Address)

需要注意,这是标准的DHCP协议的定义,虽然kea的软件是遵照标准所设计的,但在实际填写各选项时,请务必还是看一眼kea的官方文档,确定配置应如何编写

kea扩展

在配置文件中为hooks-libraries段落,此为kea的高级应用,不说了(我懒)

地址池配置

地址池配置为subnet4段落,下面是定义一个网段的配置

{
            "subnet": "192.0.2.0/24",
            "pools": [ { "pool": "192.0.2.1 - 192.0.2.200" } ],
            "option-data": [
                {
                    "name": "routers",
                    "data": "192.0.2.1"
                }
            ],
            "reservations": [
                {
                    "hw-address": "1a:1b:1c:1d:1e:1f",
                    "ip-address": "192.0.2.201"
                }
            ]
        }
  • subnet: 定义一个子网,此处为 192.0.2.0/24,表示一个以 192.0.2.0 作为网络地址的CIDR形式的子网,子网掩码为255.255.255.0
  • pools: 定义了一个地址池,其中包含一个范围。此处的地址池为 “192.0.2.1 - 192.0.2.200”,表示可用于分配的IP地址范围从192.0.2.1192.0.2.200
  • option-data: 定义了DHCP选项的数据。在这里,指定了一个名为 “routers” 的选项,其值为 192.0.2.1。这表示在DHCP租约期间,客户端将收到一个名为 “routers” 的选项,并且该选项的值将设置为 “192.0.2.1”,指示客户端使用该IP地址作为默认网关。这个定义仅适用于此地址池,且其优先级高于全局的option-data。
  • reservations: 定义了一个预留(reservation),用于为特定的客户端设备分配特定的IP地址。在此配置中,指定了一个硬件地址(hw-address)为 1a:1b:1c:1d:1e:1f 的设备,将被分配IP地址 192.0.2.201

为什么最后又不选择使用kea DHCP?

  • kea DHCP的模块化确实为部署提供了很多的选择,但这个模块化并不人性,并不是通过添加或删除可执行文件就可以增加或减少其功能的,而是需要进行编译。

  • stork为kea官方所推荐使用的监控平台,但功能过于鸡肋。

  • 数据库方面没有很成熟的方式进行操作,交互上需要通过hook,并且如果要方便管理员使用则需要二次开发

  • json格式的配置文件过于反人类,看的眼睛疼


kea DHCP 折腾小记
https://blog.xianyu.one/2023/06/01/Linux/tutorial/kea-dhcp/
作者
咸鱼
发布于
2023年6月1日
许可协议