KEA DHCP安装配置及使用

1 前言

KEAD DHCP LOGO

KEA 是由Internet Systems Consortium开发的开源DHCPv4 / DHCPv6服务器。 Kea是一款高性能,可扩展的DHCP服务器引擎,可以轻松修改和扩展钩子库。KEA具有以下特性[1]:

  • 开源,使用MPL 2.0许可证
  • 直接地址分配支持v4和v6,或DHCPv6 前缀授权
  • 动态地址分配和主机地址保留
  • 更新DNS记录作为续租或过期的动态DNS
  • MAC地址追踪,包括 v4和v6
  • 支持自定义扩展钩子库

2 安装KEA

KEA的安装可以通过apt的方式直接安装,但是如果需要数据库支持或者需要使用钩子扩展则需要自行编译,本文以自编译的方式介绍如何安装配置KEA。

1) 首先下载源码:

1
root@ubuntu:~# wget https://ftp.isc.org/isc/kea/1.3.0/kea-1.3.0.tar.gz

2) 安装必要的编译软件包

1
root@ubuntu:~# apt install -y gcc build-essential make libmysql++-dev openssl libssl-dev libboost-system-dev liblog4cplus-dev liblog4cplus-1.1-9 libmysqlclient-dev

3) 配置编译

指明需要使用mysql,若需要修改默认安装路径需要单独指定--prefix--exec-prefix两个参数,前者是编译生成的二进制文件拷贝路径,后者是软件运行时依赖库的查找路径,可以通过./configure -h查看。

1
2
3
root@ubuntu:~# tar xf kea-1.3.0.tar.gz
root@ubuntu:~# cd kea-1.3.0
root@ubuntu:~/kea-1.3.0# ./configure --with-dhcp-mysql=/usr/bin/mysql_config

4) 编译

配置完编译依旧是编译二连makemake install

1
2
root@ubuntu:~# make -j8
root@ubuntu:~# make install

编译完成后默认安装到/usr/local/kea目录下,相应的配置文件放置在/usr/local/kea/etc/kea路径下。

3 配置KEA

kea的配置文件是json格式,配置完kea可以先使用json在线解析查看配置是否正确,需要注意的是必须去除配置中的注释才能正确解析。详细的kea配置需要查看官网的介绍[2],同时配置文件kea-dhcp6.conf.sample示例中也有详细的解释。

如下所示为配置文件参数的含义[3]:

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
{
"Dhcp6": {
// 向服务器租用地址时间,以秒为单位
"valid-lifetime": 4000,
// 可选,续借时间,如果没有指定将根据RFC 2131进行设置
"renew-timer": 1000,
// 可选,重新绑定时间,如果没有指定这将根据RFC 2131进行设置
"rebind-timer": 2000,

"interfaces-config": {
// 1. 指定服务器要监听哪张网卡的DHCP消息,可以指定多张网卡。
// 2.允许使用*,如:"interfaces": ["*"],表示监听所有网卡
"interfaces": ["eth1/2001:db8:1::2"],
// 默认raw,表示处理所有报文
// udp:处理udp报文
"dhcp-socket-type": "udp",
// 只有dhcp-socket-type为udp才生效
// 默认是same-as-inbound:从哪里来滚哪里去
// use-routing:从哪里来,滚哪里去,得问下kernel的路由表(routing table) "outbound-interface": "use-routing"
},
// 控制平面接收
"control-socket": {
"socket-type": "unix",
"socket-name": "/tmp/kea-dhcp6-ctrl.sock"
},
// 租期数据使用库类型指定,类型不同,对应的配置也有所不同,这里以MySQL为例
"lease-database": {
// 支持memfile", "mysql", "postgresql", "cql"四个选项
"type": "mysql",
// 数据库所在的主机ip
"host": "localhost",
// 数据库端口号
"port": 3306,
// 数据库名称
"name": "keadhcp",
// 数据库用户名
"user": "root",
// 数据库密码
"password": "root",
// 当type为memfile这里会涉及到一个比较重要的配置,这里不说明,详情请看(http://kea.isc.org/wiki/LFCDesign)
// 1. 指定服务器将执行租约文件清理(LFC)的时间间隔(以秒为单位
// 2. 默认3600,0的时候表示禁用lease file cleanup(LFC)
// "lfc-interval": 1800
},

// 1.下面的配置可选。主机预定数据使用的数据库类型。和租期配置类同,不在赘述
// 2. 当然你也可以不使用数据库,在数据量不大的情况下推荐使用配置文件。随着数据量的增大可以改用数据库
// 3. 这个配置允许数据库和配置文件共存使用
// 4. 同时使用时,先检查配置文件,在检查数据库的数据
// "hosts-database": {
// "type": "mysql",
// "host": "localhost",
// "port": 3306,
// "name": "kea",
// "user": "kea",
// "password": "kea"
// },

"subnet6": [{
// 子网标识符,没有指定或者为0,则自动分配
// 建议手动分配,如果有多个子网,某个子网被删除,id可能被自动重新分配,导致租期数据混乱
"id":"1024"
// 网段 这里需要注意下网段必须和服务器所在网段一样,不然接收不到客户的请求
"subnet": "2001:db8:1::/64",
// 可分配地址范围
"pools": [{"pool": "2001:db8:1::1000 - 2001:db8:1::2000"}]
}]
},
// 若不配置logging字段则日志记录默认输出在终端
"Logging":
{
"loggers": [
{
"name": "kea-dhcp6",
"output_options": [
{
// 指定日志输出路径
"output": "/var/log/dhcp/dhcp6.log",
// 当为true时每次更新日志文件都会同步到磁盘
"flush": true,
// 单个日志文件最大容量
"maxsize": 1048576,
// 同时存储日志文件最大个数
"maxver": 8
}
],
// 日志输出等级
"severity": "INFO",
// 当日志输出等级为debug时,可选择debug输出等级0-100,0最低
"debuglevel": 0
}
]
}
}

配置完成后重启kea服务即可,重启哪些服务可以在/usr/local/kea/etc/kea/keactrl.conf文件指定

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
root@ubuntu:/usr/local/kea/etc/kea$ cat keactrl.conf
# This is a configuration file for keactrl script which controls
# the startup, shutdown, reconfiguration and gathering the status
# of the Kea's processes.

# prefix holds the location where the Kea is installed.
prefix=/usr/local/kea

# Location of Kea configuration files.
kea_dhcp4_config_file=${prefix}/etc/kea/kea-dhcp4.conf
kea_dhcp6_config_file=${prefix}/etc/kea/kea-dhcp6.conf
kea_dhcp_ddns_config_file=${prefix}/etc/kea/kea-dhcp-ddns.conf
kea_ctrl_agent_config_file=${prefix}/etc/kea/kea-ctrl-agent.conf

# Location of Kea binaries.
exec_prefix=/usr/local/kea
dhcp4_srv=${exec_prefix}/sbin/kea-dhcp4
dhcp6_srv=${exec_prefix}/sbin/kea-dhcp6
dhcp_ddns_srv=${exec_prefix}/sbin/kea-dhcp-ddns
ctrl_agent_srv=${exec_prefix}/sbin/kea-ctrl-agent

# Start DHCPv4 server?
dhcp4=yes

# Start DHCPv6 server?
dhcp6=yes

# Start DHCP DDNS server?
dhcp_ddns=no

# Start Control Agent?
ctrl_agent=yes

# Be verbose?
kea_verbose=no

重启DHCP服务

1
root@ubuntu:~# keactrl start

首次运行时可能出现kea库找不到的错误,执行ldconfig命令即可。

若需要指定重启v6或v4则需要添加相应参数

1
root@ubuntu:~# keactrl start -s dhcpv6

关于如何配置KEA的钩子模式可以查看:传送门

3.1 性能测试

使用kea自带的perfdhcp性能测试工具,可以进行dhcp客户端模拟的测试

  1. 查看每秒能处理多少个discover(v4)或者solicit(v6)消息 ;
  2. 查看每秒能处理处理4-way packet exchanges(v4 - DORA, v6 - SARR)(即一个完成的请求动态ip的过程),即LPS(Lease per Second,每秒分配租约数)。
1
root@ubuntu:~# perfdhcp -l eth1 -6 -b mac=00:01:02:03:04:05 -R 999999 -r 100000  -p 30

使用上述命令请求v6地址,部分参数解释如下,官方文档可以查看perfdhcp man手册

参数 含义
-l 指定申请IP接口
-4/-6 指定申请的IP类型
-R 模拟客户端数量,实际指的是请求DHCP的用户池,perfdhcp会从该池内挑选用户,默认为1
-r 期望的DHCP请求速率,即 LPS速率
-p 测试持续时间
-b 模拟用户mac地址起始,也可以使用uuid替代

【Note】

1)理论分配的用户数量为期望速率X持续时间,超过这个数目的请求实际为租约的更新操作。

2)官方给出KEA测试结果:传送门

摘录如下所示

V4 Performance with and without insert trigger:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Memfile with persistence set to false (as a baseline):
Running: perfdhcp -4 -r 10000 -R 9999999 -p 20 178.0.0.1
Rate: 6689.37 4-way exchanges/second, expected rate: 10000

MySQL without trigger installed:
Running: perfdhcp -4 -r 200 -R 9999999 -p 20 178.0.0.1
Rate: 189.079 4-way exchanges/second, expected rate: 200

MySQL with trigger installed:
Running: perfdhcp -4 -r 200 -R 9999999 -p 20 178.0.0.1
Rate: 188.752 4-way exchanges/second, expected rate: 200

Postgresql without trigger installed:
Running: perfdhcp -4 -r 600 -R 9999999 -p 20 178.0.0.1
Rate: 551.868 4-way exchanges/second, expected rate: 600

Postgresql with trigger installed:
Running: perfdhcp -4 -r 600 -R 9999999 -p 20 178.0.0.1
Rate: 556.182 4-way exchanges/second, expected rate: 600

V6 Performance with and without insert triggers:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
MEMFILE persistence = false:
Running: perfdhcp -6 -r 10000 -R 9999999 -p 20 -l enp0s10
Rate: 6890.85 4-way exchanges/second, expected rate: 10000

MySQL without trigger installed
Running: perfdhcp -6 -r 200 -R 9999999 -p 20 -l enp0s10
Rate: 188.239 4-way exchanges/second, expected rate: 200

MySQL with trigger installed
Running: perfdhcp -6 -r 200 -R 9999999 -p 20 -l enp0s10
Rate: 188.813 4-way exchanges/second, expected rate: 200

Postgresql without trigger installed
Running: perfdhcp -6 -r 400 -R 9999999 -p 20 -l enp0s10
Rate: 361.503 4-way exchanges/second, expected rate: 400

Postgresql with trigger installed
Running: perfdhcp -6 -r 400 -R 9999999 -p 20 -l enp0s10
Rate: 361.421 4-way exchanges/second, expected rate: 400

3)另有其他讨论称kea在memryfile 内存模式下能够达到8000-10000的性能,基本上数据库模式下LPS在1000左右,传送门。mysql模式下调优参见邮件讨论mysql 调优

4 其他

4.1 KEA 高可用

目前KEA 1.3版本尚不支持HA高可用模式,官方介绍将在1.4版本支持,当前状态下若想使用HA可以通过数据库后端HA的方式来实现,也可以通过keepalived来实现,见传送门,结合上一篇的keepalived可以很好的实现,原文中需要三台服务器,笔者在实验中使用了两台服务器也可以测试通过,由于keepalived不支持监听UDP端口,因此主要的实现方式是添加keepalived健康检查脚本定时检查kea进程。

4.2 KEA配合phpIPAM

当前phpIPAM并没有直接的插件配合KEA,因此需要自己实现,实现方式有两种:1)直接采用数据库同步的方式,将kea的数据导入phpIPAM中;2)采用phpIPAM的restful接口,同时phpIPAM也给出了API客户端[4]。遇到的困难是KEA的子网标记ID和phIPAM中子网号ID同步转换出错进而导致hosts同步错误,尤其是当KEA的子网号在重启会重新分配(未指定子网号时)或修改子网但未更新子网号时造成的租期数据混乱。

【参考链接】

1)KEA官网

2)KEA官方文档

3)KEA配置介绍

4)phpIPAM API客户端

-------------本文结束感谢您的阅读-------------

版权声明

Louie's Blog by louie long is licensed under a Creative Commons BY-NC-ND 4.0 International License.
Louie Long创作并维护的Louie's Blog博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证
本文首发于Louie's Blog 博客( http://ylong.net.cn ),版权所有,侵权必究。
转载请注明作者和链接地址http://ylong.net.cn, 如对文章内容有疑问请联系邮箱( longyu805@163.com )。