我一直在 Raspberry Pi 4B 最新 Buster 版本上运行 ISC DHCP 服务器,该服务器具有静态 IP,可充当家庭网络上的网关、DHCP、DNS 和 IDS/IPS 服务器。按照在线文档,经过短暂的努力,我能够安装、设置并启动并运行它。
在此过程中,我还发现了 ISC DHCP 服务器中的一个错误,如果存在现有的 DHCPD,该错误会导致它无法启动(这里并相当雄辩地描述这里) 文件位于 /run/dhcpd.pid 中。每次我测试它时,我都必须删除 /run/dhcpd.pid 文件,然后它才能正常工作。
昨晚我经历了最糟糕的时刻,由于短暂的断电,整个网络基础设施必须重新启动(仅路由器、AP 和 Pi)。由于路由器上的 DHCP 被禁用,其他机器没有有效的 IP,在短时间内,直到我能够在某些设备上设置静态 IP,我的网络基本上是无用的。由于 Pi 是无头操作的,我不得不谷歌搜索并找到一种通过 LAN 将 Pi 直接连接到我的计算机的方法,然后使用 SSH 进行弥补。
我做的第一件事是尝试查看为什么静态 IP 设置不起作用。是什么导致 Pi 无法通过网络访问?除了 ISC DHCP 服务器无法启动,这可能导致 Pi 无法通过网络识别,我找不到一个明显的答案?考虑到我在网络接口文件中设置了静态 IP,这对我来说仍然没有多大意义。
除非我将 DHCP 控制移回路由器,否则该设备将无法通过网络访问。
然后我开始尝试在启动时运行一个脚本,该脚本首先终止 DHCP 进程,删除 /run/dhcpd.pid 文件,然后重新启动 dhcpd 服务。
shell 脚本和服务文件如下所示:
/usr/bin/dhcpdrelease.sh
#!/bin/sh
set -e
set echo off
#sudo killall dhcpcd
#sudo rm -rf /run/dhcpd.pid
#sudo service isc-dhcp-server restart &
chmod u+x /usr/bin/dhcpdrelease.sh
/etc/systemd/system/dhcprelease.service
[Unit]
Description=DHCPD Release
After=network.target
RequiresMountsFor=/usr/bin/
[Service]
ExecStart=/usr/bin/dhcpdrelease.sh
[Install]
WantedBy=multi-user.target
sudo systemctl start dhcprelease
sudo systemctl enable dhcprelease
这又没有效果。 Pi 再次无法通过网络访问,促使我再次通过 LAN、SSH 连接它并注释掉 shell 脚本。
我对 Unix 最多只是个业余爱好者,不知道 DHCP 守护进程在 Unix/Pi OS 中如何运行,也不了解在启动时运行此类脚本的最佳方法是什么。
我只是想在重启时自动执行以下操作:
- 设备具有有效 IP 并且可通过网络访问/ping 通
- 删除 dhcp.pid 文件
- 重新启动ISC DHCP服务
如果发生电源循环,我不可能让整个网络瘫痪。
我希望路由器只处理 wifi 和互联网连接接口,同时将大部分功能委托给 Pi。现在,我已将 DHCP 控制权恢复给路由器,同时仅将 DNS 委托给 Pi。网络接口文件已恢复为从路由器获取动态 IP。IDS 在此框架内运行,因此它不一定是最有效的。我希望 Pi 成为网络的网关。
我强烈怀疑 DHCP 服务是罪魁祸首,但我承认我对如何解决这个问题几乎一无所知。
答案1
实际上不能将其称为“答案”,因为该错误尚未解决并且阻止人们获得“不受管理”的体验。
我刚刚安装了 Pi-Hole 并将 DNS 和 DHCP 服务器合二为一。
然而,昨天在我反复试验的过程中,网络问题发生了有趣的转变。我注意到,当接口文件中强制执行静态 IP 代码时,接口会出现严重问题。我意识到这一点的原因是,我有一个外部 Wi-Fi 适配器连接到 USB 端口,但它没有显示任何开机迹象。然后,我继续注释掉网络接口文件中的静态 IP 强制执行,只使用 /etc/dhcpd.conf。这似乎很基本,甚至很明显,但网络接口文件有明确的指示来处理后者中的静态 IP。我设置了它,重新启动,然后就好了!
“休斯顿,这里是宁静号基地。Pi 已经降落。”