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.1
到192.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格式的配置文件过于反人类,看的眼睛疼
本博客所有包含标签(tag) # 随笔 的文章禁止转载!本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!