FreeBSD 上的高可用 DHCP 服务器
作者:𝚟𝚎𝚛𝚖𝚊𝚍𝚎𝚗
2018/08
今天我想分享在 FreeBSD 系统上搭建高可用 DHCP 服务器的方法,但在其他 UNIX 和类 UNIX 系统上也应该一样简单。我将在这里使用最显而易见的选择——Internet Systems Consortium 的实现——ISC DHCP server——它也可以在 FreeBSD Ports 和软件包中获得。

因为一些时间的推进,ISC 正在开发一款新的 DHCP 服务器——Kea——他们打算最终在大多数服务器实现中用它替代 ISC DHCP。他们也建议新的实现者考虑使用 Kea 而不是 ISC DHCP,仅在 Kea 无法满足需求时才实现 ISC DHCP。例如,Kea 当前不包含客户端和中继。也许我以后会对这篇文章进行更新或者单独再写一篇文章。
同时 Kea 在一个月前刚拥有了高可用模式,因此如果我更早写这篇文章,那么这样的设置在 Kea 上将不可行。这也显示了 Kea 实现是多么年轻,所以目前我会坚持使用 ISC DHCP server,并在后续“观察”Kea 的发展。
架构
下面是我们的 ISC DHCP 设置的 POOR MAN’S ASCII 架构图 图。
每个 DHCP 服务器节点的设置都非常简单。它的 FreeBSD 11.2-RELEASE 安装在 4 GB 的 GPT 分区上,/ 文件系统是 UFS,如下所示只使用了 666 MB。
对于少量客户端来说 128 MB 的内存已经足够。仍然有 32 MB 的空闲内存,以及 32 MB 的 Inactive 和 Buffered 内存可以被交换出去。更不用说每个 getty 进程大约占用 2 MB 内存,而你只需要其中 1 个,而不是 8 个。换言之,即使只有 64 MB 的内存,你也能跑起来。
DHCP 节点 DHCPs1 和 DHCPs2 的 /etc/rc.conf 文件是相同的(除了主机名和地址不同)。
``sh root@DHCPs1:/ # cat /etc/rc.conf hostname=DHCPs1 ifconfig_em0="inet 10.0.10.251/24 up" sshd_enable=YES sendmail_enable=NONE clear_tmp_enable=YES syslogd_flags="-ss" dumpdev=NO
现在让我们安装软件包 isc-dhcp44-server。
现在更新 pkg(8) 仓库数据,并在 DHCPs2 节点上安装 isc-dhcp44-server。
配置使用单一网络段 10.0.10.0/24,为客户端分配最后一段在 10-250 的地址。参数 split 128 会将负载在 DHCP 服务器节点之间平均分配。由于这只是示例,我们将使用 1.1.1.1 和 9.9.9.9 作为 DNS 服务器,以及 domain.com 作为域名。需要说明的是,仅在 primary 节点(在我们的例子中为 DHCPs1)上设置参数 split 128。正如 man dhcpd.conf 页面所建议的,我们将 “为两个服务器使用相同的主配置文件,并有一个单独的文件包含对等声明以及主文件。”,这样做 “有助于避免配置不一致。”
……secondary 节点
/usr/local/etc/dhcpd.conf.SHARED 文件在两个节点上是相同的。
现在让我们在两个节点上启动 DHCP 服务器。
……在 secondary 节点上也是一样。
现在,由于高可用 DHCP 服务器的两个节点都已启动,让我们在 DHCP 客户端——在我们的示例中为 DHCPc——上尝试获取 DHCP 租约。
我们可以看到 DHCP 客户端 DHCPc 获得了 10.0.10.131 的地址。
当然,我们可以在 /usr/local/etc/dhcpd.conf.SHARED 配置文件中使用 host 选项为它设置固定地址,如下所示。
所需的“额外配置”如下。
需要在两个节点的 /usr/local/etc/dhcpd.conf.SHARED 配置文件中都添加,新的共享配置文件如下所示。
现在将 /usr/local/etc/dhcpd.conf.SHARED 文件复制到第二个节点。
让我们再次尝试从同一 DHCP 客户端获取地址。
现在将 /usr/local/etc/dhcpd.conf.SHARED 文件复制到第二个节点。
让我们再次尝试从同一 DHCP 客户端获取地址。
现在我们已经获得了固定地址 10.0.10.9。
你现在可以在 /etc/rc.conf 文件中尝试修改以下值:
dhcpd_flagsdhcpd_ifacesdhcpd_withumaskdhcpd_chuser_enabledhcpd_withuserdhcpd_withgroupdhcpd_chroot_enabledhcpd_devfs_enabledhcpd_rootdirdhcpd_includedirnclude
……以及 man dhcpd.conf 页面上所有其他可能的选项 🙂
最后更新于
这有帮助吗?