Rhel

在 RHEL8 上設置 DHCP

  • November 1, 2021

我正在使用 rhel 8 設置防火牆/網關路由器。我有一個帶有兩個 NICS 的伺服器,一個面向公眾,它是一個 dhcp 客戶端,第二個 NIC 將面向內部。第一個 NIC 是公共區域,第二個 NIC 是內部區域。我想讓面向內部的 NIC 成為內部客戶端的 DHCP 伺服器。

我需要阻止我的 DHCP 伺服器在公共區域接收 DHCP 請求。

問題:您能否將 dhcp 配置為僅用於特定 NIC 的伺服器,或者您是否使用防火牆規則來管理它以阻止來自公共區域的所有 DHCP?設置這樣的多功能網關時有什麼好的做法?

在 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自動為您執行等效的 。

引用自:https://unix.stackexchange.com/questions/675495