"사이트에 연결할 수 없음"?! NXDOMAIN 오류의 원인 역추적해보기

 

사이트에 연결할 수 없음 (DNS_PROBE_FINISIHED_NXDOMAIN)

최근에 하나의 애플리케이션 서버를 구축하고 배포한 뒤 당당하게 도메인으로 접속했는데 아래 화면을 만난 적이 있다. 해당 화면은 잘못된 사이트에 접속하면 쉽게 만나볼 수 있는 화면이다.

이미지 오류 아니다. 내가 집어넣은 이미지다...

그렇다면 이 화면이 보여지는 이유는 뭘까? 하단의 오류명이 DNS로 시작하는 것을 보아하니, DNS와 관련이 있어 보인다.

그래서 우선은, 브라우저의 URL 입력창에 접근하고자 하는 URL을 입력했을 때 무슨 일이 일어나는지를 먼저 되짚어봤다.

  1. 브라우저는 먼저 URL을 분석하여 URL로부터 도메인을 추출한다.
    (https://admin.devpanpan.comadmin.devpanpan.com)
  2. 도메인으로부터 IP 주소를 얻어내기 위해 DNS 서버에 질의(query)한다.
  3. DNS 서버로부터 획득한 IP 주소를 가진 서버에 요청을 보내고 응답을 받아와 화면에 출력한다.

3번 과정도 더 세세하게 풀어쓸 수 있겠으나, 우선 해당 글에서 집중할 부분은 2번 과정이기 때문에 간략히 서술한다.

위의 오류 화면은 2번 과정에서 DNS 서버가 해당 도메인 이름으로부터 IP 주소를 획득하지 못한 경우에 보여지는 화면이다.

그렇기 때문에 실제로 nslookup 명령을 통해 해당 도메인에 대한 IP 주소를 질의해보면 아래와 같은 응답이 온다.

{DNS server} can't find admin.devpanpan.com: Non-existent domain

 

그렇다면 여기서 원인을 2가지로 좁힐 수 있다.

  1. 서버는 정상 동작 중이나, DNS 서버가 도메인 → IP주소 획득에 실패
  2. 해당 IP 주소를 가진 서버가 DNS 쿼리에 응답할 수 없는 상태 (웹서버 자체의 문제)

즉, 도메인-IP간 변환에서의 문제인지 서버 자체의 문제인지를 파악해보아야 한다는 것이다. 그 방법은 간단하다. 서버가 부여받은 public IP로 서버에 접근해보는 것이다. 나의 경우 public IP로 사이트에 접속했을 때에는 정상적인 서비스 화면을 볼 수 있었고, 따라서 서버 자체의 문제는 아니라고 판단했다.

 

그렇다면 DNS 서버에 도메인에 대한 IP 주소가 등록되어 있지 않다는 것을 의미하는데, 여기서 또 다시 원인을 3가지로 좁힐 수 있다.

  1. 도메인-IP 매핑 정보를 등록하지 않았다.
  2. 등록한지 얼마 되지 않아 아직 네임 서버에 매핑 정보가 저장되지 않았다.
  3. 네임 서버에 문제가 있다. (매핑 정보가 저장되지 않은 네임서버를 사용하고 있거나, 네임서버에 잘못된 캐시 데이터가 존재하거나 등등)

즉 매핑 정보를 아예 등록하지 않았거나, 아직 등록이 안 됐거나, 그것도 아니라면 사용하고 있는 네임 서버에 문제가 있거나이다. (이외에도 네트워크 문제나 방화벽/VPN에 의한 차단 문제 등이 있겠으나 이는 원인이 아님을 쉽게 파악할 수 있으므로 생략한다.)

 

위 3가지 중 어떤 것이 원인인지 확인하는 방법은 아래와 같다.

  1. 도메인-IP 매핑 정보를 등록하지 않았다.
    사용하고 있는 클라우드 프로바이더를 통해 확인할 수 있다.
  2. 등록한지 얼마 되지 않아 아직 네임 서버에 매핑 정보가 저장되지 않았다.
    이론적으로는 하루 이상 걸릴 수도 있다고 하지만 통상적으로는 2시간 이내로 완료되는 것 같다. 만약 도메인을 등록한지 몇 분밖에 지나지 않았다면 적용까지는 좀 더 기다려보도록 하자. 도메인 구매 후 도메인을 네임서버에 등록했을 때 이것이 다른 DNS에도 전파되는 데까지 어느 정도 시간이 걸리기 때문이다. (캐싱 등의 이유)
  3. 네임 서버에 문제가 있다.
    도메인이 정상 등록되었으나 브라우저가 질의하는 네임 서버에 문제가 있는 경우인지를 확인하는 방법은, 사용 중인 네임서버를 확인하고 다른 네임서버에 DNS 질의를 날려보는 것이다.
    예를 들어, Google 네임서버(8.8.8.8)를 타겟으로 DNS 질의를 하는 방법은 아래와 같다.
$ nslookup admin.devpanpan.com 8.8.8.8 ***
dns.google can't find admin.devpanpan.com: Non-existent domain Server: dns.google Address: 8.8.8.8

 

결론적으로 내 사이트가 정상 동작하지 않았던 이유는 3가지 문제 중 1번 문제에 해당했는데, 헷갈렸던 개념이 있어 원인 파악이 늦었다. 아래에서는 놓쳤던 개념에 대해 이야기해보고자 한다.

 

 

서브 도메인도 별도 매핑을 지정해주어야 한다.

나는 devpanpan.com 에 대한 도메인을 등록해두었기 때문에, HTTPS 인증서 관리의 비용 절감 및 관리 편의성을 위해 서브 도메인인 admin.devpanpan.com 을 위한 별도 인증서를 발급하고 싶지 않았다. 대신 서브 도메인으로의 접근을 루트 도메인에서 받고, 로드 밸런서 동작 시점에 서브 도메인으로의 요청을 특정 서버로 전달하도록 동작하는 것을 의도하고 있었다.

그래서 서브 도메인을 포함하여 *.devpanpan.com 도 인증서의 적용 범위로 지정했으나, 서브 도메인을 위한 매핑 설정을 빼먹은 것이다.

하지만 서브 도메인의 경우에도 도메인 구매가 필요 없을 뿐 당연히 레코드 등록은 필요하다. 위와 같은 운영 방식을 채택하고자 하는 경우에는 admin.devpanpan.com 경로에 대한 CNAME 레코드를 등록해 해당 경로로 접근했을 때 devpanpan.com에 연결된 로드밸런서로 요청이 전달될 수 있도록 하는 매핑이 필요하다.

 

 

마치며

DNS에 대해서 단순히 도메인 네임 시스템, 도메인을 IP 주소로 변환해주는 시스템이라는 정도만 알고 있어도 개발을 하는 데에는 큰 불편함이 없으나 도메인과 관련된 문제가 생겼을 때에는 해결에 어려움을 겪을 수 있다.

도메인으로부터 IP를 획득하기 위해 네임 서버를 탐색하는 방식, 주요 네임 서버들, DNS의 다양한 레코드, DNS 쿼리의 동작 방식과 이에 적용되는 캐싱 등 DNS에 대한 지식은 무궁무진하게 확장해나갈 수 있다.

해당 문제의 발견이 늦었던 이유는, 서브 도메인과 CNAME 레코드에 대한 이해의 부족 때문이었다. 다시 한 번 빠르고 정확한 원인 파악 및 해결을 위해서는 기반 지식이 중요함을 실감하며 글을 마친다.