我想要实现的是获取冷启动、零状态 DHCP 租约这意味着强制执行dhclient
完整的发现和配置过程(DHCPDISCOVER–DHCPOFFER–DHCPREQUEST–DHCPACK,而不是使用记住的地址的快捷方式 DHCPREQUEST–DHCPACK 循环)。我需要这个来调试网络配置问题。
我努力了:
- 使用 刷新当前租约
dhclient -r
,断开当前网络管理器连接; - 杀死任何残留物
dhclient
和dnsmasq
进程; - 清理
/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
获取连接列表:
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 reapply
了https://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 是我在tftpd64
Windows 上运行的 DHCP 服务器中测试的一个地址,IIRC,“持久租约”中有一个复选框tftpd64
已启用 - 据我所知,“持久租约”是永不过期的租约;显然 NetworkManager 将这些持久租约地址保存在这些内部*文件中?如果是这样,那(“持久租约”)也解释了为什么该文件在重启后没有消失……