DNS를 이해하고 간단하게 dig를 사용해보자
728x90
반응형

내 머리는 한번 공부한다고 기억하거나 제대로 이해하는 법이 없다. 지금도 그렇다. DNS 이슈로 난처한 경험을 해보고 나서야 복습을 해본다.

 

IP, TCP, UDP

DNS를 이해하기 전에 먼저 알아야 할 개념이 있다. 바로 IP(Internet Protocol Address). 인터넷 통신규약 혹은 이 규약을 바탕으로 만들어진 주소를 IP라고 지칭한다. 그럼 이 IP는 어떤 용도로 쓰일까? 아래 이미지처럼 숫자를 통해 주소를 표현할 수 있다. IP 사이에는 패킷이 전달되는데 패킷은 흔히 이야기하는 데이터 혹은 정보로 이해하면 된다. 

 

IP가 특별한 동시에 한계점을 가지는 것이 바로 비연결성과 비신뢰성이다.

  • 비연결성
    • 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷이 전송된다.
    • 클라이언트는 서버의 상태를 알 수 없기 때문에 일단 발송(정보요청)을 무조건 할 수 밖에 없다
  • 비신뢰성
    • 중간에 패킷이 사라지는 문제 / 패킷이 순서대로 오지 않는 문제
    • 하나의 요청에 여러개의 패킷이 전송될 수 있다. 이때 네트워크의 노드를 거치면서 패킷이 소멸될 수 있다.
    • 또한 여러개의 패킷을 동시에 전송했어도 용량등의 원인으로 서버에 도착하는 시점이 다를 수 있다.

 

위의 한계점을 해결하고자 나타난 개념이 TCP(Transmission Control Protocol)이다. 위 한계점 중 비연결성을 해결한 개념이다. TCP에서는 3-way handshake 방식으로 연결을 확인할 수 있다. 아래 이미지의 1번처럼 SYN(연결)을 확인하고, 인증(ACK)을 요청한 쪽으로 전달합니다. 다시 클라이언트가 ACK를 보내면 데이터 전송 준비가 된 것이다. 이 방식으로 데이터 전달이 보증되고 순서도 보장할 수 있다.

 

UDP(User Datagram Protocol)라는 개념도 있다. 연결지향, 데이터 전달 보증, 순서 보장등이 불가능하다. 그 대신 단순하고 빠르다. TCP처럼 3-way 방식을 취하고 있지 않아서 error가 발생하면 다시 요청을 보내는 방식을 취한다.

 

PORT는 하나의 IP에서 서로 다른 애플리케이션을 구분하기 위해 사용되는 개념이다. 하나의 게임 서버라도 실제 게임을 동작하기 위한 통신과 채팅을 위한 통신, 플레이어 매칭을 하기 위한 통신, 회원가입을 위한 통신 등등 여러개의 애플리케이션 혹은 서비스가 제공해야 할 수 있다. 그럴 때 PORT를 통해 구분하여 개별 서비스를 이용할 수 있다. 참고로 모든 PORT를 사용할 수 있는 것은 아니다. 1023 이하의 PORT 중 일부는 이미 역할이 정해져 있다. 아래를 참고하자.

0~1023 : 잘 알려진 포트 , 사용하지 않는 것이 좋음
  - FTP : 20, 21
  - TELNET : 23
  - HTTP : 80
  - HTTPS : 443
1024~ 65535 할당 가능

 

 

DNS란?

드디어 본론이다. 애플리케이션에 IP를 할당이 되면 클라이언트는 해당 IP를 통해 접근이 가능하다. 그런데 이 IP는 언제든지 변경이 가능하다. 그러면 그럴 때마다 클라이언트에게 IP를 알려줘야 할까? DNS(Domain Name System 혹은 Service)를 사용하면 그럴 필요가 없어진다. 우리에게 익숙한, 브라우저 URL 주소가 DNS로 인해 생성된다. 동일한 URL만 입력한다면 IP가 변경된다고 하더라도 동일한 애플리케이션을 이용할 수 있게 된다. DNS는 네임 서버를 계층 구조로 구성하는 분산 데이터베이스 구조를 가진다.

 

DNS 동작 방식

  • 웹 브라우저 혹은 클라이언트가 서버로 요청을 한다.
  • 로컬 DNS 서버에 해당 URL이 등록되어 있는지 확인 후 있으면 바로 IP 주소를 알려준다.
  • 만약 IP 주소를 못찾았다면 루트 DNS 서버에게 문의한다.
    • 최상위 도메인(.com, .kr 등)을 확인하고 이 도메인이 등록된 네임서버의 IP 주소를 전달한다.
    • 최상위 도메인 DNS 서버에게 문의하라는 의도로, 루트 DNS 서버는 로컬 DNS 서버에게 최상위 도메인 DNS 서버의 IP 주소를 알려준다.
  • 로컬 DNS 서버가 최상위 DNS 서버에게 URL을 전달한다.
    • IP 주소를 못찾으면 바로 아래 계층의 DNS 서버 IP를 알려준다.
    • 이 과정을 반복하면 특정 DNS 서버에서 원하는 IP를 얻을 수 있다
  • 로컬 DNS 서버가 찾은 IP로 접근하여 필요한 정보를 획득한다.
  • 로컬 DNS 서버는 획득한 정보(IP 주소 등)를 클라이언트에 전달한다.

이처럼 로컬 DNS 서버가 여러 DNS 서버를 거치면서 확인하는 과정을 Recursive Query(재귀적 쿼리)라고 한다.

 

 

dig란?

dig(Domain Information Groper)는 네임서버로부터 정보를 가져올 수 있는 툴이다. DNS 네임서버 구성과 도메인 설정이 완료된 후, 일반 사용자의 입장에서 설정한 도메인네임에 대한 DNS 질의응답이 정상적으로 이루어지는지를 확인 점검하는 경우에 많이 사용한다. 만약 dig가 설치되어 있지 않다면 구글에서 'dig 설치'를 검색해보자.

 

 

기본적인 dig 명령어

가장 기본적인 도메인 조회를 해보자. dig 뒤에 도메인 주소를 입력하면 된다.

$ dig google.com

// 결과
; <<>> DiG 9.10.6 <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64394
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;google.com.                    IN      A

;; ANSWER SECTION:
google.com.             31      IN      A       142.250.196.142

;; Query time: 8 msec
;; SERVER: 10.200.0.2#53(10.200.0.2)
;; WHEN: Tue Sep 27 14:51:23 KST 2022
;; MSG SIZE  rcvd: 55

 

특정 네임서버로 조회하는 방법도 있다.

$ dig @8.8.8.8 google.com

 

질의 추적도 가능하다. 이 명령어를 입력하고 실행해보면 DNS의 동작원리를 글로만 이해했던 것보다 쉽게 이해할 수 있을 것이다.

$ dig google.com +trace

 

참고자료
- 네트워크 개념 정리
- DNS란? (도메인 네임 시스템 개념부터 작동 방식까지)
- [Network] DNS 과정
- dig 명령어 - DNS네임서버의 정보 확인

 

728x90
반응형