阿里雲團隊努力不懈,力求將最新的技術內容更快地以您最熟悉的語言呈現。本文由簡體中文內容自動轉碼而成,過程無人工干預。阿里雲不保證此自動轉碼的準確性、完整性及時效性。因轉碼造成的任何內容錯誤及因此可能帶來的損失,阿里雲概不負責,敬請見諒。本文内容請以簡體中文版本為準。
全部產品
Search
文件中心

檢查與修複CentOS 7執行個體和Windows執行個體IP地址缺失問題

更新時間: Aug 07, 2019

問題描述

在連續使用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地址,需要根據本文描述修複問題。靜態配置的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

 

解決方案

您可以根據實際情況,從本文提供的四種解決方案中選擇其中一種。

  • 方法1:雲助手批量修複。適用於多台執行個體的情境,可以在ECS控制台上完成,操作方式更簡便。
  • 方法2:雲端式助手API編寫的Python SDK指令碼。以地區為修複單位,批量檢測您的執行個體狀態並完成自動修複。適用於熟悉指令碼化營運的使用者。
  • 方法3:提供了Shell和PowerShell指令碼,需要您登入到ECS執行個體中手動修複,適用於在少量執行個體中輪詢或測試的情境。其中,指令碼內容和解決方案1一致。
  • 方法4:逐一排查網卡,適用於少量執行個體的情境。

 

方法1:雲助手批量修複

本樣本採用雲助手為ECS執行個體執行檢查並自動修複的工作,請確保您的執行個體已經安裝了雲助手用戶端。2017年12月01日之後建立的ECS執行個體,預設預裝雲助手用戶端。更多詳情,請參見雲助手用戶端

  1. 前往ECS管理主控台雲助手頁面
  2. 選擇地區。
  3. 單擊建立命令。更詳細的操作步驟請參見文檔建立雲助手命令
  4. 下載以下Shell或PowerShell指令碼,並粘貼到雲助手命令內容中。

  5. 找到您已建立的命令,在操作欄中,單擊執行,選中受影響的執行個體批量運行已建立的雲助手命令。更詳細的操作步驟請參見文檔執行命令
    操作流程
  6. 命令運行顯示執行完成後,在操作欄中,單擊查看結果。更詳細的操作步驟請參見文檔查詢執行結果與狀態。下圖為CentOS執行個體和Windows執行個體的返回結果區分。

 

方法2:Python SDK指令碼批量修複

本樣本雲端式助手API編寫Python指令碼,能檢查並自動修複一個阿里雲地區下所有受影響的執行個體。關於如何安裝ECS SDK,請訪問阿里雲Github倉庫安裝文檔

 

準備工作

參考如下命令,下載相關的Python SDK依賴到本機電腦或者ECS執行個體中。

pip install aliyun-python-sdk-core
pip install aliyun-python-sdk-ecs

 

操作步驟

  1. 下載autofix_dhclient.py到已做好準備工作的本機電腦或者ECS執行個體中。
  2. 運行如下命令,查看指令碼的使用說明。
    註:此為可選步驟。
    python autofix_dhclient.py
    系統返回類似如下。
    Usage: autofix_dhclient.py <AccessKeyID> <AccessKeySecret> <region-id>
    註:參數說明如下。
    • AccessKeyID:您的AccessKeyId,取值範圍請參見建立AccessKey
    • AccessKeySecret:您的AccessKeySecret。
    • region-id:執行個體所在的地區ID,取值範圍請參見地區與可用性區域

  3. 按使用說明填寫AccessKeyIDAccessKeySecretregion-id等參數,以root或者管理員身份運行指令碼,例如。
    python autofix_dhclient.py LTAIn*******Py6J kXXIOEoPXXvsYRUd**********TRyU cn-hangzhou

 

執行結果

以下為指令碼運行結果示意圖。PyhtonSDKResult

執行個體狀態檢查的詳細說明如下。

  • Cloud Assistant:該檢查項查看您的執行個體是否安裝了雲助手用戶端。
    • Installed:表示執行個體已安裝了雲助手用戶端。
    • Not Installed:表示雲助手用戶端缺失,您可以安裝雲助手用戶端後繼續修複工作。
  • NeedFix:該檢查項查看執行個體是否需要修複dhclient進程或DHCP Client服務。
    • Yes:表示需要繼續修複,指令碼會自動完成後續工作。
    • No:表示無需修複。
    • Unknown:表示指令碼無法判斷,需要您手動執行。
  • FixResult:該檢查項彙報指令碼修複結果。
    • Success:表示成功修複dhclient進程或DHCP Client服務。
    • Failed:表示修複失敗。
    • NoChange:表示無需修複。
    • Unknown:表示指令碼無法判斷,需要您手動執行。

 

方法3:Shell/PowerShell指令碼修複

該方法需要您登入到受影響的執行個體中,逐一排查問題,因此適用於少量執行個體的情境。

 

CentOS執行個體操作步驟

  1. 遠程登入ECS執行個體。串連方式可參見串連方式導航
  2. 擷取指令碼linux_fix_dhclient.sh到任意目錄。
  3. 切換到指令碼所在的工作目錄,以root身份運行指令碼。
    sudo bash linux_fix_dhclient.sh
    註:
    • 返回結果為“0”時,指令碼已完成檢查和修複工作。
    • 返回其他狀態表明修複失敗。

 

Windows執行個體操作步驟

  1. 遠程登入ECS執行個體。串連方式可參見串連方式導航
  2. 擷取修複win_fix_dhclient.ps1指令碼到任意目錄。
  3. 以管理員權限開啟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執行個體操作步驟

  1. 遠程登入執行個體。
  2. 運行ls -al /sys/class/net/命令檢查執行個體的所有網卡。
  3. 運行cat /etc/sysconfig/network-scripts/ifcfg-eth0命令,檢查eth0網卡是否使用DHCP分配IP地址。
    • BOOTPROTO=dhcp表示網卡使用DHCP分配IP地址。
      etho
    • 若不是使用DHCP分配IP地址,可以忽略本文剩餘描述前往步驟7。
  4. 運行ps aux | grep dhclient | grep eth0命令檢查eth0網卡對應的dhclient進程運行情況。
    • 返回空結果表示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 izuf695ygwh32u2i******z eth0
  5. 運行ifup eth0命令重新啟動dhclient。
    註:您需要將命令中的eth0替換成網卡實際的標識符。
  6. 再次檢查網卡對應的dhclient進程運行情況。
  7. 重複步驟3-步驟6,檢查並修複剩餘所有網卡的dhclient進程運行情況。

 

Windows執行個體操作步驟

  1. 遠程登入執行個體。
  2. 以管理員身份開啟命令提示字元CMD。
  3. 運行以下命令查看描述為 Red Hat VirtIO Ethernet Adaptor 的網卡的 DHCP 已啟用 項是否為 ,及其 租約到期的時間
    ipconfig /all
    系統顯示類似如下。
    WindowsEachNIC
    註:Red Hat VirtIO Ethernet Adaptor為ECS執行個體的主網卡和輔助彈性網卡,您自訂配置的VPN或者LoopBack網卡等不在受影響範圍內。此外,未啟用DHCP服務的網卡不在受影響範圍內。

  4. 如果租約到期的時間顯示在一年之內,繼續運行以下命令更新租約到期的時間。
    ipconfig /renew
  5. 運行ipconfig /all命令返回的租約到期的時間更新為十年之內說明已經完成修複。

 

適用於

  • Elastic Compute Service

 

如果您的問題仍未解決,您可以在阿里雲社區免費諮詢,或提交工單聯絡阿里雲支援人員。