공부기록

DNS 본문

일단써

DNS

코타쿠 2021. 10. 17. 12:41

DNS

Domain Name System 은 아래와 같다.

  1. DNS 서버들의 계층구조로 이루어진 분산 데이터베이스 이고
  2. 호스트가 분산 데이터베이스로 쿼리를 날리도록 해주는 application-layer 프로토콜이다.

DNS는 다른 어플리케이션 계층의 프로토콜 (HTTP, SMTP)에 의해 사용되며 호스트 네임을 IP 주소로 바꿔준다.

사용자가 URL www.someschool.edu/index.html을 쳤을 때, 웹서버 주소, www.someschool.edu의 IP 주소는 아래와 같은 과정을 통해 찾을 수 있다.

  1. 클라이언트의 DNS 어플리케이션이 돌아간다.
  2. 브라우저가 호스트이름 www.someschool.edu를 뽑아 DNS 어플리케이션으로 보낸다.
  3. DNS 클라이언트는 DNS서버에 해당 호스트 네임을 조회한다.
  4. DNS 클라이언트는 해당 호스트 네임에 대한 IP 주소를 받는다.
  5. 브라우저가 IP주소를 받아 TCP 연결을 시작하고 HTTP 요청을 보낸다.

DNS는 호스트네임을 IP주소로 바꿔주는 것 외에도, 다른 중요한 서비스를 제공한다.

  1. Host aliasing

하나의 IP 주소가 여러개의 호스트 주소를 가지게 한다. canonical hostname (정식 호스트명) 이라고 해서, relay1.west-coast.enterpries.com이라는 hostname이 있다고 하자, 너무 길기에, 이를 간소화한 enterprise.com이라는 hostname을 canonical hostname에 매칭될 수 있도록 한다.

  1. Mail Server Aliasing

위의 Host Aliasing과 마찬가지로, bob@yahoo.com에서 뒤에 있는 메일 명은 사실 더 긴 canonical name을 가진다. 이를 더 짦은 호스트명에 매칭 될 수 있도록 한다.

  1. Load Distribution

하나의 도메인에 대해, 여러 개의 IP가 묶여 있을 수 있다. 클라이언트가 이 도메인을 조회할 때, DNS는 0~N 까지 순차적으로 그 때 마다 다른 IP 주소를 리턴해 줄 수 있다. 이를 통해 부하를 분산시킬 수 있다.

DNS는 분산되어 있다. DNS 서버가 1개여서는 안되는 이유는 다음과 같다.

  1. 하나의 서버가 다운되면, 인터넷을 못쓴다.
  2. 하나의 서버에 트래픽이 몰리면 제대로 사용할 수 없다.
  3. 거리가 먼 클라이언트는 제대로 서비스를 이용할 수 없다.
  4. 하나의 저장소에 지구상의 모든 호스트 명에 대한 레코드를 유지할 수 없다.

이 때문에, DNS 서버는 계층 형태로 분산되어 있다.

DNS 서버들은 또한 다음과 같이 분류할 수 있다.

  1. Root DNS Server

    TLD 서버들의 IP 주소를 제공한다.

  2. Top Level Domain (TLD) Server

Authoritive DNS 서버들의 주소를 제공한다.

  1. Authoritative DNS Server

민간에게 공개되는 호스트들의 이름과 그 IP 주소들을 담고 있다.

Root -> TLD -> Authoritative 순으로 계층이 이뤄진다.

클라이언트에서 DNS 서버에 접속하는 방식은 Iterative, Recursive한 방법이 있다.

DNS Caching

클라이언트가 그냥 탐색하는 것은 너무 많은 쿼리를 만들게 된다. 때문에 DNS 서버는 쿼리의 결과를 caching 할 수 있도록 한다.

방법은 간단하다. DNS 서버에 query가 오고, 그 결과가 없다면 다른 DNS 서버에게 결과를 요청하여 그 결과를 자신에게 저장시키는 것이다.

이 결과는 일정 TTL (Time To Live) 정도만 있다가 사라지게 된다.

DNS Records and Messages

DNS 서버는 Resource Records (RRs)를 저장한다. 이들은 hostname : IP addr 을 매핑하는 정보를 제공한다. 각 DNS 결과 메세지는 하나 이상의 RR 정보들을 제공한다.

RR은 4개 속성을 가진다.

(Name, Value, Type, TTL)

TTL은 메세지의 유효시간이며 언제 캐시에서 사라질지를 결정한다.

Name, Value는 메세지의 유형을 의미하는 Type에 의해 결정된다.

  1. Type = A

Name은 hostname이고, Value는 IP 주소가 된다.

  1. Type = NS

Name은 도메인 네임이며 Value는 해당 도메인으로 접근할 수 있는 Authoritive DNS 서버의 호스트 명이다. 이 정보는 query chain에 사용될 수 있다.

  1. Type = CNAME

Name은 alias 호스트 네임이며, Value는 Canonical 호스트 네임이다.

  1. Type = MX

Name은 이메일 호스트 네임이며 Value는 Canonical 호스트 네임이다.

Inserting Records into the DNS Database

다음은 DNS에 정보를 넣는 방법이다.

  1. registrar가 호스트 네임이 유일한지 확인한다.
  2. (호스트네임 : Authoritive DNS Server IP) 로 매칭한다. (dns1.networkutopia.com , 212.2.212.1 , A)
  3. 필요하면, NS 레코드를 넣는다. (networkutopia.com, dns1.networkutopia.com, 212.2.212.1, NS)

다음은 해당 사이트에 접속하는 과정이다.

  1. 클라이언트에서 www.networkutopia.com의 ip를 조회하는 DNS 쿼리를 local DNS 서버로 날린다.
  2. local DNS 서버는 자신에게 없는 정보니, TLD com Server에 접속한다.
  3. TLD 서버는 NS정보와, A정보를 탐색하여 loal DNS 서버에 응답한다.
  4. local DNS서버는 쿼리에 대한 두 RR을 저장하고, 클라이언트에게도 두 RR을 보낸다.
  5. 클라이언트는 A 정보를 가지고 HTTP 요청메세지를 보낸다.