在 RHEL8 上設定 DHCP

在 RHEL8 上設定 DHCP

我正在使用 rhel 8 設定防火牆/網關路由器。第一個 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

相關內容