Dhcp

如何在不失去連接的情況下使用 dhclient 釋放和更新 DHCP 租約

  • March 14, 2022

我想在我嘗試之前確定這會起作用,因為我正在處理一個只能通過 SSH 訪問的無頭 Pi(如果重要,為零 W)。

我已經在我的路由器中為 Pi 設置了地址保留,這或多或少是必不可少的,既可以簡化通過 Putty 的訪問,也可以訪問在 Pi 上執行的自定義伺服器。

問題是最初沒有預留,所以它在池中的某個其他隨機地址,而不是我為它預留的“非池”區域中的固定地址。耐心並沒有解決這個問題:它已經堅定地堅持這個地址好幾天了,而不是改變。我假設這裡的路由器中的 DHCP 伺服器有一個合理的租期,例如 12 或 24 小時。

顯然,如果我只是dhclient -r用來釋放租約,我目前的 SSH 會話將中止,留下東西是一個不太有用的狀態。我還注意到,如果您dhclient -r有可能導致 WiFi 連接中斷:請參閱本頁底部的警告以了解詳細資訊。

那麼,nohup (dhclient -r -d && dhclient) &鍵入 root bash 會話的可能性有多大(a)終止目前租約,然後(b)在需要時嘗試重新打開 WiFi,最後(c)獲得新租約,希望使用正確的地址.

我的理由是 using意味著當 SSH 會話向南時nohup它不會收到 a ,並且將它放在後台的子 shell 中意味著它最有可能執行兩個命令。SIGHUP

我考慮過的另一個選項是nohup (dhclient -r && reboot) &在 root bash 會話中,其中的邏輯是重新啟動系統應該重新建立 WiFi 連接,然後 ping DHCP 伺服器以獲取地址。希望保留一個。

如果這兩個都失敗,我還有哪些其他選擇可以釋放和更新租約,並在首選地址連接到 WiFi 的執行系統完成?作為最後的手段,我可​​以看看我是否能弄清楚如何連接螢幕和鍵盤,但我真的不想這樣做,這將是一個相當大的痛苦。

免責聲明:我無法對其進行測試,但由於只有最後一個可選步驟會更改任何永久配置,因此可能發生的更糟糕的情況是必須重置系統。

為了說明起見,我們假設:

  • 無線介面稱為 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 pi@192.168.1.2

並再次成為根。從現在開始,在根 shell 上從新連接開始。

  • SIGKILL DHCP 客戶端,以確保它在被殺死時不能做任何事情(比如關閉介面)。

目前尚不清楚dhclient, dhcpcd, udhcpc, 是否還有其他 DHCP 客戶端正在使用,或者即使一個仍在執行(一些最小配置可能只獲得一次 IP 地址並退出,而根本不處理租約續訂或到期)。

pkill -e -KILL dhclient

或者

pkill -e -KILL dhcpcd

等等

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

確保從現在開始沒有客戶端在執行,這一點很重要。

  • 手動刪除較舊的地址(將較新的地址提升為主要地址,而不是也被刪除)
ip address del 192.168.1.242/24 dev wlan0
  • 可選:如果需要,將配置更新為靜態地址,或者什麼都不做

由於它與 RaspberryPi Zero W 相關,我不知道如何執行這最後一步(它可以使用 Debian 的ifupdown並進行配置/etc/network/interfaces或進行不同的配置)。但是無論如何都沒有任何改變,在下一次(重新)啟動時,這將採用具有這個新 IP 地址的新租約,或者如果確實有一個錯誤恢復到舊的。

如果 DHCP 由 處理dhclient,則通過刪除其中的相關文件來擦除租用記憶體/var/lib/dhcp/dhclient*.leases應該會強制它下次請求新的租用。因為dhcpcd那可能是/var/lib/dhcpcd/*.lease

引用自:https://unix.stackexchange.com/questions/694406