AWS Linux EC2实例主网卡残留已移除辅助IP问题求助
我之前维护老版本Amazon Linux 2的EC2实例时也碰到过类似的主网卡IP残留问题,给你几个逐步排查的解决方案,从简单到深入:
1. 手动删除残留IP并重启网络
首先先确认系统里残留的IP是什么:
ip addr show eth0 # 替换成你的主网卡名,eth0是默认主网卡
找到那个已经在AWS控制台移除的IP,然后手动删除它:
ip addr del <残留IP>/<子网掩码> dev eth0 # 示例:ip addr del 10.0.0.15/24 dev eth0
之后重启网络服务,根据你的系统用的服务类型选一个:
# 如果用的是传统network服务 systemctl restart network # 如果用的是NetworkManager systemctl restart NetworkManager
再用ip addr show eth0确认IP是否已经消失。
2. 检查并清理本地网络配置文件
老版本的Amazon Linux 2可能会把多IP配置写入静态文件,即使AWS端改了,本地文件没更新就会残留。
打开主网卡的配置文件:
vi /etc/sysconfig/network-scripts/ifcfg-eth0
看看里面有没有带数字后缀的IP配置项,比如IPADDR_8、PREFIX_8(对应第8个IP),把这些和残留IP对应的条目删掉。同时也检查同目录下的route-eth0等相关文件,确保没有残留配置。
修改后可以重启网络服务,或者用下面的命令重启网卡(注意:远程操作的话,ifdown会断开连接,建议在AWS控制台的会话管理器里操作):
ifdown eth0 && ifup eth0
3. 刷新EC2元数据缓存
EC2实例会从元数据服务获取网络配置,有时候缓存会导致不同步。可以尝试清理缓存并重新拉取:
首先停止网络服务:
systemctl stop network
然后清理云初始化的缓存文件:
rm -rf /var/lib/cloud/data/instance-id rm -rf /var/lib/cloud/instances/*
最后重启网络服务:
systemctl start network
你也可以手动对比元数据里的IP和本地的IP,确认元数据是否已经更新:
# 先获取主网卡的MAC地址 ip link show eth0 | awk '/ether/ {print $2}' # 用MAC地址获取元数据里的IP列表 curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/<MAC地址>/local-ipv4s
如果元数据里已经是7个IP,那本地缓存就是问题所在,上面的清理操作应该能解决。
4. 尝试冷重启实例
如果上面的方法都没用,软重启(systemctl reboot)可能不够彻底,建议从AWS控制台停止实例,然后再启动(不是重启)。冷重启会彻底重置实例的网络栈,清除底层的网络缓存,但要注意提前备份实例上的重要数据,并且会中断服务一段时间。
5. 排查自定义脚本或规则残留
如果之前有添加过自定义的启动脚本(比如/etc/rc.d/rc.local或者其他定时任务),里面可能有自动添加IP的命令,检查这些脚本里有没有对应残留IP的条目,删掉后重启实例试试。另外也可以检查防火墙规则(iptables/firewalld)里有没有相关配置,不过一般这不会影响IP的识别,但也可以排除一下。
内容的提问来源于stack exchange,提问作者Legogris

