如何使dhclient忘记其上次的DHCP租约?

我想要实现的目标是获得一个“冷启动、零状态”的DHCP租约,这意味着强制dhclient通过完整的发现和配置过程(DHCPDISCOVER-DHCPOFFER-DHCPREQUEST-DHCPACK,而不是使用记忆地址的简化的DHCPREQUEST-DHCPACK循环)。我需要这样做来调试网络配置问题。
我已经尝试过以下方法:
- 使用dhclient -r清除当前租约,断开当前的Network Manager连接; - 终止任何剩余的dhclient和dnsmasq进程; - 清理/var/lib/dhcp/目录,该目录据说包含客户端租约数据库; - sudo restart network-manager。
但即使在这些步骤之后,日志中仍然看到DHCPDISCOVER紧接着以某种方式仍然记住的地址进行的DHCPREQUEST。
显然,操作系统以某种其他方式存储了该地址,而我已经没有更多的想法了。希望社区能提供帮助?

你弄明白了吗?我也遇到了同样的问题。在NetworkManager下面也有租约文件。我也把它们删除了。不知为何,它仍然获取到旧的地址。 - gudge
4个回答

对我来说,这个方法很有效(对于 eth0,从 sudo su 执行):
dhclient -r -v eth0 && rm /var/lib/dhcp/dhclient.* ; dhclient -v eth0

2当我这样做时,我得到了一个新的租约,但是该IP地址似乎没有被系统使用。如果我尝试ping该名称或相关的IP地址,它会失败。如果我使用ifconfig来检查当前地址,我可以ping通它。 - TafT
1更改rm部分对我来说很有效(如果没有这个部分,之前的租约会被使用:dhclient -r -v eth0 && rm /var/lib/dhcp/dhclient* ; dhclient -v eth0 - davejagoda

DHCP客户端程序将租约写入文件中。只需删除该文件并重新启动网络管理器即可。

/var/lib/dhcp/dhclient.leases

这是租约存放的地方,在我的电脑里。

你所看到的并不是你的机器记住了IP地址。在系统日志中,你看到的是DISCOVER REQUEST OFFER ACK,但这并不是它们发生的顺序。 实际上,它是按照DISCOVER OFFER REQUEST ACK的顺序进行的。为了确认这一点,你可以嗅探PC和上游DHCP服务器之间的流量。你发送了DISCOVER,服务器返回了OFFER,并且你从OFFER中获取了IP地址用于你的REQUEST。
你做得一切都正确,然而,当你执行"dhclient -r"命令时,dhclient会发送一个单播RELEASE,而一些ISP只接受多播数据包到他们的DHCP服务器,因此RELEASE永远无法到达,就服务器而言,你的租约仍然有效,所以它给你返回了相同的IP地址作为OFFER。

谢谢那个!我一直不明白为什么日志总是显示DISCOVER、REQUEST、OFFER、ACK;这个顺序从来就没有意义。只要知道实际情况并非如此,对于解决自己的问题会大有帮助。所以,我的设备正在获取我不想要的IP的"DHCPOFFER",然后说"OK",但如果我强制它尝试获取其他东西,服务器就会返回"DHCPNACK",结果我完全没有网络。猜测可能是服务器上的预留分配给了错误的MAC地址。 - Auspex
我能想到的唯一方法是在/etc/network/interfaces中更改"hwaddress ether xx:xx:xx:xx:xx:xx",如果你的ISP允许你在不必打电话告诉他们的情况下更改你的MAC地址,并且你的电缆调制解调器没有在运行时替换它的MAC地址,那么服务器应该将你视为一个新用户并分配给你一个空闲的IP租约。 - Matt
问题是它给了我一个空的IP地址。而我试图强制它给我那个据说被保留的IP地址,因为外部DNS指向那个地址!所以,我把实际的MAC地址发送给网络管理员,并询问他是否真的为该MAC地址保留了一个IP地址。 - Auspex

通常情况下,使用dhclient -r命令就可以解决问题;但如果这对你不起作用,我在这里找到了一个解决方案here+ 一次性更新IP地址: 注意:在这个例子中,我们将使用eth0接口。该接口必须配置为DHCP,并且处于运行状态。
  • 打开终端并输入sudo su以切换到root用户。
  • 输入ifconfig命令来显示从DHCP获取的当前IP地址。
  • 输入dhcpcd -k命令向dhcpcd发送适当的信号(你可能需要通过apt-get install dhcpcd命令安装dhcpcd)。
  • 现在通过输入ifup eth0命令重新启动接口。
  • 输入ifconfig命令来显示新的IP地址。
还有一个关于每次更新IP地址的部分,但是描述是针对基于RPM的发行版(与基于Debian的发行版如Ubuntu相对)。
希望能有所帮助 :)