網路與 IP

DHCP 服務異常怎麼解決?169.254 位址與服務未開啟的排查順序

DHCP 服務異常分兩類:一類是本機的 DHCP Client 服務沒執行,或網路卡被設成了手動位址,系統根本沒去要位址;另一類是請求發出去了卻沒人應答,Windows 只好給自己配一個 169.254 開頭的位址。先用 ipconfig /all 分清是哪一類,再按本機、網路、DHCP 伺服器的順序排查。

作者 頂聯產品團隊發布於 7 分鐘閱讀

DHCP 服務異常怎麼解決?先判斷是哪一類問題:本機沒去要位址,還是要了沒人給。前者是電腦上的 DHCP Client 服務沒有執行,或者網路卡被設成了手動 IP,Windows 網路診斷會提示“DHCP 服務未開啟”“未啟用 DHCP”;後者是請求已經發出、網路裡卻沒有 DHCP 伺服器應答,系統拿不到位址,只好給自己配一個 169.254 開頭的位址。排查順序是:用 ipconfig /all 定性,檢查 DHCP Client 服務,確認網路卡為自動獲取,釋放並重新獲取位址,排除網路卡驅動和協議棧問題,最後到網路側檢查鏈路、VLAN、DHCP 伺服器或中繼,以及位址池是否用完。

先用 ipconfig /all 判斷屬於哪一種

以管理員身份開啟命令提示符執行 ipconfig /all,找到正在使用的那塊網路卡:

乙太網介面卡 乙太網:

   描述. . . . . . . . . . . . . . . : Intel(R) Ethernet Connection I219-V
   實體位址. . . . . . . . . . . . . : 00-1A-2B-3C-4D-5E
   DHCP 已啟用 . . . . . . . . . . . : 是
   自動配置已啟用. . . . . . . . . . : 是
   自動配置 IPv4 位址  . . . . . . . : 169.254.37.112(首選)
   子網掩碼  . . . . . . . . . . . . : 255.255.0.0
   預設閘道器. . . . . . . . . . . . . :

對照下表確定方向:

看到的情況 說明 先看哪一步
“DHCP 已啟用”為“是”,位址是 169.254.x.x,沒有預設閘道器 請求發出去了,沒收到可用的應答 第二步,然後第三步
“DHCP 已啟用”為“否” 網路卡被設成了手動位址,系統不會去要 第一步的網路卡設定部分
“媒體狀態”為“媒體已斷開連線” 網線沒插好、對端連接埠關閉或 Wi-Fi 沒連上 先解決物理連線
位址後面顯示“(重複)” 拿到的位址和別的裝置衝突 第三步、第四步中的位址衝突
網路診斷提示 DHCP Client 服務未執行,或服務啟動失敗 本機服務問題 第一步

169.254 開頭的位址是什麼意思

169.254.0.0/16 是 RFC 3927 規定的 IPv4 鏈路本地位址段,Windows 裡叫“自動專用 IP 定址”(APIPA)。網路卡設為自動獲取、卻聯絡不上任何 DHCP 伺服器時,系統在 169.254.1.0 到 169.254.254.255 之間挑一個位址,先用 ARP 確認沒人佔用,再配給自己,掩碼是 255.255.0.0,沒有閘道器。這樣的位址只能和同一網段裡同樣是 169.254 的裝置通訊,存取不了閘道器和外網。之後系統大約每 5 分鐘在後台重試一次 DHCP,一旦拿到正式位址就自動替換。

這個位址本身是 DHCP Client 服務在要不到位址後自己配的,所以看到 169.254,基本可以排除“服務未開啟”,應當把注意力放在“為什麼沒人應答”上。另外,啟用了 IPv6 的網路卡上還會有一個 fe80 開頭的位址,那是 IPv6 的鏈路本地位址,每塊網路卡都會自動生成,不是故障。

第一步:DHCP Client 服務沒開啟,或網路卡沒設成自動獲取

普通電腦上說的“DHCP 服務”,指的是客戶端服務 DHCP Client(服務名 Dhcp)。Windows Server 上另有一個 DHCP Server 服務,是給別人分配位址的伺服器角色,兩者不要混淆。

按 Win + R 輸入 services.msc,找到 DHCP Client,啟動型別應為“自動”,狀態應為“正在執行”。命令列檢查與啟動(需要管理員許可權):

Get-Service Dhcp | Select-Object Name, Status, StartType
Set-Service Dhcp -StartupType Automatic
Start-Service Dhcp
sc query Dhcp
sc qc Dhcp
sc config Dhcp start= auto
net start Dhcp

sc config 的 start= 後面必須有一個空格,這是 sc 命令的固定寫法。啟動時提示“Windows 無法啟動 DHCP Client 服務(位於 本地計算機 上)”,就是常說的“本地計算機上的 DHCP 服務無法啟動”,按後面的錯誤碼處理:

報錯 原因 處理
錯誤 1068:依存服務或組無法啟動 DHCP Client 依賴的服務或驅動沒有執行 sc qc Dhcp 看 DEPENDENCIES 一欄列出的依賴項(以實際輸出為準),逐個 sc query 檢查並啟動,常見是 Network Store Interface Service(NSI)被禁用
錯誤 1079:此服務的帳戶不同於執行於同一程序上的其他服務的帳戶 服務的登入身份被改過 在服務屬性的“登入”頁改回“本地服務”,或執行 sc config Dhcp obj= "NT AUTHORITY\LocalService" password= ""
錯誤 5:拒絕存取 許可權被改,或被安全軟體攔截 暫停第三方安全軟體後重試;仍失敗時依次執行 DISM /Online /Cleanup-Image /RestoreHealth 和 sfc /scannow 修復系統檔案
啟動型別顯示“禁用” 被最佳化軟體或組策略關閉 改回“自動”;加入域的電腦改了又變回去,請管理員檢查組策略
服務啟動後馬上停止 網路卡驅動或網路元件異常 第二步的驅動與協議棧部分

服務正常,還要確認網路卡本身是自動獲取。網路診斷提示“乙太網 未啟用 DHCP”或“WLAN 未啟用 DHCP”,意思是這塊網路卡被設成了手動 IP。圖形介面裡開啟網路卡屬性,雙擊“Internet 協議版本 4 (TCP/IPv4)”,選“自動獲得 IP 位址”和“自動獲得 DNS 伺服器位址”。命令列改法如下,先用 netsh interface show interface 查出網路卡名稱:

netsh interface ip set address name="乙太網" source=dhcp
netsh interface ip set dns name="乙太網" source=dhcp

PowerShell 可以先看各網路卡的 DHCP 狀態:

Get-NetIPInterface -AddressFamily IPv4 | Select-Object InterfaceAlias, Dhcp, ConnectionState

用 PowerShell 的 Set-NetIPInterface -Dhcp Enabled 切換時,原來手動配置的位址和閘道器可能還留在網路卡上,netsh 的寫法會一併清除,更省事。

第二步:釋放並重新獲取位址,排除驅動問題

ipconfig /release
ipconfig /renew

有多塊網路卡時,在命令後面加網路卡名,例如 ipconfig /renew "乙太網"。看結果:

  • 拿到了正常位址:問題解決,多半是之前的租約或網路卡狀態異常。
  • 提示無法聯絡 DHCP 伺服器、請求超時(英文系統為 unable to contact your DHCP server. Request has timed out.):本機已經發出請求、沒收到應答,轉到第三步查網路。
  • 提示網路卡處於媒體斷開狀態,無法執行操作:物理連線沒通,先查網線、連接埠或 Wi-Fi。

重新獲取仍然失敗、而同一網路裡其他裝置正常時,問題還在本機:

  1. 重啟網路卡:Restart-NetAdapter -Name "乙太網",或在裝置管理器裡禁用再啟用。
  2. 檢查驅動:裝置管理器裡網路卡有黃色感嘆號,或系統更新後網路卡型號顯示異常,到主機板或網路卡廠商的網站下載驅動重新安裝。Get-NetAdapter | Select-Object Name, InterfaceDescription, Status, LinkSpeed, DriverVersion 能看到當前的驅動版本和連線速率。
  3. 檢查虛擬網路卡:VPN 客戶端、虛擬機器軟體會新增虛擬網路卡和過濾驅動。啟用 Hyper-V 外部虛擬交換器後,物理網路卡上的 IPv4 會被取消,位址改由名為“vEthernet”的虛擬網路卡獲取,這是正常現象,不要在物理網路卡上找位址。
  4. 重置網路協議棧:管理員身份執行下面兩條命令後重啟電腦。netsh int ip reset 會清掉手動配置的 IP,有靜態配置的先記下來。
netsh winsock reset
netsh int ip reset
  1. 看客戶端日誌:事件檢視器中依次展開“應用程式和服務日誌 → Microsoft → Windows → Dhcp-Client”,或用命令讀取:
Get-WinEvent -LogName "Microsoft-Windows-Dhcp-Client/Admin" -MaxEvents 20 |
  Format-Table TimeCreated, Id, Message -AutoSize -Wrap

第三步:網路裡有沒有 DHCP 伺服器應答

很多台裝置同時拿不到位址,或者伺服器、虛擬機器在機房裡拿不到位址,問題通常在網路側。按下面的順序查:

檢查項 常見問題 怎麼查
1. 鏈路 網口燈不亮,交換器連接埠被關閉或協商失敗 華為 display interface brief,思科 show interfaces status
2. 連接埠 VLAN 接入連接埠劃錯 VLAN;伺服器做了網路卡繫結,交換器側沒配對應的聚合 核對連接埠所屬 VLAN 與該 VLAN 應使用的網段
3. DHCP 伺服器或中繼 這個 VLAN 裡沒有 DHCP 伺服器,閘道器上也沒配置中繼,廣播出不了本網段 華為 display current-configuration interface Vlanif10 看有無 dhcp select relay 與 dhcp relay server-ip;思科 show running-config interface Vlan10 看有無 ip helper-address
4. DHCP Snooping 開了 Snooping,通往 DHCP 伺服器或中繼方向的連接埠沒設為信任口,應答被交換器丟棄 檢視 Snooping 配置與信任連接埠
5. 位址池 位址用完,伺服器不再應答 第四步
6. 接入安全策略 連接埠安全、MAC 數量限制、802.1X 認證沒透過 交換器日誌與連接埠安全配置

要確認這個 VLAN 裡到底有沒有 DHCP 伺服器在應答,在同一 VLAN 的一台 Linux 上執行:

sudo nmap --script broadcast-dhcp-discover -e eth0

它會發出一個 DHCP 發現請求,並列出所有應答者的位址(Server Identifier)和提供的位址(IP Offered)、閘道器、DNS。一個應答都沒有,說明請求根本沒人接;出現了不認識的伺服器,說明網路裡有人私設 DHCP,客戶端可能拿到了錯誤的位址。

更直接的是在拿不到位址的那台機器上抓包(Linux 用下面的 tcpdump,Windows 可以用 Wireshark 配同樣的過濾條件),看 DHCP 的四步互動(發現 DISCOVER、提供 OFFER、請求 REQUEST、確認 ACK)走到了哪一步:

sudo tcpdump -ni eth0 -e -v 'udp port 67 or udp port 68'
抓到的報文 結論
只有客戶端反覆發 DISCOVER 沒有伺服器應答:VLAN 裡沒有伺服器、中繼沒配,或應答被 Snooping 丟棄
有 OFFER,客戶端卻不繼續發 REQUEST 應答到了客戶端,問題在客戶端:本機防火牆、驅動或網路卡過濾軟體
REQUEST 之後伺服器回 NAK 客戶端請求的位址不屬於當前網段,常見於裝置從別的 VLAN 換過來,帶著舊位址續租
ACK 之後客戶端發出 DECLINE 客戶端檢測到分到的位址已被別人佔用,伺服器會把它標記為衝突,見第四步

第四步:DHCP 伺服器端日誌與位址池

請求有沒有到達伺服器、伺服器為什麼不給位址,日誌裡寫得很清楚。

ISC DHCP(dhcpd):RHEL 系執行 journalctl -u dhcpd -f,Debian 系執行 journalctl -u isc-dhcp-server -f,然後讓客戶端重新獲取。

DHCPDISCOVER from 00:1a:2b:3c:4d:5e via 10.0.10.1
DHCPOFFER on 10.0.10.57 to 00:1a:2b:3c:4d:5e via 10.0.10.1
DHCPDISCOVER from 00:1a:2b:3c:4d:5e via eth1: network 10.0.20.0/24: no free leases
DHCPDISCOVER from 00:1a:2b:3c:4d:5e via 10.0.30.1: unknown network segment

via 後面是中繼的位址時,說明中繼在工作;no free leases 表示這個網段的位址池用完了;unknown network segment 表示中繼轉來的請求在配置裡找不到對應的 subnet 宣告,要給這個網段補一個位址池。租約記錄在 /var/lib/dhcpd/dhcpd.leases(RHEL 系)或 /var/lib/dhcp/dhcpd.leases(Debian 系)。ISC 已經停止維護 ISC DHCP,新部署可以考慮它的後繼專案 Kea。

dnsmasq:執行 journalctl -u dnsmasq -f,位址池用完時會出現 no address available。

Windows DHCP 伺服器:

Get-DhcpServerv4ScopeStatistics | Format-Table ScopeId, Free, InUse, PercentageInUse

交換器或路由器做 DHCP 伺服器:華為執行 display ip pool name 位址池名 看已用和空閒數量;思科執行 show ip dhcp pool 看用量,show ip dhcp conflict 看被標記為衝突、暫不分配的位址。

位址池用完的常見原因:租期太長而裝置流動快(訪客網路尤其明顯);衝突位址被伺服器標記後暫停分配;有裝置反覆用不同的 MAC 申請。對應的處理是擴大位址池或縮短租期,清理衝突記錄,並在交換器上限制每個連接埠學習的 MAC 數量。

Linux 客戶端獲取不到位址時,先看系統用的是哪個 DHCP 客戶端:RHEL、Rocky 等用 NetworkManager,執行 nmcli device status 和 journalctl -u NetworkManager | grep -i dhcp;使用 netplan 的 Ubuntu Server 多由 systemd-networkd 負責,執行 networkctl status eth0 和 journalctl -u systemd-networkd | grep -i dhcp;仍在用 dhclient 的系統,執行 dhclient -r eth0 釋放後,用 dhclient -v eth0 重新獲取,反覆出現 DHCPDISCOVER on eth0 to 255.255.255.255 port 67 並以 No DHCPOFFERS received. 結束,就是沒人應答,回到第三步。注意 Linux 伺服器通常不會像 Windows 那樣自動配 169.254 位址,拿不到位址時網路卡上就只是沒有 IPv4。

在管理系統裡怎麼落地

機房裡的 DHCP 故障,排查時常常卡在“這台機器接在哪個連接埠、連接埠在哪個 VLAN、這個 VLAN 的閘道器在哪台裝置上”這幾個問題上。Toplink DCIM 的伺服器列表直接顯示每台機器所接的交換器連接埠、連接埠速率和 VLAN,連接埠劃錯 VLAN 時可以在 交換器管理 裡遠端改正;IP 位址管理 為每個位址段記錄 VLAN 和閘道器所在的交換器,查中繼配置時知道該登入哪台裝置。PXE 裝機等用途的 DHCP 動態池可以單獨建段並鎖定,鎖定的段不參與開通時的自動分配,避免靜態分配出去的位址和動態池重疊,造成位址衝突。

常見問題

169.254 的位址能手動改成正常位址上網嗎?

能臨時用:按網路管理員給的位址、掩碼、閘道器和 DNS 手動填寫即可通訊。但這只是繞開了 DHCP,同一網路裡其他裝置也拿不到位址時,說明 DHCP 伺服器或中繼本身有問題,仍然要修好。

用固定 IP 的電腦,可以禁用 DHCP Client 服務嗎?

不建議。在 Windows 上這個服務還負責為本機向 DNS 伺服器註冊和更新記錄,禁用後這部分功能隨之失效;以後網路卡改回自動獲取時,也會因為服務沒執行而拿不到位址。

為什麼手機能連上 Wi-Fi,電腦卻拿到 169.254?

說明路由器的 DHCP 在工作,問題多半在這台電腦:DHCP Client 服務、網路卡驅動、安全軟體或 VPN 虛擬網路卡。也可能位址池很小、裝置很多,恰好被用完,可以在路由器的已分配列表裡核對。

想看看在你的機房裡怎麼用?

從一次產品示範開始,梳理你的業務鏈路。

查看價格
服務熱線 400-112-2951

讓我們聊聊你的 IDC 業務

掃碼新增企業微信,預約產品示範或申請試用。

Toplink 企業微信二維碼

長按儲存或使用企業微信 / 微信掃描

也可致電
400-112-2951
Telegram
@TopLink88