Linux,dhclient:如何确定我的 DHCP 配置是否有效(无需网络中断)

Linux,dhclient:如何确定我的 DHCP 配置是否有效(无需网络中断)

我使用的 Linux 系统采用的是“传统”网络设置,也就是说,没有像 NetworkManager 那样运行的全功能配置守护进程。大多数配置都是由 dhclient 完成的。

我需要检测必须重新运行 dhclient 的情况。(由于电缆或网络配置更改而导致子网不同)。我希望每 10 分钟运行一次检查,而不切断现有连接。

我基本上需要的是以下问题的答案对于我所连接的网络,我的 IP 地址和网关有效吗?或者如果我续订我的 DHCP 租约,我会再次获得相同的 IP 吗?。要回答第一个问题,可以 ping 一些公共 IP,例如 8.8.8.8,但我需要一个解决方案,该解决方案也适用于我不了解的大型私有网络。即使是默认网关也可能并不总是可以 ping 通。

一旦我知道我的 IP 无效,我就会执行“dhclient -r eth0 ; dhclient eth0”来续订租约。但是,如果我已经正确连接,这会让我短暂断开与互联网的连接。

我发现 dhcping 是一个很好的工具,可以询问 DHCP 服务器而无需实际使用结果。但是,我得到了奇怪的结果,这甚至可能符合另一个问题的条件。似乎只有我事先知道服务器的 IP,dhcping 才能正常工作,因此缺少一个用于 DHCP DISCOVER 的工具。(使用广播服务器地址是不可靠的)

我知道我可以使用 nmap 进行 hdcp 发现,但是,出于安全原因,安装 nmap 不是一个好主意。

我想要问的问题:

  • 有没有办法在连接的网络环境中验证我配置的 IP?
  • 是否有机会根据需要更新 dhclient 租约?
  • 是否有工具可以执行 dhcp 发现广播并打印结果?

附录

与我的第一次测试的结果不同,只需调用dhclient-v并不能解决我的问题。为了澄清这一点,我最初的问题是 dhclient 在后台模式下运行(实际上并没有一直更新租约)。调用 dhclient 会导致:

dhclient(30887) 已正在运行 - 退出。

但这并不能完全重现。有时它会成功。(这就是为什么我最初认为 -v 选项会有所不同,但事实并非如此)

所以我的问题是:如果我遇到这个已经运行的问题,虽然 dclient 目前没有执行任何操作,如何触发后台进程的更新?

(其背后的原理是,DHCP 客户端需要绑定到端口 68。当此端口被 dhclient 后台守护进程绑定时,另一个实例无法在前台执行)

答案1

前两个问题的答案是相同的:使用

dhclient -v eth0

-v代表详细,并非所有 Linux 发行版都有它),而不是dhclient -r eth0; dhclient eth0. 这种较短的形式第一的请求重新分配当前 IP 地址,然后仅当无法分配请求的 IP 地址(因为该地址已被占用或超出网关的 DHCP 范围)时才开始与路由器协商。

我建议你使用-v标记,以便您可以看到这次交换,它非常明确。

至于你的第三点,据我所知,任何 dhcp 客户端都没有试运行选项。但是,如果你真的坚持这一点,你可以执行以下操作:设置一个麦克维兰界面,并启动DHCP服务这个新接口的实例:

ip addr flush dev eth0
ip link add link eth0 mac0 type macvlan mode bridge
dhclient -v mac0

此时,您可以在网络上看到本地 DHCP 服务器提供的配置、网络、网络掩码、网关和 DNS 服务器新的,虚拟接口。完成后,

ip link del dev mac0
dhclient -v eth0

将恢复确切地你之前的配置,如果DHCP 服务器可以分配您的旧 IP 地址。否则,您只能使用新 IP 地址 ;-)。实际上,所有这些对于脚本来说都很简单。

顺便说一句,如果你的问题是持续存在的远程控制连接,我建议你检查一下莫什反而。

答案2

到目前为止我发现的最佳解决方案是使用 python 中的 dhcp discover 实现:

https://code.activestate.com/recipes/577649-dhcp-query/

这很好,因为我已经使用过 Python。但也许我仍然缺少一个简单的解决方案,而这一切都过于复杂了。

编辑:这并没有真正起到帮助作用。我的主要问题是 dhclient 后台进程占用了端口 68,这会阻止任何其他进程执行 DHCP 发现,而且我不知道有什么方法可以让后台进程在不删除网络配置的情况下释放它。

相关内容