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를 추가하면 효과가 있는 것 같습니다.