全部產品
Search
文件中心

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

更新時間:Feb 17, 2022

問題描述

在連續使用阿里雲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執行個體執行檢查並自動修複的工作,請確保您的執行個體已經安裝了雲助手用戶端。2017年12月01日之後建立的ECS執行個體,預設預裝雲助手用戶端。更多詳情,請參見雲助手用戶端

  1. 建立雲助手命令,詳細的操作步驟請參見建立雲助手命令
  2. 下載以下Shell或PowerShell指令碼,並粘貼到雲助手命令內容中。

  3. 選擇對應的ECS執行個體,執行已建立的雲助手命令,詳細的操作步驟請參見執行命令
  4. 確認命令執行成功,詳細的操作步驟請參見查詢執行結果與狀態。下圖為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. 登入ECS執行個體,詳情請參見串連方式概述
  2. 執行以下命令,檢查執行個體的所有網卡。
    ls -al /sys/class/net/
  3. 執行以下命令,檢查eth0網卡是否使用DHCP分配IP地址。
    cat /etc/sysconfig/network-scripts/ifcfg-eth0
    系統顯示類似如下,BOOTPROTO=dhcp表示網卡使用DHCP分配IP地址,若不是使用DHCP分配IP地址,請前往步驟7。
    Dingtalk_20210924171828.jpg
  4. 執行以下命令,檢查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 izuf695ygwh32u2i******z eth0
  5. 執行以下命令,重新啟動dhclient進程。
    ifup eth0
    說明:本執行個體中eth0網卡為例,您需要將命令中的eth0替換成網卡實際的標識符。
  6. 再次檢查網卡對應的dhclient進程運行情況。
  7. 重複步驟3~6步驟,檢查並修複剩餘所有網卡的dhclient進程運行情況。

Windows執行個體操作步驟

  1. 登入ECS執行個體,詳情請參見串連方式概述
  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