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