如何对 Amazon EC2 Linux 实例上的操作系统级网络配置问题进行故障排除?
我的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例由于操作系统 (OS) 中的网络配置问题未通过其状态检查。
简短描述
如果您的 EC2 实例未通过其实例状态检查,请检查系统日志中是否有登录提示以确认该实例已成功启动。如果实例已启动,则说明实例未通过其状态检查是由于网络配置问题所致。
要解决您的问题,请连接到您的实例,然后更新您的网络配置。
解决方法
连接到您的实例
使用 EC2 Serial Console 直接连接到您的实例。如果您无法使用 EC2 Serial Console,则连接到救援实例以手动编辑实例配置文件。有关如何使用救援实例的说明,请参阅为什么在尝试启动 EC2 Linux 实例时,它会进入紧急模式?中的使用救援实例手动编辑文件部分
注意: 如果您使用 Serial Console 连接到您的实例,请在更新网络配置后,重启您的实例以应用更改。
检查 cloud-init 安装
网络故障可能是因为您未安装 cloud-init 软件包,或者您在启动时使用 cloud-init 软件包更新了网络配置。
要解决此问题,请完成以下步骤,在您的实例上安装 cloud-init 软件包:
- 如果您使用 Serial Console 进行连接,请继续执行步骤 2。如果您使用救援实例方法,则运行以下命令来创建 chroot 环境:
上述命令从原始根文件系统中绑定挂载 /dev、/proc、/sys 和 /run 目录。此配置允许在 chroot 环境中运行的进程访问这些系统目录。for i in dev proc sys run; do mount -o bind /$i /mnt/$i; done; chroot /mnt - 要安装 cloud-init 软件包,请根据您的 Linux 发行版运行以下命令。
Amazon Linux 2 (AL2)、Amazon Linux 2023 (AL2023) 或 Red Hat Enterprise Linux (RHEL):
Ubuntu 或 Debian:sudo yum install cloud-init -ysudo apt install cloud-init -y
检查硬编码的 MAC 地址
udev 配置文件中硬编码的 MAC 地址会导致网络问题。如果存在硬编码的 MAC 地址,则无法加载弹性网络接口,因为 MAC 地址与实例的硬件地址不匹配。
系统日志的以下输出示例显示 eth0 接口已关闭,状态为 False:
[ 7.098826] cloud-init[963]: ci-info: ++++++++++++++++++++++++++++++++++++++Net device info+++++++++++++++++++++++++++++++++++++++ [ 7.101136] cloud-init[963]: ci-info: +--------+------+-----------------------------+---------------+--------+-------------------+ [ 7.103157] cloud-init[963]: ci-info: | Device | Up | Address | Mask | Scope | Hw-Address | [ 7.105264] cloud-init[963]: ci-info: +--------+------+-----------------------------+---------------+--------+-------------------+ [ 7.107320] cloud-init[963]: ci-info: | eth0 | False| 172.31.21.19 | 255.255.240.0 | global | 0a:ff:c3:d1:93:6f | [ 7.111401] cloud-init[963]: ci-info: | lo | True | 127.0.0.1 | 255.0.0.0 | host | . | [ 7.115529] cloud-init[963]: ci-info: +--------+------+-----------------------------+---------------+--------+-------------------+
要移除硬编码的 MAC 地址,请完成以下步骤:
-
检查以下文件位置是否存在硬编码的 MAC 地址:
/etc/udev/rules.d/
/etc/udev/rules.d/70-persistent-net.rules
/etc/udev/rules.d/80-net-name-slot.rules
上述文件可能会使用 ATTR{address}=="MAC_ADDRESS" 指令来指定永久的 MAC 地址。 -
从配置文件中移除条目,或运行以下命令来移除配置文件:
sudo mv /etc/udev/rules.d/70-persistent-net.rules /etc/udev/rules.d/70-persistent-net.rules.disabled -
如果您使用救援实例方法,请继续执行步骤 4。如果您使用 Serial Console 连接到您的实例,则必须重启网络服务。根据您的 Linux 发行版运行以下命令。
Ubuntu、Debian 和 AL2023:sudo systemctl restart systemd-networkdRHEL:
sudo systemctl restart NetworkManager使用 netplan 的系统:
sudo netplan apply -
如果您使用救援实例方法,则将 Amazon Elastic Block Store (Amazon EBS) 卷与救援实例分离。然后,将该卷附加回原始实例。要接收新的 MAC 地址,请启动原始实例。
检查硬编码的 IP 地址
从具有静态 IP 地址配置的实例创建的亚马逊机器映像 (AMI) 会继承其网络配置文件中硬编码的 IP 地址。如果您从这些 AMI 启动实例,则实例不会通过动态主机配置协议 (DHCP) 请求 IP 地址。相反,实例会使用硬编码的 IP 地址。此配置会导致网络连接故障。要解决此问题,请确保在创建 AMI 之前,已将所有网络接口配置为使用 DHCP。
注意: 您无法更新已存在的 AMI。在创建新的 AMI 之前,您必须将网络接口设置为使用 DHCP。
检查您的配置
对于 Amazon Linux 或 RHEL,请使用以下配置:
- 确保网络配置文件包含以下值:
BOOTPROTO=dhcp
PEERDNS=yes
PERSISTENT_DHCLIENT=yes - 从文件中移除以下行:
IPADDR
NETMASK
GATEWAY
DNS
配置示例:
cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes TYPE=Ethernet USERCTL=yes PEERDNS=yes DHCPV6C=yes DHCPV6C_OPTIONS=-nw PERSISTENT_DHCLIENT=yes RES_OPTIONS="timeout:2 attempts:5"
对于 Ubuntu 或 Debian,请确保 netplan 配置包含 dhcp4: true。
配置示例:
cat /etc/netplan/50-cloud-init.yaml network: version: 2 ethernets: ens5: match: macaddress: "0a:ff:d3:15:30:9d" dhcp4: true dhcp6: false set-name: "ens5"
注意: netplan 配置中的 macaddress 字段与 udev 中导致网络故障的硬编码 MAC 规则不同。Amazon EC2 仅使用 macaddress 值来匹配配置的网络接口。dchp4:true 行允许 Amazon EC2 为实例动态分配 IP 地址。
重启网络服务
根据您的 Linux 发行版运行以下命令以重新启动网络服务。
Ubuntu、Debian 或 AL2023:
sudo systemctl restart systemd-networkd
RHEL:
sudo systemctl restart NetworkManager
使用 netplan 的系统:
sudo netplan apply
验证主网络接口在启动时是否正常启动
如果网络接口在启动时未能启动,您会收到 "interface eth0: failed" 错误消息。要解决此问题,请验证接口配置文件中的 ONBOOT 是否设置为 yes。
运行以下命令以打开接口配置文件:
cat /etc/sysconfig/network-scripts/ifcfg-eth0
确保该文件包含以下值:
ONBOOT=yes
解决网络接口命名冲突
如果配置文件中的网络接口名称与实例上的网络接口不匹配,您会收到以下错误消息:
"[FAILED] Failed to start LSB: Bring up/down networking"
存在重复的接口配置文件时(例如 ifcfg-eth0 和 ifcfg-ens5),通常会发生此问题。
要解决此问题,请移除实例上不存在的接口的配置文件。通常保留最新的文件即可。例如,如果您的实例使用可预测的命名规范(如 ens5),则可以保留 ifcfg-ens5 并移除 ifcfg-eth0。或者,检查 cloud-init 以识别正确的接口名称。
检查网络接口是否在启动时被自动重命名
如果您启用网络接口命名,则接口名称会从 eth0 和 eth1 等格式更改为 ens5 和 enp0s3。名称更改可能会导致引用原始名称的脚本、防火墙规则和配置出现问题。实例重启后,命名顺序也可能发生更改。
要停用可预测的网络接口命名,请完成以下步骤:
-
要在 /mnt 目录中创建 chroot 环境,请运行以下命令:
for i in dev proc sys run; do mount -o bind /$i /mnt/$i; done; chroot /mnt上述命令从原始根文件系统中绑定挂载 /dev、/proc、/sys 和 /run 目录。此配置允许在 chroot 环境中运行的进程访问这些系统目录。
-
将 net.ifnames=0 内核参数添加到 /etc/default/grub 文件的 GRUB_CMDLINE_LINUX 行中。
配置示例:GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8 net.ifnames=0" -
要重建 GRUB 配置,请根据您的 Linux 发行版运行以下命令。
Amazon Linux 或 RHEL:sudo grub2-mkconfig -o /boot/grub2/grub.cfgUbuntu 或 Debian:
sudo update-grub
检查您的增强联网和增强型网络驱动程序配置
测试您是否在实例上启用了增强联网功能。如果您未启用,则启用增强联网功能。
要检查您是否已安装 ENA 驱动程序,请运行以下命令:
sudo modinfo ena |grep -i '^version:' || echo "ENA module not available, try modprobe ena"
如果您并未安装 ENA 驱动程序,请安装最新的驱动程序。有关说明,请参阅 GitHub 网站上的 Linux kernel driver for ENA family(用于 ENA 系列的 Linux 内核驱动程序)。
