[Network] Application Layer 4 - DNS (도메인 네임 시스템)

chxghee·2024년 10월 4일

DNS (도메인 네임 시스템)

DNS(Domain Name System)인터넷에서 도메인 이름을 IP 주소로 변환하는 시스템이다.

사람들은 인터넷에서 도메인 이름(예:www.example.com)을 사용하지만, 컴퓨터와 네트워크 장비는 IP 주소(예: 192.0.2.1)를 통해 통신하므로, DNS는 도메인 이름을 IP 주소로 변환하는 역할을 한다

DNS의 주요 기능

  1. 도메인 이름을 IP 주소로 변환

  2. 분산 시스템: DNS는 중앙 서버 하나가 모든 도메인 이름과 IP 주소를 관리하는 것이 아니라, 전 세계적으로 분산된 시스템으로 구성됩니다. 이 구조는 DNS의 확장성, 신뢰성, 효율성을 높임.(분산 데이터베이스)

  3. 계층적 구조: DNS는 계층적으로 작동하며, 루트 서버, 최상위 도메인(TLD) 서버, 책임 DNS 서버 등 여러 계층이 상호작용.

  1. DNS는 애플리케이션 계층의 프로토콜로 동작(엔드시스템에서 동작)
    호스트(클라이언트)DNS 서버 간의 통신을 통해 도메인 네임을 IP 주소로 매핑하여 IP주소를 얻을 수 있다.

DNS의 복잡성은 주로 네트워크의 가장자리에서 발생하며, 이 과정에서 여러 DNS 서버가 상호작용하게 된다. DNS는 인터넷의 중요한 기능 중 하나이며, 인터넷이 원활히 작동하는 데 필수적인 역할.


DNS의 서비스

  1. host네임을 IP주소로 매핑

  2. host aliasing
    호스트의 진짜이름(canoical)과 별칭(alias)를 매핑하여 쉽게 접근 가능

  3. 메일 서버 aliasing
    메일 서버의 별칭을 사용해 이메일을 쉽게 전송하고, MX 레코드를 통해 올바른 메일 서버로 이메일을 전달

  4. 부하 분산
    같은 서비스를 제공하는 웹 서버 복사하여 얻은 많은 IP주소를 하나의 host네임으로 매핑시켜 한 서버에 트래픽이 몰려 부하가 생기는 것을 막는다


DNS가 중앙 집중적이면 안되는 이유

  1. 중앙 DNS서버에 장애가 생기면 전체 서비스가 중단될수있다.
  2. 전세계의 요청이 한 서버에 집중되므로 엄청난 트래픽이 발생한다.
  3. 중앙 집중형 서버(데이터베이스)와의 거리 문제
    서버와 물리적 거리가 멀다면 엄청난 지연이 발생
  4. 유지보수의 복잡성


DNS의 계층 구조

루트 DNS 서버

DNS의 최상위에 위치한 서버로, TLD 부분(예: .com, .net)에 대한 정보를 관리. (전세계 13개)

TLD DNS 서버 (Top-Level Domain)

각 최상위 도메인(예: .com, .org, .net)을 관리하는 서버.

예를 들어, example.com 도메인을 찾으려면 .com TLD 서버에서 정보를 조회하게 된다.

  1. TLD 영역 관리
    .com, .net, .org와 같은 특정 TLD 영역을 관리하고
    .kr, .uk 같은 나라 도메인들도 관리한다.

  2. 책임 DNS 서버의 위치 제공
    TLD 서버는 해당 도메인의 권한이 있는 DNS 서버를 가리키는 정보를 저장하고 반환한다.

참고
Network Solutions: .com, .net TDLd을 관리하는 회사

책임 DNS 서버 (Authoritative DNS Server)

특정 도메인 이름에 대한 정확한 IP 주소를 제공하는 서버.

이 서버는 도메인 이름을 등록한 회사나 웹 호스팅 서비스 제공자가 설치/운영한다.
(이것은 최종적인 IP 주소 정보를 제공하는 서버이고, 실제 서비스를 제공하는 서버와 별개이다)

리커시브 DNS 리졸버 (Recursive DNS Resolver)

사용자가 DNS 요청을 보내면, 이 요청을 처리하는 서버.
리졸버는 사용자를 대신해 루트 DNS 서버, TLD 서버, 책임 DNS 서버에 차례대로 요청을 보내 IP 주소를 찾는다.


그렇다면 클라이언트가 IP주소를 어떻게 찾게될까? (간단버전)

Q. www.naver.com의 IP주소를 찾고 싶다..
1. 클라는 루트 DNS 서버에 .com DNS 서버를 찾는 쿼리를 보냄
2. 클라는 .com DNS 서버(TLD서버)에서 naver.com DNS 서버를 찾는 쿼리를 보냄 (책임 DNS 서버)
3. 클라이언트는 naver.com DNS 서버(책임 DNS 서버)에서 IP주소를 얻는다


Local DNS name server

사용자가 인터넷에 접속할 때, 가장 먼저 접촉하는 DNS 서버로, 클라이언트(사용자)로부터 도메인 이름을 IP 주소로 변환하기 위한 요청을 받아 처리한다.

  • 사용자가 도메인 이름을 입력하면 그 요청(DNS 쿼리)은 우선 로컬 DNS 서버로 전송.
    (로컬 DNS 서버는 IP 주소를 찾기 위해 먼저 자신의 캐시를 확인)

  • 로컬 DNS 서버는 최근에 처리한 도메인 이름과 IP 주소의 매핑(translation pairs) 정보를 캐시에 저장해 두고 사용 (응답 속도 업)

  • 로컬 DNS 서버는 DNS 요청을 처리할 때 프록시 역할
    자신이 직접 도메인 이름을 IP 주소로 변환하는 것이 아니라, DNS 계층 구조(루트 DNS 서버 → TLD DNS 서버 → 권한이 있는 DNS 서버)에 쿼리를 전달하여 IP 주소를 얻어옴
    -> 로컬 DNS 서버가 캐시된 정보가 없는 경우, 요청을 상위 DNS 서버로 전달(forward)하여 해당 도메인의 IP 주소를 찾아오는 리커시브 질의(recursive query)를 수행

  • ISP(가정, 회사, 대학교 등)은 각기 자신의 로컬 DNS 서버를 보유하고,
    기관의 네트워크 사용자들이 인터넷에 접속할 때 해당 로컬 DNS 서버를 사용하여 DNS 요청을 처리

  • 기본 네임 서버(default name server)라고도 불린다.
    즉, 사용자가 특별히 다른 DNS 서버를 지정하지 않으면, 해당 네트워크(예: 회사, 대학 또는 가정의 ISP)의 로컬 DNS 서버가 기본적으로 사용됨


반복 쿼리

로컬 DNS 서버가 각 DNS 서버에 직접 질의를 보내 반복적으로 IP주소를 얻는것

DNS 서버는 요청에 대해 자신이 알고 있는 최상의 답변만 제공

동작 방식
	1.	클라이언트가 로컬 DNS 서버에게 도메인 이름에 대한 IP 주소를 요청합니다.
	2.	로컬 DNS 서버는 해당 정보를 알고 있으면 바로 응답합니다. 하지만 모를 경우, 루트 DNS 서버에 질의합니다.
	3.	루트 DNS 서버는 최종 IP 주소를 반환하지 않고, TLD DNS 서버의 주소만 반환합니다.
	4.	로컬 DNS 서버는 다시 TLD DNS 서버에 요청을 보내고, TLD DNS 서버는 권한이 있는 DNS 서버의 주소를 반환합니다.
	5.	로컬 DNS 서버는 책임 DNS 서버에 최종적으로 요청을 보내어 IP 주소를 얻습니다.
	6.	이렇게 반복적으로 다른 서버에 질의하면서 최종 IP 주소를 얻어냅니다.

리컬시브 쿼리

클라이언트는 DNS 서버에 하나의 요청만 보내고, DNS 서버가 최종 IP 주소를 찾아서 반환한다.

서버가 클라이언트를 대신해 모든 과정을 처리하기 때문에, 서버에 더 많은 부하가 걸릴 수 있지만, 클라이언트는 간단하게 최종 답변을 받을 수 있다.

리커시브 쿼리와 반복 쿼리 비교

특징리커시브 쿼리(Recursive Query)반복 쿼리(Iterative Query)
동작 방식클라이언트가 DNS 서버에 요청을 보내면, DNS 서버가 최종 IP 주소를 반환클라이언트가 각 DNS 서버에 요청을 보내고, 각 서버는 다음 서버의 주소를 반환
서버 처리DNS 서버가 클라이언트를 대신해 모든 서버와 통신하여 최종 IP 주소를 찾음클라이언트가 여러 DNS 서버에 반복적으로 요청을 보내면서 IP 주소를 찾음
클라이언트 요청 횟수클라이언트는 한 번의 요청만 보냄클라이언트는 여러 번 요청을 보냄
DNS 서버 부하서버 부하가 높음 (모든 쿼리를 처리해야 하므로)서버 부하가 낮음 (자신이 알고 있는 정보만 제공)
응답 시간일반적으로 더 빠름클라이언트가 여러 번 요청해야 하므로 상대적으로 더 느릴 수 있음
용도로컬 DNS 서버 또는 ISP의 DNS 서버에서 자주 사용네임 서버가 단계적으로 DNS 계층을 탐색할 때 사용

리컬시브는 부하가 크지만, 간단하게 최종 주소를 얻을수있고
반복은 부하는 작지만, 클라이언트가 계속 요청을 해야한다,



DNS 동작 과정

  1. 사용자가 도메인 이름 입력:
    - 사용자가 웹 브라우저에 www.example.com을 입력합니다.

  2. 로컬 DNS 서버에 요청:
    • 클라이언트(사용자 컴퓨터)는 해당 도메인의 IP 주소를 찾기 위해 로컬 DNS 서버에 쿼리를 보냅니다. 로컬 DNS 서버는 사용자의 ISP나 회사, 기관에서 관리하는 DNS 서버입니다.

  3. 로컬 캐시 확인:
    • 로컬 DNS 서버는 먼저 자신의 캐시를 확인합니다. 캐시에 IP 주소가 저장되어 있다면, 즉시 클라이언트에게 반환합니다.
    • 캐시된 정보가 없거나 만료된 경우, 리커시브 쿼리를 통해 DNS 계층 구조에 따라 상위 서버에 질의를 시작합니다.

  4. 루트 DNS 서버에 요청:
    • 로컬 DNS 서버는 루트 DNS 서버에 www.example.com 도메인의 IP 주소를 요청합니다. 루트 DNS 서버는 IP 주소를 알지 못하지만, TLD DNS 서버(예: .com TLD 서버)의 주소를 반환합니다.

  5. TLD DNS 서버에 요청:
    • 로컬 DNS 서버는 .com TLD DNS 서버에 example.com에 대한 권한이 있는 DNS 서버의 위치를 요청합니다.
    • TLD DNS 서버는 example.com을 관리하는 책임 DNS 서버의 주소를 반환합니다.

  6. 책임 DNS 서버에 요청:
    • 로컬 DNS 서버는 example.com의 권한이 있는 DNS 서버에 www.example.com의 정확한 IP 주소를 요청합니다.
    • 책임 DNS 서버는 www.example.com의 최종 IP 주소를 로컬 DNS 서버에 반환합니다.

  7. IP 주소 반환:
    • 로컬 DNS 서버는 얻은 IP 주소를 캐시에 저장하고, 그 IP 주소를 클라이언트(사용자 컴퓨터)에게 반환합니다.

  8. 클라이언트가 웹 서버에 접속:
    • 클라이언트는 반환된 IP 주소를 사용해 해당 웹 서버에 연결하고, 웹 페이지를 로드합니다.

DNS 캐싱

캐싱은 DNS 서버가 최근에 요청된 도메인 이름과 IP 주소 간의 매핑 정보를 일정 시간 동안 저장해 두는 기능으로, 이 기능을 통해 DNS 요청 처리 속도가 빨라지고 네트워크 트래픽이 줄어든다.

  • DNS 캐싱은 DNS 서버가 최근에 조회된 도메인 이름과 IP 주소 간의 매핑 정보를 일정 시간 동안 캐시에 저장하여 요청 처리 속도를 높인다.

  • TLD 서버 정보는 로컬 DNS 서버에 캐싱되어, 루트 DNS 서버에 대한 요청이 자주 발생하지 않는다.(IP 주소 정보도 바로 캐싱가능)

  • TTL(Time to Live) 유효기간이 지나면 따라 캐시된 정보는 삭제 후 갱신된다.

  • 도메인의 IP 주소가 변경되었을 때 TTL이 만료되기 전까지는 전 세계적으로 변경 사항이 반영되지 않을 수 있습니다.
    (= 캐시된 정보가 최신 상태가 아닐 수 있다)

  • 이를 해결하기 위해 IETF는 업데이트/알림 메커니즘을 제안하여, 도메인 정보가 변경될 때 즉시 전파될 수 있도록 하는 표준을 개발하고 있다.



DNS 레코드

DNS 서버는 각 도메인에 대한 여러 종류의 정보를 저장하는 DNS 레코드를 포함한다.

RR 포멧 = (name, value, type, TTL)

  1. A 레코드 (Address Record):

    • name: 호스트 네임
    • value(반환) : IP 주소

    예를 들어, www.example.com의 A 레코드는 192.0.2.1과 같은 IP 주소를 반환.

  1. CNAME 레코드 (Canonical Name Record):
    • 하나의 도메인 이름을 다른 도메인 이름으로 별칭 처리.
    • name: 별칭
    • value(반환) : 진짜 호스트 이름(canonical)

예를 들어, blog.example.comwww.example.com으로 매핑할 수 있습니다. (보통 책임서버에 CNAME 레코드가 설정됨)

  1. MX 레코드 (Mail Exchange Record):
    • 이메일 전송 시, 메일을 처리할 서버를 지정하는 레코드.
    • name`: 도메인 이름
    • value(반환): 메일 서버 이름과 우선 순위(priority)

예시: example.com의 MX 레코드 -> mail.example.com

<br>
  1. NS 레코드 (Name Server Record):
    • 특정 도메인의 DNS 관리를 담당하는 네임 서버를 지정하는 레코드.
    • name: 도메인 (asd.com)
    • value(반환) : 도메인의 DNS를 관리하는 책임 네임서버의 호스트 네임
      예시: example.com의 NS 레코드 -> ns1.example.com
example.com 도메인의 네임 서버는 ns1.example.com과 ns2.example.com입니다.

example.com.   86400   IN   NS   ns1.example.com.
example.com.   86400   IN   NS   ns2.example.com.

DNS 프로토콜 메세지

쿼리와 응답(reply) 두개로 나뉜다.
(둘다 같은 포맷을 갖는다.)

포멧

  1. identification
  • 무슨 쿼리에 대한 응답인지 서로 매칭하기 위한 고유한 16bit값
  1. flags
  • 쿼리면 0 / 응답이면 1
  • 리컬시브요청인지 아닌지 1
  • 리컬시브를 처리할수있는지(응답쪽에서 사용) 1
  • 응답이 권한 있는 DNS 서버로부터의 응답인지 1


도메인 등록 및 레코드 등록

  1. 도메인 등록: networkutopia.com을 도메인 등록 대행사(Registrar)를 통해 등록합니다.(network solutions회사)

  2. TLD 서버에 NS 및 A 레코드 추가: “networkutopia.com”에 대한 NS 레코드와 A 레코드를 .com TLD 서버에 등록합니다.

- NS 레코드: dns1.networkutopia.com이 네임 서버 역할을 함.
	예시 -> (networkutopia.com, dns1.networkutopia.com, NS)
- A 레코드: dns1.networkutopia.com의 IP 주소는 212.212.212.1.
   예시 -> (dns1.networkutopia.com, 212.212.212.2, A)
  1. 책임 네임 서버 설정: 로컬에 네임 서버를 설정하고, 도메인 이름과 관련된 A 레코드와 MX 레코드를 설정합니다.
    • A 레코드: www.networkutopia.com의 IP 주소를 설정.
    • MX 레코드: networkutopia.com의 메일 서버 설정.


DNS 보안

  1. 루트 서버에 대한 DDoS 공격:
    • 트래픽을 루트 서버에 집중하여 서비스 장애를 일으키려는 시도.
    • 성공한 적 없음: 루트 서버는 전 세계적으로 분산되어 있고, 트래픽 필터링과 로컬 DNS 서버의 캐싱으로 보호되고 있습니다.
    • 로컬 DNS 서버가 TLD 서버 IP 정보를 캐싱하고 있어, 루트 서버를 우회하여도 DNS 쿼리를 처리할 수 있습니다.

  2. TLD 서버에 대한 DDoS 공격:
    • TLD 서버를 공격하여 특정 도메인의 DNS 쿼리를 방해할 수 있는 더 큰 위험을 가진 공격.
    TLD 서버가 중단되면 다수의 도메인에 영향을 미칠 수 있습니다.
    • 분산된 TLD 서버를 통해 공격에 대비하고 있지만, 루트 서버 공격보다 더 위험할 수 있습니다.

  1. Redirect attacks (리다이렉트 공격):
    • Man-in-the-Middle (MITM) 공격: DNS 쿼리를 가로채어 악의적으로 변조된 IP 주소로 사용자를 유도. -> 다른 주소로 이동하게 됨
    • DNS 캐시 중독(DNS poisoning): DNS 서버의 캐시를 오염시켜, 해당 서버가 잘못된 IP 주소를 캐싱하게 만듦. 이후 사용자는 잘못된 서버로 리다이렉트됨.

  2. DNS를 악용한 DDoS 공격:
    • 스푸핑된 출발지 주소를 사용해 타겟 IP 주소로 대규모의 DNS 응답을 전송하여 서버를 과부하 상태로 만듦.
    • 증폭 기법(Amplification): 작은 요청으로 큰 DNS 응답을 유도해 DDoS 공격을 증폭시키는 방식.



DNS의 중요성

  1. 도메인 이름과 IP 주소의 연결: DNS는 사람이 기억하기 쉬운 도메인 이름과 컴퓨터가 인식할 수 있는 IP 주소를 연결합니다. 이를 통해 사용자는 복잡한 IP 주소 대신 직관적인 도메인 이름을 사용하여 웹사이트에 접근할 수 있습니다.

  2. 인터넷의 확장성: DNS는 분산 시스템으로 설계되어 있어, 전 세계적으로 많은 도메인 이름을 관리할 수 있습니다. 또한 DNS 서버는 수백만 개의 요청을 처리할 수 있는 확장성을 가지고 있습니다.

  3. 인터넷의 안정성: DNS는 여러 계층의 서버를 통해 데이터를 제공하기 때문에, 특정 DNS 서버에 문제가 생기더라도 다른 서버가 요청을 처리할 수 있습니다. 이는 인터넷의 안정성을 보장하는 중요한 요소입니다.

  4. 부하 분산: DNS는 여러 IP 주소를 통해 부하를 분산시킬 수 있습니다. 예를 들어, 하나의 도메인이 여러 IP 주소를 가지고 있을 때, 각 요청을 다른 IP 주소로 보내어 서버의 부하를 줄일 수 있습니다.

profile
다 같이 화이팅! 🙋‍♂️

0개의 댓글