问题描述
在连续使用阿里云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 aliyun-python-sdk-core
pip install aliyun-python-sdk-ecs
操作步骤
下载autofix_dhclient.py文件到ECS实例中。
执行以下命令,查看脚本的使用说明。
说明此为可选步骤。
python autofix_dhclient.py
系统返回类似如下。
Usage: autofix_dhclient.py <AccessKeyID> <AccessKeySecret> <region-id>
说明参数说明如下:
AccessKeyID:您的AccessKeyId,取值范围请参见创建AccessKey。
AccessKeySecret:您的AccessKeySecret。
region-id:实例所在的地域ID,取值范围请参见地域与可用区。
请参见参数说明填写
AccessKeyID
,AccessKeySecret
和region-id
等参数,使用root或者管理员身份运行脚本。python autofix_dhclient.py LTAIn*******Py6J kXXIOEoPXXvsYRUd**********TRyU cn-hangzhou
执行结果
以下内容为脚本运行结果示意图。
实例状态检查的详细说明如下。
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 izuf695ygwh32u2i******z 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
命令,确认返回的租约过期的时间为十年之内,表示完成修复。
适用于
云服务器ECS