AWS lightsail 服务器上的 DHCP 租约续订失败

AWS lightsail 服务器上的 DHCP 租约续订失败

2021 年 9 月 12 日星期二,我的运行在 AWS Lightsail 中托管的 Debian 的根服务器突然崩溃了。重新启动后,它会正常运行大约 20-60 分钟,之后又会崩溃。事实证明,服务器仍在运行,但失去了所有网络连接。由于 AWS Lightsail 没有串行控制台,并且仅支持 SSH 进行服务器管理,这意味着在崩溃后重新获得访问权限的唯一方法是重新启动。

对系统日志和其他日志的分析没有揭示任何相关线索。最近几天也没有安装/删除相关软件包。

因为我过去在该服务器上已经遇到过 dhcp 问题,所以我怀疑该问题可能与 dhcp 租约续订有关。所以我确实使用 dhclient 运行了一些诊断,结果发现 dhcp 确实是导致服务器崩溃的问题。 AWS dhcp 服务器提供非常短的租约时间,约为 20-60 分钟,一旦租约到期,服务器将失去所有网络。

我能够通过dhclient -d无限循环运行来创建解决方法:

#!/bin/bash
while true; do
    bash -c 'dhclient -d 2>&1 | tee -a /var/log/dhclient.log' &
    sleep 60
    kill $(jobs -p) 2>/dev/null || true
    kill -9 $(jobs -p) 2>/dev/null || true
done

我只是在屏幕会话中运行该脚本并让它运行。这成功地防止了服务器崩溃。然而,这只是一个肮脏的解决方法,这个问题的真正原因仍然没有找到。

答案1

好吧,事实证明该问题与 IPv6 有关。

问题是网络服务无法正常运行。网络服务是一个一次性脚本,应该在启动后配置网络。

systemctl status networking显示以下内容:

Oct 16 11:01:32 ip-172-26-9-21 dhclient[573]: DHCPACK of 172.26.9.21 from 172.26.0.1
Oct 16 11:01:32 ip-172-26-9-21 ifup[366]: RTNETLINK answers: File exists
Oct 16 11:01:32 ip-172-26-9-21 dhclient[573]: bound to 172.26.9.21 -- renewal in 1374 seconds.
Oct 16 11:01:32 ip-172-26-9-21 ifup[366]: bound to 172.26.9.21 -- renewal in 1374 seconds.
Oct 16 11:01:38 ip-172-26-9-21 ifup[366]: Could not get a link-local address
Oct 16 11:01:38 ip-172-26-9-21 ifup[366]: run-parts: /etc/network/if-pre-up.d/cloud_inet6 exited with return code 1
Oct 16 11:01:38 ip-172-26-9-21 ifup[366]: ifup: failed to bring up eth0
Oct 16 11:01:38 ip-172-26-9-21 systemd[1]: networking.service: Main process exited, code=exited, status=1/FAILURE
Oct 16 11:01:38 ip-172-26-9-21 systemd[1]: networking.service: Failed with result 'exit-code'.
Oct 16 11:01:38 ip-172-26-9-21 systemd[1]: Failed to start Raise network interfaces.

正如输出所示/etc/network/if-pre-up.d/cloud_inet6,本应通过 dhcp 设置 ipv6 的脚本未能正常运行。

我在 aws Lightsail 控制台和 debian 中禁用了 IPv6 支持:

echo 'net.ipv6.conf.all.disable_ipv6 = 1' > /etc/sysctl.d/70-disable-ipv6.conf
sysctl -p -f /etc/sysctl.d/70-disable-ipv6.conf

由于我不需要 IPv6 支持,因此我通过从以下位置删除 ipv6 can init 脚本来禁用它/etc/network/if-pre-up.d/

mv /etc/network/if-pre-up.d/cloud_inet6 ~/

重新启动服务器后,网络服务现在运行良好并且服务器不再崩溃。

我仍然很困惑为什么这突然成为一个问题。据我所知,云初始化脚本自四月份以来就已经存在了。我只能假设,因为 IPv6 支持相当不错新的在 AWS Lightsail 中,该问题是由 AWS 基础设施中的某些变化引发的。

Launchpad 中 cloud-init 的这个问题似乎记录了同样的问题:https://bugs.launchpad.net/cloud-init/+bug/1863773

答案2

就在最近,我在另一台服务器上遇到了非常类似的问题。这次又是一个强硬的主持人。在 dhcp 版本耗尽后,服务器将失去连接,就像在 AWS 服务器上一样。并且网络服务也处于失败状态。原因也和ipv6有关。

在日志文件中,出现错误消息“RTNETLINK 应答:文件存在”,显然在尝试设置 ipv6 地址后网络失败。

为了解决这个问题,我必须编辑 /etc/network/interfaces 文件。我替换的地方:

post-up ip -6 route add fe80::1 dev eth0
post-up ip -6 route add default via fe80::1 dev eth0
post-down ip -6 route del default via fe80::1 dev eth0
post-down ip -6 route del fe80::1 dev eth0
iface eth0 inet6 static
        address XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX
        netmask 64

和:

iface eth0 inet6 static
        address XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX
        netmask 64
        post-up sleep 5; ip -6 route add fe80::1 dev eth0
        post-up sleep 5; ip -6 route add default via fe80::1 dev eth0
        post-down sleep 5; ip -6 route del default via fe80::1 dev eth0
        post-down sleep 5; ip -6 route del fe80::1 dev eth0

添加 sleep 5 似乎就成功了。

相关内容