我正在使用 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