如何使用 dhclient 释放和续订 DHCP 租约,而不丢失连接

如何使用 dhclient 释放和续订 DHCP 租约,而不丢失连接

我想在尝试之前确定它是否有效,因为我正在处理一个只能通过 SSH 访问的无头 Pi(如果重要的话为零 W)。

我已经在我的路由器中为 Pi 设置了地址保留,这或多或少是必要的,既可以简化通过 Putty 的访问,也可以访问在 Pi 上运行的自定义服务器。

问题是,最初没有预留,所以它位于池中的其他随机地址,而不是我为其预留的“非池”区域中的固定地址。耐心并没有解决问题:几天来它一直坚定地保留该地址,而不是改变。我假设路由器中的 DHCP 服务器的租约长度合理,例如 12 或 24 小时。

显然,如果我只是用来dhclient -r释放租约,我当前的 SSH 会话将中止,留下的状态不太有用。我还注意到,如果您dhclient -r存在 WiFi 连接也会中断的风险:请参阅底部的警告这一页了解详情。

那么,在 root bash 会话中输入内容的可能性有多大:nohup (dhclient -r -d && dhclient) &(a) 终止当前租约,然后 (b) 在需要时尝试重新打开 WiFi,最后 (c) 获得新的租约,希望使用正确的地址。

我的理由是,使用nohup意味着当 SSH 会话出现问题时它不会收到 a SIGHUP,而将其放在后台的子 shell 中意味着它有最高的机会执行这两个命令。

我考虑过的另一个选择是nohup (dhclient -r && reboot) &在 root bash 会话中,其中的逻辑是重新启动系统应该重新建立 WiFi 连接,然后 ping DHCP 服务器以获取地址。希望能保留一份。

如果这两个都失败,我还有哪些其他选项可以释放和续订租约,并以在首选地址连接到 WiFi 的运行系统结束?作为最后的手段,我可​​以看看是否可以弄清楚如何连接屏幕和键盘,但我真的不想这样做,这将是一个相当大的痛苦。

答案1

免责声明:我无法测试它,但由于只有最后一个可选步骤会更改任何永久配置,因此可能发生的更糟糕的情况是必须重置系统。

为了便于说明,我们假设:

  • 无线接口称为 wlan0
  • 旧地址是192.168.1.242/24
  • 新的保留是 192.168.1.2/24

一切都应该以 root 用户身份运行。方法是:

  • 使用保留地址添加静态 IP 地址:既然它是保留的,谁在乎呢?

    ip address add 192.168.1.2/24 dev wlan0
    
  • 使能够promote_secondaries在接口上(否则,当删除 IP LAN 上配置的第一个地址时,同一 IP LAN 中的所有其他地址也会被删除:新地址也会被删除)

    sysctl -w net.ipv4.conf.wlan0.promote_secondaries=1
    

    或者:

    echo 1 > /proc/sys/net/ipv4/conf/wlan0/promote_secondaries
    
  • 使用新地址连接

    ssh [email protected]
    

    并再次成为root。从现在开始,在 root shell 上从新连接继续。

  • SIGKILL DHCP 客户端,以确保它在被终止时无法执行任何操作(例如关闭接口)。

    目前尚不清楚是否有dhclient其他DHCP 客户端正在使用,或者即使其中一个客户端仍在运行(某些最小配置可能只获取一次 IP 地址并退出,根本不处理租约续订或到期)。dhcpcdudhcpc

    pkill -e -KILL dhclient
    

    或者

    pkill -e -KILL dhcpcd
    

    ETC。

    或者如果没有pkill命令,找出要杀死的 PID(使用kill -KILL ...)。

    重要的是要确保从现在开始不再有任何客户端在运行。

  • 手动删除较旧的地址(这会将较新的地址提升为主要地址,而不是也将其删除)

    ip address del 192.168.1.242/24 dev wlan0
    
  • 可选:如果需要,将配置更新为静态地址,或者不执行任何操作

    由于它与 RaspberryPi Zero W 相关,我不知道如何执行最后一步(它可以使用 Debian 的如果向上向下并具有配置/etc/network/interfaces或以不同方式配置)。但无论如何,在没有任何更改的情况下,在下次(重新)启动时,这将采用具有此新 IP 地址的新租约,或者如果确实存在错误,则恢复到旧版本。

    如果 DHCP 由 处理dhclient,则通过删除 中的相关文件来擦除租约内存/var/lib/dhcp/dhclient*.leases应该会强制它下次请求新的租约。因为dhcpcd这可能是/var/lib/dhcpcd/*.lease

相关内容