问题描述
在连续使用阿里云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实例的命令返回结果。
[INFO] [2019-04-28 11:13:00] start check and fix [INFO] [2019-04-28 11:13:00] log file /tmp/dhcp_fix_20190428-11:13:00.log [INFO] [2019-04-28 11:13:00] start checking eth0 [INFO] [2019-04-28 11:13:00] eth0 state is up [INFO] [2019-04-28 11:13:00] ip a show dev eth0 [INFO] [2019-04-28 11:13:00] eth0 valid_lft 315359644 [INFO] [2019-04-28 11:13:00] no need fix, dhclient eth0 is running [1;32;40m[SUCCESS] [0m [2019-04-28 11:13:00] check and fix success [1;32;40m[SUCCESS] [0m [2019-04-28 11:13:00] return code: 0 [1;33;40m[WARN] [0m [2019-04-28 11:14:17] need fixing eth0 [INFO] [2019-04-28 11:14:17] start fixing eth0 [INFO] [2019-04-28 11:14:17] ip a show dev eth0 [INFO] [2019-04-28 11:14:17] ifup eth0 RTNETLINK answers: File exists [INFO] [2019-04-28 11:14:19] ip a show dev eth0 [INFO] [2019-04-28 11:14:19] ok, dhclient eth0 is running now [1;32;40m[SUCCESS] [0m [2019-04-28 11:14:19] check and fix success [1;32;40m[SUCCESS] [0m [2019-04-28 11:14:19] return code: 0 No ip will expire in recent 500 days. Then no need fix. Nic info: \\E2ETesthxxx...xxxterConfiguration.Index=3 Found one ip will expire in 500 days. We need fixing it!!! Fix it now... Nic info: \\E2ETesthxxx...xxxpterConfiguration.Index=3 fix success. ]]]]]]]]]]
方法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,取值请参见地域与可用区。
-
执行结果
以下内容为脚本运行结果示意图。
Performing the scan and this will take some time, please wait...
Scan done.
Instance Status details:
+----------------------------+----------------+---------------+---------------+
| InstanceID | Cloud Assistant| NeedFix | FixResult |
+----------------------------+----------------+---------------+---------------+
| i-uf639pxxxye4ldb | Installed | No | NoChange |
+----------------------------+----------------+---------------+---------------+
| i-uf69mdxxxk6sahw | Installed | Yes | Success |
+----------------------------+----------------+---------------+---------------+
Summary:
================================
Total instances scanned: 2
Fixed: 1
Unknown: 0
Failed: 0
实例状态检查的详细说明如下。
-
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。[root@xxx ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes [root@xxx ~]# grep 'BOOTPROTO=dhcp' /etc/sysconfig/network-scripts/ifcfg-eth0 BOOTPROTO=dhcp -
执行以下命令,检查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命令,确认返回的租约过期的时间为十年之内,表示完成修复。
适用于
-
云服务器ECS