在连续使用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地址无需继续阅读文档。
阿里云提醒您:
- 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
- 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
- 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。
您可以根据实际情况,从本文提供的四种解决方法中选择其中一种。
本示例采用云助手为ECS实例执行检查并自动修复的工作,请确保您的实例已经安装了云助手客户端。2017年12月01日之后创建的ECS实例,默认预装云助手客户端。更多详情,请参见云助手客户端。
本示例基于云助手API编写Python脚本,能检查并自动修复一个阿里云地域下所有受影响的实例。关于如何安装ECS SDK,请访问阿里云Github仓库安装文档。
参考如下命令,下载相关的Python SDK依赖到本地计算机或者ECS实例中。
pip install aliyun-python-sdk-core
pip install aliyun-python-sdk-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
以下为脚本运行结果示意图。
实例状态检查的详细说明如下。
该方法需要您登录到受影响的实例中,逐一排查问题,因此适用于少量实例的场景。
sudo bash linux_fix_dhclient.sh
注:
- 返回结果为“0”时,脚本已完成检查和修复工作。
- 返回其他状态表明修复失败。
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服务异常,脚本已完成修复工作。
- 返回其他状态表明修复失败。
该方法需要您自行检查和修复检查每张网卡对应的dhclient进程(CentOS实例)或IP地址租约到期时间(Windows实例)。
ls -al /sys/class/net/
命令检查实例的所有网卡。cat /etc/sysconfig/network-scripts/ifcfg-eth0
命令,检查eth0网卡是否使用DHCP分配IP地址。
BOOTPROTO=dhcp
表示网卡使用DHCP分配IP地址。ps aux | grep dhclient | grep eth0
命令检查eth0网卡对应的dhclient进程运行情况。
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
ifup eth0
命令重新启动dhclient。
注:您需要将命令中的eth0替换成网卡实际的标识符。
ipconfig /all系统显示类似如下。
注:Red Hat VirtIO Ethernet Adaptor为ECS实例的主网卡和辅助弹性网卡,您自定义配置的VPN或者LoopBack网卡等不在受影响范围内。此外,未启用DHCP服务的网卡不在受影响范围内。
ipconfig /renew
ipconfig /all
命令返回的租约过期的时间更新为十年之内说明已经完成修复。
如果您的问题仍未解决,您可以在阿里云社区提交工单联系阿里云技术支持。