최근 팀에서 특이한 문제를 경험했다. 서비스 중인 도메인에 대해서 가끔 접속이 가능했다가 안되는 상황이 반복되었다. 해당 원인을 찾은 과정과 해결 방법에 대해 소개한다.
이 문제를 해결하기 위해서 여러가지 방법으로 문제를 확인했다.
예시에서 설명을 위해 접속이 안되는 도메인은 example.com 으로 가정한다.
해당 서버의 IP는 0.0.0.0으로 가정한다.
네트워크 구조가 단순하게 설명하면
Cloudflare -- Load balancer -- Server
구조로 되어 있었다.
서버의 IP로 직접 접근
이 방법은 성공했다. IP 주소를 통해서 직접 접근이 가능한 것은 서버 자체에는 문제가 없다는 것을 의미했다.
로드밸런서로 접근
이 방법역시 성공했다. 로드밸런서를 통해서 접근이 가능했던것은 마찬가지로 로드밸런서 자체에는 문제가 없다는 것을 의미했다.
네임서버로 접근
여기서 문제가 발생했다. 네임서버를 통해서 접근할 수 없다는 것은 DNS에 문제가 있다는 것을 나타냈다.
하지만 네임서버 자체는 정상적으로 작동하고 있었고, example.com에 대해서만 조회가 되었다 안되었다 했었다.
nslookup, dig, ping 을 사용한 네트워크 상태 확인
이 또한 마찬가지로 서버, 로드밸런서, 네임서버 자체에는 문제가 없었으나
해당 "도메인(example.com)"에서만 문제가 발생했다.
모든 원인을 파악해도 원인을 찾을수가 없었다. 일시적으로 통신사쪽 문제라고 결론을 짓고 다음날까지 기다려보아도 문제가 해결되지 않았다.
Whois 조회
위의 검사결과를 바탕으로 원인을 줄여나간 결과, 결과적으로 도메인 자체에 문제가 있을수 있다는 생각이 들었다.
Whois에서 example.com을 조회후 정보를 확인한 결과 해당 도메인이 "clientHold" 상태인것을 확인했다.
clientHold는 도메인이 일시적으로 사용 중지된 상태를 나타내는데, 이는 보통 도메인 소유자가 도메인을 삭제하거나 결제 실패등 다양한 이유로 발생할 수 있었다.
결과
결과적으로는 팀중 한명이 실수로 도메인을 삭제해서 일어난 현상이였다.
그렇다면 어떻게 도메인 접속이 되었다가 안 되었다가 하는 현상이 일어났을까?
이 부분은 DNS의 작동 방식과 관련이 있다.
DNS는 인터넷의 전화번호부와 같다. 사용자가 웹사이트의 도메인 이름을 입력하면, DNS는 이 이름을 해당 웹사이트의 IP 주소로 변환한다. 그런데 이 변환 정보가 저장되는 네임서버에 변경사항이 생기면, 그 정보가 모든 네임서버에 전파되는 데는 시간이 걸린다.
도메인이 삭제되면, 해당 도메인에 대한 정보가 네임서버에서 제거된다. 하지만 이 정보가 모든 네임서버에 즉시 반영되지는 않는다. 따라서, 어떤 네임서버는 아직 도메인 정보를 가지고 있을 수 있고, 어떤 네임서버는 도메인 정보를 이미 제거했을 수 있다.
이런 상황에서 사용자가 웹사이트에 접속하려고 하면, 사용자의 장치(핸드폰, 노트북 등)는 DNS 쿼리를 통해 도메인 이름을 IP 주소로 변환하려고 시도한다. 만약 DNS 쿼리가 도메인 정보를 아직 가지고 있는 네임서버로 전달되면, 웹사이트 접속이 성공적으로 이루어진다. 그러나 도메인 정보를 이미 제거한 네임서버로 전달되면, 웹사이트 접속이 실패하게 된다.
이렇게 해서, 도메인 삭제 후 도메인 접속이 되었다 안 되었다하는 현상이 발생하게 된 것이다.
이렇게 팀에서 도메인 문제를 찾아내고 해결할 수 있었다.
'Error' 카테고리의 다른 글
[Elasticsearch] Elasticsearch에서 발생한 데이터 타입 변경 문제와 해결 (0) | 2023.05.23 |
---|---|
[Error] slack error: web-api:WebClient:0 http request failed An HTTP protocol error occurred: statusCode = 408 (0) | 2023.01.12 |
[Git] fatal: unable to auto-detect email address (0) | 2022.11.09 |
[Error] permission denied 0.0.0.0:80 (0) | 2022.07.10 |
[Error] AxiosError: connect ECONNREFUSED 127.0.0.1:80 (0) | 2022.06.18 |