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 ~/
サーバーを再起動した後、ネットワークサービスが正常に実行され、サーバーがクラッシュしなくなりました。
これがなぜ突然問題になったのか、まだ混乱しています。私が知る限り、cloud initスクリプトは4月から使用されました。 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
睡眠5を追加すると効果があるようです。