在 RHEL8 上設置 DHCP
我正在使用 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
自動為您執行等效的 。