問題描述
在連續使用阿里雲ECS執行個體超過一段時間後,且期間未重啟過ECS執行個體,出現執行個體斷網、網路癱瘓、無法Ping通公網IP地址和私網IP地址的情況。
問題原因
初次啟動ECS執行個體時,系統會使用DHCP(動態主機設定協議,Dynamic Host Configuration Protocol)方式為彈性網卡自動分配IP地址,並獲得IP地址租約到期時間。正常情況下,Linux系統的dhclient進程和Windows系統的DHCP Client服務會定期向DHCP伺服器更新租約到期時間,以確保執行個體IP地址的可用性。由於部分CentOS 7鏡像(詳見適用範圍章節)建立的執行個體會小機率清理dhclient進程,以及Windows Server作業系統的DHCP Client服務存在已知問題,導致您的執行個體無法自動更新IP地址的續租到期時間。當首次獲得續租時間的IP地址到期後,執行個體的私網IP地址會被釋放,導致執行個體網路不通。
適用範圍
符合以下條件的ECS執行個體,並且ECS執行個體通過DHCP方式為彈性網卡自動分配IP地址,需要根據本文描述修複問題。若ECS執行個體配置的靜態IP地址,則無需處理該問題。
基於以下CentOS 7公用鏡像建立的任何類型執行個體(在2018年5月31日之前建立,並在2018年11月15號之後沒有重啟的ECS執行個體)。
centos_7_04_64_20G_alibase_20180419.vhd
centos_7_04_64_20G_alibase_20180326.vhd
centos_7_04_64_20G_alibase_201701015.vhd
centos_7_03_64_20G_alibase_20170818.vhd
centos_7_02_64_20G_alibase_20170818.vhd
centos_7_03_64_40G_alibase_20170710.vhd
centos_7_03_64_40G_alibase_20170625.vhd
centos_7_03_64_40G_alibase_20170523.vhd
centos_7_03_64_40G_alibase_20170503.vhd
運行以下Windows Server作業系統的執行個體(在2018年11月15日之前建立,且之後沒有重啟過的ECS執行個體)。
Windows Server 2008 R2
Windows Server 2012 R2
Windows Server 2016
Windows Server Version 1709
解決方案
如果您對執行個體或資料有修改、變更等風險操作,務必注意執行個體的容災、容錯能力,確保資料安全。
如果您對執行個體(包括但不限於ECS、RDS)等進行配置與資料修改,建議提前建立快照或開啟RDS記錄備份等功能。
如果您在阿里雲平台授權或者提交過登入帳號、密碼等安全資訊,建議您及時修改。
您可以根據實際情況,從本文提供的四種解決方案中選擇其中一種。
方法1:雲助手批量修複。適用於多台執行個體的情境,可以在ECS控制台上完成,操作方式更簡便。
方法2:雲端式助手API編寫的Python SDK指令碼。以地區為修複單位,批量檢測您的執行個體狀態並完成自動修複。適用於熟悉指令碼化營運的使用者。
方法3:提供了Shell和PowerShell指令碼,需要您登入到ECS執行個體中手動修複,適用於在少量執行個體中輪詢或測試的情境。其中,指令碼內容和解決方案1一致。
方法4:逐一排查網卡,適用於少量執行個體的情境。
方法1:雲助手批量修複
本樣本採用雲助手為ECS執行個體執行檢查並自動修複的工作,請確保您的執行個體已經安裝了雲助手Agent。2017年12月01日之後建立的ECS執行個體,預設預裝雲助手Agent。更多詳情,請參見雲助手Agent安裝雲助手Agent。
下載以下Shell或PowerShell指令碼,並粘貼到雲助手命令內容中。
CentOS執行個體:linux_fix_dhclient.sh
Windows執行個體:win_fix_dhclient.ps1
選擇對應的ECS執行個體,執行已建立的雲助手命令,詳細的操作步驟請參見執行命令。
確認命令執行成功,詳細的操作步驟請參見查詢執行結果與狀態。下圖為CentOS執行個體和Windows執行個體的命令返回結果。

方法2:Python SDK指令碼批量修複
本樣本雲端式助手API編寫Python指令碼,能檢查並自動修複一個阿里雲地區下所有受影響的執行個體。關於如何安裝ECS SDK,請查看阿里雲Github倉庫安裝文檔。
準備工作
參見以下命令,下載相關的Python SDK依賴到本機電腦或者ECS執行個體中。
pip install alibabacloud_ecs20140526操作步驟
下載autofix_dhclient.py檔案到ECS執行個體中。
使用如下命令,運行下載的指令碼。
sudo python autofix_dhclient.py <AccessKeyID> <AccessKeySecret> <region-id>說明您需要將命令中的
<AccessKeyID>,<AccessKeySecret>和<region-id>進行替換。AccessKeyID:您阿里雲帳號或RAM使用者的AccessKey ID。
AccessKeySecret:您阿里雲帳號或RAM使用者的AccessKey Secret。
region-id:執行個體所在的地區ID,取值請參見地區與可用性區域。
執行結果
以下內容為指令碼運行結果示意圖。
執行個體狀態檢查的詳細說明如下。
Cloud Assistant:該檢查項查看您的執行個體是否安裝了雲助手Agent。
Installed:表示執行個體已安裝了雲助手Agent。
Not Installed:表示雲助手Agent缺失,您可以安裝雲助手Agent後繼續修複工作。
NeedFix:該檢查項查看執行個體是否需要修複dhclient進程或DHCP Client服務。
Yes:表示需要繼續修複,指令碼會自動完成後續工作。
No:表示無需修複。
Unknown:表示指令碼無法判斷,需要您手動執行。
FixResult:該檢查項彙報指令碼修複結果。
Success:表示成功修複dhclient進程或DHCP Client服務。
Failed:表示修複失敗。
NoChange:表示無需修複。
Unknown:表示指令碼無法判斷,需要您手動執行。
方法3:Shell/PowerShell指令碼修複
該方法需要您登入到受影響的執行個體中,逐一排查問題,因此適用於少量執行個體的情境。
CentOS執行個體操作步驟
登入ECS執行個體,詳情請參見串連方式概述。
擷取指令碼linux_fix_dhclient.sh到任意目錄。
切換到指令碼所在的工作目錄,以root身份運行指令碼。
sudo bash linux_fix_dhclient.sh說明返回結果為“0”時,指令碼已完成檢查和修複工作。
返回其他狀態表明修複失敗。
Windows執行個體操作步驟
登入ECS執行個體,詳情請參見串連方式概述。
擷取修複win_fix_dhclient.ps1指令碼到任意目錄。
以管理員權限開啟PowerShell,執行以下命令。
powershell -executionpolicy bypass -file C:\win_fix_dhclient.ps1說明說明:
您需要將
C:\win_fix_dhclient.ps1替換成實際的檔案路徑。當返回“No ip will expire in recent 500 days. Then no need fix.”時,表示執行個體的DHCP Client服務無異常情況,無需修複。
當返回“Found one ip will expire in 500 days. We need fixing it!!! Fix it now... Fix success.”時,表示執行個體的DHCP Client服務異常,指令碼已完成修複工作。
返回其他狀態表明修複失敗。
方法4:逐一排查網卡
該方法需要您自行檢查和修複檢查每張網卡對應的dhclient進程(CentOS執行個體)或IP地址租約到期時間(Windows執行個體)。
CentOS執行個體操作步驟
登入ECS執行個體,詳情請參見串連方式概述。
執行以下命令,檢查執行個體的所有網卡。
ls -al /sys/class/net/執行以下命令,檢查eth0網卡是否使用DHCP分配IP地址。
cat /etc/sysconfig/network-scripts/ifcfg-eth0系統顯示類似如下,
BOOTPROTO=dhcp表示網卡使用DHCP分配IP地址,若不是使用DHCP分配IP地址,請前往步驟7。
執行以下命令,檢查eth0網卡對應的dhclient進程運行情況。
ps aux | grep dhclient | grep eth0返回空結果表示dhclient進程異常。
返回如下結果表示dhclient進程正常運行,請前往步驟7。
root 15340 0.0 0.3 113372 12788 ? Ss 14:16 0:00 /sbin/dhclient -1 -q -lf /var/lib/dhclient/dhclient--eth0.lease -pf /var/run/dhclient-eth0.pid -H izuf****************** eth0
執行以下命令,重新啟動dhclient進程。
ifup eth0說明本執行個體中eth0網卡為例,您需要將命令中的eth0替換成網卡實際的標識符。
再次檢查網卡對應的dhclient進程運行情況。
重複步驟3~6步驟,檢查並修複剩餘所有網卡的dhclient進程運行情況。
Windows執行個體操作步驟
登入ECS執行個體,詳情請參見串連方式概述。
以管理員身份開啟命令提示字元CMD。
運行以下命令,查看描述為Red Hat VirtIO Ethernet Adaptor的網卡的DHCP 已啟用項是否為是,及其租約到期的時間。
ipconfig /all說明Red Hat VirtIO Ethernet Adaptor為ECS執行個體的主網卡和輔助彈性網卡,您自訂配置的VPN或者LoopBack網卡等不在受影響範圍內。此外,未啟用DHCP服務的網卡不在受影響範圍內。
如果租約到期的時間顯示在一年之內,執行以下命令,更新租約到期的時間。
ipconfig /renew執行
ipconfig /all命令,確認返回的租約到期的時間為十年之內,表示完成修複。
適用於
Elastic Compute Service