在 RHEL8 上设置 DHCP

在 RHEL8 上设置 DHCP

我正在使用 rhel 8 设置防火墙/网关路由器。我有一台带有两个网卡的服务器,一个面向公共,是 dhcp 客户端,第二个网卡将面向内部。第一个 NIC 是公共区域,第二个 NIC 是内部区域。我想让面向内部的 NIC 成为内部客户端的 DHCP 服务器。

我需要阻止我的 DHCP 服务器接收公共区域上的 DHCP 请求。

问题:您能否将 dhcp 配置为仅适用于特定 NIC 的服务器,或者是否使用防火墙规则来管理它以阻止来自公共区域的所有 DHCP?设置这样的多功能网关时,什么是好的做法?

答案1

在 RHEL 8 中,在命令行上dhcpd.service使用该$DHCPDARGS变量ExecStart=

# /usr/lib/systemd/system/dhcpd.service
[Unit]
Description=DHCPv4 Server Daemon
Documentation=man:dhcpd(8) man:dhcpd.conf(5)
Wants=network-online.target
After=network-online.target
After=time-sync.target

[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/dhcpd
ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid $DHCPDARGS
StandardError=null

[Install]
WantedBy=multi-user.target

/etc/sysconfig/dhcpd但是定义此类变量的环境文件有一个警告,告诉您不要再使用该文件:

cat /etc/sysconfig/dhcpd 
# WARNING: This file is NOT used anymore.

# If you are here to restrict what interfaces should dhcpd listen on,
# be aware that dhcpd listens *only* on interfaces for which it finds subnet
# declaration in dhcpd.conf. It means that explicitly enumerating interfaces
# also on command line should not be required in most cases.

# If you still insist on adding some command line options,
# copy dhcpd.service from /lib/systemd/system to /etc/systemd/system and modify
# it there.
# https://fedoraproject.org/wiki/Systemd#How_do_I_customize_a_unit_file.2F_add_a_custom_unit_file.3F

# example:
# $ cp /usr/lib/systemd/system/dhcpd.service /etc/systemd/system/
# $ vi /etc/systemd/system/dhcpd.service
# $ ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid <your_interface_name(s)>
# $ systemctl --system daemon-reload
# $ systemctl restart dhcpd.service

显然,RHEL 8 的 ISC dhcpd 已被修补,可以根据其配置文件是否包含接口的子网声明来选择要侦听的接口。如果特定接口没有子网声明,则它不应响应该接口。

由于 DHCP 协议在 IPv4 上的工作方式,dhcpd需要使用原始套接字(以便能够接收源地址为 0.0.0.0 且目标地址为 255.255.255.255 的广播数据包,并且还可以不受限制地发送到 255.255.255.255通过正常的 IPv4 路由),因此无论如何它都需要更仔细地处理其传入数据包。

由于dhcpd使用原始套接字,因此也不受iptables防火墙的影响。

如果您仍然希望在命令行上添加接口名称,您可以cp /lib/systemd/system/dhcpd.service /etc/systemd/system/然后修改 中的版本/etc/systemd/system,或者仅用于systemctl edit dhcpd.service创建覆盖文件。当然,您需要记住服务文件可能有多ExecStart=行,因此为了覆盖现有行而不是仅添加另一行,您将运行systemctl edit dhcpd.service并输入三行:

[Service]
ExecStart=
ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid <your_interface_name(s)>

第一个空ExecStart=行告诉 systemd 您想要覆盖ExecStart服务文件中的现有定义,而不是添加第二个定义。

如果使用该cp /lib/systemd/system/dhcpd.service /etc/systemd/system/策略,记得systemctl daemon-reload修改/etc/systemd/system/dhcpd.service文件后运行。

如果您使用,它将自动为您systemctl edit dhcpd.service运行相当于。systemctl daemon-reload

答案2

这取决于您使用的特定 dhcp 守护进程,但是是的,可以配置 dhcp 守护进程以根据 dhcp/bootp 请求来自哪个接口给出不同的答案或者运行 dhcpd 的多个实例,每个实例配置为仅侦听一个接口。

就您而言,听起来您只想告诉您的 dhcpd 仅在您的专用 LAN 接口上侦听。如果您使用的是 ISC dhcpd,只需添加您希望其侦听 dhcpd 命令行的接口的名称即可。

例如,在我的系统上,我希望 dhcpd 仅侦听我的无线 ( wifi0) 和内部网络(br0- 我使用桥接接口,因为它方便运行虚拟机)接口,因此我将其运行为:

/usr/sbin/dhcpd -4 -q -cf /etc/dhcp/dhcpd.conf br0 wlan0

相关内容