如何让 dhclient 忘记其最后的 DHCP 租约?

如何让 dhclient 忘记其最后的 DHCP 租约?

我想要实现的是获取冷启动、零状态 DHCP 租约这意味着强制执行dhclient完整的发现和配置过程(DHCPDISCOVER–DHCPOFFER–DHCPREQUEST–DHCPACK,而不是使用记住的地址的快捷方式 DHCPREQUEST–DHCPACK 循环)。我需要这个来调试网络配置问题。

我努力了:

  • 使用 刷新当前租约dhclient -r,断开当前网络管理器连接;
  • 杀死任何残留物dhclientdnsmasq进程;
  • 清理/var/lib/dhcp/目录,其中据称包含客户端租约数据库;
  • sudo restart network-manager

但即使执行了这些步骤,我仍然会在日志中看到 DHCPDISCOVER 紧接着是 DHCPREQUEST,不知何故仍然记住了地址。

显然,操作系统以其他方式存储了地址,我已经没有主意了。社区有什么帮助吗?

答案1

这对我来说很有效(对于 eth0,从 运行sudo su):

dhclient -r -v eth0 && rm /var/lib/dhcp/dhclient.* ; dhclient -v eth0

答案2

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

/var/lib/dhcp/dhclient.leases

这是我的计算机中存储租约的地方。

答案3

您看到的不是您的机器记住的 IP。在系统日志中,您会看到 DISCOVER REQUEST OFFER ACK,但这不是按发生的顺序。它实际上发出了 DISCOVER OFFER REQUEST ACK,为了确认这一点,您可以嗅探 PC 和上游 DHCP 服务器之间的流量。您发送了 DISCOVER,服务器发回了 OFFER,您从 REQUEST 的 OFFER 中获得了 IP

但是你做的一切都是正确的,当你执行“dhclient -r”时,dhclient 将发送一个单播 RELEASE,而一些 ISP 只接受发送到他们的 DHCP 服务器的多播数据包,因此 RELEASE 永远不会到达那里,就服务器而言你的租约仍然有效,所以它在 OFFER 中将相同的 IP 返回给你。

答案4

我发现,即使完成了 OP 列出的所有清理工作之后,仍然存在这个问题 - 192.168.2.31 在过去的某个时间点被分配给 eth0(我不再需要它了):

$ sudo grep -r '192.168.2.31' /var/ 2>/dev/null 
/var/lib/NetworkManager/internal-57fb77c9-12a8-32c7-b276-90a8d1904533-eth0.lease:ADDRESS=192.168.2.31

因此在这种情况下,我必须找到如何强制 NetworkManager 忘记其所有租约,但目前还找不到任何东西……

编辑:https://bugs.launchpad.net/ubuntu/+source/netplan.io/+bug/1979674

尽管sudo systemctl status NetworkManager声明正在使用 NetworkManager 自己的 DHCP 客户端

哦,那么 NetworkManager 有自己的 DHCP 客户端,但是它不使用dhclient?哦,这都是些什么狗屁东西……

编辑:如何从日志中确认这一点?没有更多的 /var/log/syslog...NetworkManager 日志在哪里?

答案现在已经过时了(2017),日志现在在这里...如果您想将日志数量限制为系统启动时的数量,请使用-b选项:journalctl -b 0 -u NetworkManager

好的,所以我有:

$ journalctl -b 0 -u NetworkManager | grep dhcp | grep 'init\|eth0' | head -5
May 02 15:18:23 raspberrypi NetworkManager[717]: <info>  [1714655903.2163] dhcp: init: Using DHCP client 'internal'
May 02 15:18:27 raspberrypi NetworkManager[717]: <info>  [1714655907.3436] dhcp4 (eth0): activation: beginning transaction (timeout in 45 seconds)
May 02 15:22:27 raspberrypi NetworkManager[717]: <info>  [1714656147.7046] dhcp4 (eth0): canceled DHCP transaction
May 02 15:22:27 raspberrypi NetworkManager[717]: <info>  [1714656147.7048] dhcp4 (eth0): activation: beginning transaction (timeout in 45 seconds)
May 02 15:22:27 raspberrypi NetworkManager[717]: <info>  [1714656147.7048] dhcp4 (eth0): state changed no lease

编辑:使用 Bash 获取网络管理器网络连接列表?

获取连接列表:nmcli connection

好的,那么对我来说:

$ nmcli connection 
NAME                UUID                                  TYPE      DEVICE 
SomeNet             d4e4973b-45b7-4a11-8a7d-b408c1125b26  wifi      wlan0  
lo                  2166fa1e-34fd-43e1-a0e5-22b4d007ea2c  loopback  lo     
OtherNet            9fc89e3d-3566-4851-ae79-994a071665d3  wifi      --     
Wired connection 1  57fb77c9-12a8-32c7-b276-90a8d1904533  ethernet  --     

至少,它与/var/lib/NetworkManager/internal-*eth0.lease:ADDRESS=*上面的文件中的 UUID 相同;那里也有ipv4.dhcp*设置,但对于租约来说并不多:

$ nmcli connection show "Wired connection 1" | grep ipv4.dhcp
ipv4.dhcp-client-id:                    --
...

编辑:我发现https://unix.stackexchange.com/questions/284550/check-my-dhcp-lease- 我从那里的建议中一无所获:

$ nmcli -f ipv4.method connection show "Wired connection 1"
ipv4.method:                            auto

$ nmcli -f DHCP4 connection show "Wired connection 1"
$

$ cat /run/NetworkManager/devices/1
[device]
managed=true
perm-hw-addr-fake=00:00:00:00:00:00
connection-uuid=2166fa1e-34fd-43e1-a0e5-22b4d007ea2c
nm-owned=false

$ ls -la /run/systemd/netif/leases/
total 0
drwxr-xr-x 2 systemd-network systemd-network  40 May  2 15:17 .
drwxr-xr-x 5 systemd-network systemd-network 100 May  2 15:17 ..

编辑:更多解释回复:NetworkManager 将 DHCP 客户端租约数据保存在哪里?

/var/lib/NetworkManager 中的文件是内部的,而不是公共 API。... 这些文件不应该提供有关租约的信息。

您可以在 D-Bus API 上查看当前租约信息,例如通过 [...] nmcli -f DHCP4 device show ens1。在最近的 NM 版本中,您还可以在/run/NetworkManager/devices/$IFINDEX(如果您喜欢阅读文件)中找到相同的信息。这公共 API。

租约仅在 NetworkManager 运行并连接时才有意义。它只是在内存中知道租约的有效期。... 如果您重新激活设备(或重新启动或重启 NM),它将尝试获取新租约并再次启动 DHCP 状态机。它仅使用之前的 ADDRESS= 向 DHCP 服务器提示它想要哪个地址。

如果设备当前不活跃,那么就没有过去租约的公共 API。是的,您可以解析 /var/lib/NetworkManager/*.lease 来获取一些信息,但这只包含 NetworkManger 关心的信息ADDRESS=,而不是大多数有趣的数据。

噢,亲爱的...那么这是什么意思呢,要忘记租约,我只需删除/var/lib/NetworkManager/internal*lease*,然后重新启动 NetworkManager,是吗?

编辑:我找到nmcli device reapplyhttps://www.cyberciti.biz/faq/howto-linux-renew-dhcp-client-ip-address/https://www.kc8apf.net/2019/03/renewing-dhcp-while-keeping-a-networkmanager-connection-up/- 显然,我无法在我的 eth0 中使用它,因为它目前尚未连接:

$ nmcli device
DEVICE         TYPE      STATE                   CONNECTION 
wlan0          wifi      connected               SomeNet    
lo             loopback  connected (externally)  lo         
eth0           ethernet  disconnected            --         
p2p-dev-wlan0  wifi-p2p  disconnected            --         

$ sudo nmcli con down id "Wired connection 1"
Connection 'Wired connection 1' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/56)

$ sudo nmcli con up id "Wired connection 1"
Error: Connection activation failed: IP configuration could not be reserved (no available address, timeout, etc.)
Hint: use 'journalctl -xe NM_CONNECTION=57fb77c9-12a8-32c7-b276-90a8d1904533 + NM_DEVICE=eth0' to get more details.

$ sudo nmcli device reapply eth0
Connection successfully reapplied to device 'eth0'.

$ sudo bash -c 'ls -la /var/lib/NetworkManager/internal*eth0*'
-rw-r--r-- 1 root root 59 Apr 25 04:11 /var/lib/NetworkManager/internal-57fb77c9-12a8-32c7-b276-90a8d1904533-eth0.lease

是的,看起来它也不是这样“忘记”租约的……

编辑:请注意:最后,我确实删除了/var/lib/NetworkManager/internal-*-eth0.lease(请参阅下面 @ulidtko 的评论,了解正确的操作方法);有趣的是,之后我运行了 dhclient,重新启动了 NetworkManager,等等 - 我甚至可以连接 - 但是,有趣的是,我没有得到另一个/var/lib/NetworkManager/internal-*-eth0.lease文件?!那么它一开始怎么会在那里呢?好吧,趁我记得的时候,让我注意一下:192.168.2.31 是我在tftpd64Windows 上运行的 DHCP 服务器中测试的一个地址,IIRC,“持久租约”中有一个复选框tftpd64已启用 - 据我所知,“持久租约”是永不过期的租约;显然 NetworkManager 将这些持久租约地址保存在这些内部*文件中?如果是这样,那(“持久租约”)也解释了为什么该文件在重启后没有消失……

相关内容