DNS(Domain Name System) 동작 방식
DNS 동작 원리와 WireShark를 통한 실습

DNS 동작 방식
DNS(Domain Name System)는 사용자가 기억하기 쉬운 도메인 이름(예: google.com)을 컴퓨터가 인식할 수 있는 IP 주소(예: 172.217.31.174)로 변환하는 시스템입니다. DNS 쿼리가 처리되는 과정은 다음과 같습니다.
DNS 쿼리 프로세스
- 사용자가 브라우저에 도메인 이름을 입력하면, 운영체제는 먼저 로컬 캐시를 확인합니다.
- 로컬 캐시에 정보가 없으면, 설정된 로컬 DNS 서버(일반적으로 ISP가 제공)에 쿼리를 보냅니다.
- 로컬 DNS 서버는 자체 캐시를 확인하고, 없으면 Root DNS 서버에 쿼리를 시작합니다.
- Root DNS는 적절한 TLD 서버(예: .com, .net, .kr 등)를 안내합니다.
- TLD 서버는 해당 도메인의 Authoritative DNS 서버 정보를 제공합니다.
- Authoritative DNS 서버에서 최종적으로 도메인에 대한 IP 주소 정보를 반환합니다.
- 이 정보는 로컬 DNS 서버에 캐싱되고, 사용자는 받은 IP 주소를 통해 웹사이트에 접속합니다.
> DNS 쿼리의 동작 방식
이 과정에서 DNS는 재귀적(Recursive)와 반복적(Iterative) 두 가지 쿼리 방식을 사용하며, Root DNS에서 시작해 TLD(Top-Level Domain)를 거쳐 최종적으로 Authoritative DNS 서버까지 계층적으로 질의합니다.
재귀적 쿼리 (Recursive Query)
음식점에서 직원에게 “피자가 어디 있나요?”라고 물었을 때, 직원이 직접 주방에 가서 피자를 찾아 가져다 주는 것과 같습니다.
> 재귀적 쿼리 (Recursive Query)
호스트가 DNS 서버에 “google.com의 IP는?”이라고 물으면, DNS 서버가 다른 네임 서버들을 모두 직접 찾아다니며 최종 IP 주소를 찾아서 알려줍니다.
DNS 서버가 모든 일을 대신 해주고, 한 번의 요청으로 완전한 답을 받습니다.
반복적 쿼리 (Iterative Query)
음식점에서 직원에게 “피자가 어디 있나요?”라고 물었을 때, 직원이 “주방에 있을 거예요”라고만 알려주고, 다시 직접 주방에 가서 또 물어봐야 하는 것과 같습니다.
> 반복적 쿼리 (Iterative Query)
DNS 서버에 물으면 “이 서버에 물어보세요”라는 안내만 받습니다. 그 서버에 또 물어보면 다시 다른 서버를 안내받고… 이런 식으로 직접 여러 서버를 찾아다녀야 합니다.
클라이언트가 여러 서버에 직접 물어봐야 하며, 여러 번의 요청을 통해 단계적으로 정보를 얻습니다.
각 쿼리의 실제 사용
간단히 요약하면, 재귀적 쿼리는 “모든 일을 대신 해주세요”, 반복적 쿼리는 “다음에 어디로 가야 하는지만 알려주세요”라고 요청하는 방식의 차이입니다.
일반 사용자의 컴퓨터는 주로 재귀적 쿼리를 사용합니다. 편리하니까요. 반면, DNS 서버들끼리는 주로 반복적 쿼리를 사용합니다. 서버 부하를 분산하기 위해서 입니다.
hosts 파일: 로컬 DNS 실습
DNS의 개념을 실습을 통해 실제로 확인하고 학습해보겠습니다. Docker와 Linux/Mac 기반으로 실습을 진행하겠습니다. Windows는 WSL을 사용하여 실습을 진행해보세요!
Nginx 웹 서버
도커 컨테이너로 먼저 Nginx 웹 서버를 도커 컨테이너로 실행하겠습니다.
$ docker run -d --rm -p 8080:80 --name my-website nginx
로컬 DNS 환경 구성
로컬 환경에서 DNS 동작을 테스트하기 위해 /etc/hosts
파일을 수정해보겠습니다. /etc/hosts
파일을 수정하여 특정 도메인을 지정된 IP로 직접 매핑할 수 있습니다.
$ sudo vim /etc/hosts
127.0.0.1 my-website
Windows의 경우에는 아래에 경로의 파일을 관리자 권한의 PowerShell로 열어서 수정하시면 됩니다.
> notepad C:\\Windows\\System32\\drivers\\etc\\hosts
127.0.0.1 my-website
브라우저로 확인
my-website
라는 도메인 네임으로 접속을 시도해보겠습니다. 운영체제에서 DNS 로컬 캐시를 확인하면서, 수정한 hosts 파일을 읽어서 NGINX 서버로 접속할 수 있는 것을 확인할 수 있습니다.
http://my-website:8080
WireShark : DNS 쿼리 실습
와이어샤크(WireShark)를 통해서 DNS 쿼리 조회 과정을 실습해보면서, DNS 동작 방식을 좀더 자세히 알아보겠습니다.
WireShark
와이어샤크(WireShark)는 오픈 소스 네트워크 패킷 분석기로, 네트워크 트래픽을 캡처하고 실시간으로 분석할 수 있는 강력한 도구입니다. 다양한 프로토콜을 지원하며 네트워크 문제 해결, 보안 분석, 프로토콜 동작 이해에 널리 사용됩니다.
WireShark 설치
Download Wireshark 페이지를 참고해서 운영체제에 알맞게 설치합니다.
WireShark 필터링
캡처할 대상 NIC(Network Interface Card)를 지정합니다. 저같은 경우는 WI-FI
를 선택했습니다. 그리고 DNS 패킷만 관찰하기 위해서 WireShark에 필터링을 아래와 같이 지정하겠습니다.
udp.port==53
> DNS를 관찰하기 위해서 UDP 53 포트를 필터링
dig +trace
dig +trace
명령어는 전체 DNS 조회 과정을 보여줍니다. DNS 조회 과정이 처음부터 일어나기 때문에, WireShark를 통해 전체 DNS 쿼리의 패킷을 확인 할 수 있습니다.
$ dig +trace google.com
- 루트 DNS 서버에 쿼리
- .com TLD 서버에 쿼리
- google.com의 권한 있는 네임서버에 쿼리
- 최종적으로 google.com의 IP 주소 획득
패킷을 복사해서 AI에게 분석을 맡겨서 하나씩 패킷을 분석해 보시는 것을 추천합니다.
> DNS 패킷을 복사해서 AI의 도움을 받자!
마무리
이번 포스트에서는 DNS의 기본 개념부터 작동 방식, 그리고 실제 환경에서의 동작을 실습을 통해 살펴보았습니다.
- 로컬 DNS 캐시부터 시작해 Root, TLD, Authoritative DNS 서버까지 계층적으로 조회
- DNS 쿼리는 재귀적 방식 / 반복적 방식
- hosts 파일을 통해 로컬 DNS 캐시를 추가 가능
- WiresShark와
dig +trace
를 통해 실제 DNS 쿼리 패킷을 분석