Skip to content

Latest commit

 

History

History
253 lines (160 loc) · 14.6 KB

강민석_DNS.md

File metadata and controls

253 lines (160 loc) · 14.6 KB

DNS(Domain Name System)

0. 알아둬야하는 이유

  • 네트워크 프로토콜은 크게 2가지로 나눔. 실제로 데이터를 실어나르는 데이터 프로토콜과 데이터 프로토콜이 잘 동작하도록 도와주는 컨트롤 프로토콜
  • 컨트롤 프로토콜은 통신에 직접 관여하지는 않지만 처음 통신 관계를 맺거나 유지하는데 큰 도움을 줌.(ex: ARP,ICMP,DNS)

DNS는 도메인주소를 IP로 변환하는 역할을 수행한다.
192.168.10.12같은 ip보다는 www.naver.com 등의 도메인 주소를 이용하는 것이 일반 사용자들에게 더 익숙하고 서버 IP 변경에 유연하게 대처가 가능하기 때문이다.

또한, MSA기반의 서비스 설계가 많아지면서 다수의 API를 이용하다보니 서비스 간 API 호출이나 인터페이스가 많아져 DNS의 중요도는 더욱 높아짐.


1. DNS 소개

http://202.179.177.21와 같은 IP주소로도 사이트에 접속이 가능하고, http://www.naver.com과 같이 도메인 주소를 통해 사이트에 접속이 가능하다.

네트워크 통신에서는 202.179.177.21와 같은 IP주소를 이용하게 된다. 하지만 사용자는 이를 외우기도 힘들고, 사이트마다 이 IP주소를 외우는것은 사용자에게 좋은 경험을 선사해줄 수 없기에 의미 있는 문자열로 구성된 도메인 주소가 나오게 되었다.

도메인 주소를 사용할 경우 서비스 중인 IP가 변경되어도 도메인 주소 그대로 유지해 접속 방법 변경 없이 서비스할 수 있다는 장점도 있다.

DNSImage

만약 DNS주소를 직접 입력하였다면 해당 DNS로 도메인에 대한 IP 질의를 보내고 그 결과값으로 요청한 도메인의 서비스 IP주소를 받게 된다.

[1]
          www.naver.com
client ------------------>  DNS Server

[2]

         202.179.177.21
client <-----------------   DNS Server   

[3]
          202.179.177.21
client ---------------------->   naver.com (202.179.177.21 Server)
       <----------------------
          Web Page
  • 내부 시스템의 서비스 간 연결에도 DNS가 쓰인다고 한다. 어느 한 서비스의 IP가 변경이 필요한 경우, 여러 가지 설정을 변경하거나 프로그램을 재배포 해야하는데, 도메인 주소를 사용하면 DNS서버에서 간단한 설정 변경으로 해결이 가능하다고 한다. 그렇기에 인터넷 연결을 위한 DNS와 내부 서비스를 위한 DNS를 분리하여 운영한다고 한다.

2. DNS 구조와 명명 규칙

  • 도메인은 계층 구조로 이루어져서 원하는 인터넷 주소를 효율적으로 찾아갈 수 있다.
  • 역트리 구조로 최상위 루트부터 TOP-Level, Second-Level, Third-Level 순으로 찾아간다.
  • 계층간의 구조를 "."으로 표시하고 뒤에서 앞으로 해석한다.
  • 맨 뒤의 .(Root)는 생략된다.
  • 알파벳, 숫자, '-'만 사용이 가능하고, 대소문자 구분은 없다.
[Third-Level]   [Second-Level]     [Top-Level]  [Root]
    www       .     naver        .     com        .(생략)

2.1 루트 도메인

  • DNS 서버는 사용자가 쿼리한 도메인에 대한 값을 직접 가지고 있거나 캐시에 저장된 정보를 사용하여 응답한다.
  • 만약 DNS 서버에 해당 도메인의 정보가 없다면 루트 도메인을 관리하는 루트DNS에 쿼리하게 된다.
  • 루트 DNS는 전세계에 13개가 있고 DNS 서버를 설치하면 루트 DNS의 IP주소를 기록한 힌트 파일을 가지고 있어 루트 DNS관련 별도 설정은 필요 없다.

rootDomainServer

2.2 Top-Level Domain(TLD)

IANA에서 구분한 6가지 유형으로 구분이 가능하다.

  • Generic(gTLD): 특별한 제한없이 일반적으로 사용되는 최상위 도메인
com: 일반 기업체
edu: 4년제 이상 교육기관
gov: 미국 연방정부기관
int: 국제기구, 기관
mil: 미국 연방군사기관
net: 네트워크 관련기관
org: 비영리기관
...
  • Country Code TLD(ccTLD): 국가 최상위 도메인 보통 ISO 3166표준에 의해 규정되어 씀. 우리나라는 kr 보통 이를 사용하면 Second Level TLD에서 사이트 용도에 따른 코드를 사용한다. 예를들면 일반회사는 co.kr, 정부기관은 go.kr 나라마다 다르다.

  • Sponsored(sTLD): 특정 목적을 위한 스폰서를 두고 있는 최상위 도메인 ex) .aero, .asia ...

  • Infrastructure: 운용상 중요한 인프라 식별자 공간을 지원하기 위해 전용으로 사용되는 최상위 도메인 ex) .arpa

  • Generic-Restricted(grTLD): 특정 기준을 충족하는 사람이나 단체가 사용할 수 있는 최상위 도메인 ex) .biz, .name ...

  • Test(tTLD): 개발 프로세스 테스트용 최상위 도메인 ex) .test

3. DNS 동작방식

도메인을 IP 주소로 변환하려면 DNS 서버에 질의해야하지만, 로컬에서 도메인과 IP 주소를 관리하는 hosts파일을 통해 사용할 수도 있다.

이 파일에 등록해두면 해당 도메인 리스트는 DNS 캐시에 저장된다.

도메인을 쿼리하면 DNS 캐시에 먼저 들려서 없으면 DNS 서버로 쿼리를 수행하고 그 결과를 다시 캐시에 저장한다.

ipconfig /displaydns 
# 를통해 DNS 캐시를 볼 수 있다.

전 세계의 도메인 정보를 DNS 서버 하나에 저장할 수 없기에, DNS는 분산된 데이터베이스로 서로 도와주도록 설계가 되어있다.

자신이 가진 도메인 정보가 아니면 다른 DNS에 질의해 결과를 받는 형식이다.

예를 들어서 kmsdns.net이라는 도메인을 클라이언트가 DNS 서버에 쿼리를 보냈다고 한다.

  1. 도메인 주소의 IP가 로컬 캐시에 저장되어있는지 확인.
  2. 저장되어 있지 않으면 사용자 호스트에 정의된 DNS에 해당 도메인에 대한 쿼리를 진행.
  3. DNS 서버는 kmsdns.net가 로컬 캐시와 자체에 설정되어 있는지 확인하고 없으면 루트 도메인서버에 '.net'에 대한 정보를 가진 도메인 주소를 쿼리.
  4. 루트 DNS는 '.net'을 관리하는 네임 서버 정보를 DNS서버에 응답.
  5. DNS 서버는 응답받은 정보를 가지고 kmsdns.net에 대해 쿼리를 보냄.
  6. kmsdns.net에 대한 정보를 가진 네임 서버 정보(가칭 kms)를 DNS 서버에 응답.
  7. DNS 서버는 kms 네임 서버에 kmsdns.net에 대한 정보를 쿼리.
  8. kms 네임 서버는 해당 도메인에 대한 정보를 DNS 서버에 응답.
  9. DNS 서버는 응답받은 정보를 로컬 캐시에 저장하고 사용자 호스트에 kmsdns.net에 대한 정보를 응답.
  10. 사용자 호스트는 DNS로부터 받은 도메인에 대한 IP주소를 가지고 사이트에 접속하게 됨.

4. 마스터와 슬레이브

  • DNS 서버는 마스터(Master, Primary) 서버와 슬레이브(Slave, Secondary) 서버로 나눌 수 있다.

  • 마스터 서버라서 우선순위가 더 높은게 아니라 도메인에 대한 존(Zone) 파일을 직접 관리하는지 여부에 따라 나뉜다.

  • 마스터 서버는 존 파일을 직접 생성해 도메인 관련 정보를 관리한다.

  • 슬레이브 서버는 마스터에 만들어진 존 파일을 복제한다. 이 과정을 영역 전송(Zone Transfer) 라고 한다.

즉, 마스터 서버는 도메인 영역을 생성하고 레코드를 직접 관리하지만 슬레이브 서버는 마스터 서버에 설정된 도메인 영역과 레코드를 정기적으로 복제한다.

MasterSlave

출처: https://computingforgeeks.com/configure-slave-bind-dns-server-on-ubuntu/

따라서 슬레이브 서버를 만들때에는 도메인을 복제해올 마스터 서버 정보를 입력해야 한다.

반대로 마스터 서버는 인가받지 않은 다른 DNS서버가 복제해가지 못하도록 슬레이브 서버를 지정해 복제를 제한할 수 있다. 무분별한 복제를 막기위해 설정해두는것을 추천한다고 한다.

DNS 서버는 마스터 서버에 문제가 발생하면 슬레이브 서버도 마스터서버에 대한 복제정보를 받아오지 못한다. 이를 **만료 시간(Expiry Time)**이라고 하고 SOA레코드에 설정된다.

만료 시간 안에 슬레이브 서버가 마스터 서버로부터 정보를 받아오지 못하면 슬레이브의 존 정보는 사용할 수 없게 된다.

따라서 만료 시간 안에 마스터 서버를 복구하거나 슬레이브 서버를 마스터로 전환해야 서비스 장애를 막을 수 있다.


5. DNS 주요 레코드

도메인에는 다양한 내용을 매핑할 수 있는 레코드들이 있다.

레코드란 도메인 서버를 직접 관리할시 사용자 요청에 대한 응답을 지정해줘야하는데 이 응답의 형식들을 말한다.

A(IPv4 Host): 도메인 주소를 IP(IPv4)로 매핑
AAAA(IPv6 Host): 도메인 주소를 IP(IPv6)로 매핑
CNAME(별칭): 도메인 주소에 대한 별칭
SOA(권한 시작): 본 영역 데이터에 대한 권한
NS(도메인의 네임서버): 본 영역에 대한 네임 서버
MX(메일 교환기): 도메인에 대한 메일 서버 정보(Mail eXchanger)
PTR(포인터): IP 주소를 도메인에 매핑(역방향)
TXT(레코드): 도메인에 대한 일반 텍스트
  • A(IPv4): 기본 레코드, 하나의 A 레코드는 한 개의 도메인 주소와 한 개의 IP가 1:1로 매핑. 하나의 도메인이 여러 IP 주소와 매핑 가능. 반대도 가능

ARecord

출처: https://support.wix.com/ko/article/%EA%B8%B0%EB%B3%B8-a-%EB%B0%8F-cname-%EB%A0%88%EC%BD%94%EB%93%9C-%EC%9E%AC%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0

  • AAAA(IPv6): A레코드와 역할은 같음. IPv6 주소체계에 사용.

  • CNAME(Canonical Name): 레코드 값에 IP주소를 매핑하는 A 레코드와 달리 도메인 주소를 매핑. 네임서버가 CNAME레코드에 대한 질의를 받으면 CNAME 레코드에 설정된 도메인 정보를 확인하고 그 도메인 정보를 내부적으로 질의한 결과 IP를 응답한다. 대표적으로 www가 있다.

예시로 kmsjava.net라는 웹사이트에 접속하려면 'kmsjava.net'이나 'www.kmsjava.net'을 입력할텐데 각각 A레코드로 입력하면 IP주소가 변경될 때 두 레코드 모두 변경해줘야하지만, 'kmsjava.net'을 A 레코드로 'www.kmsjava.net'은 CNAME으로서 'kmsjava.net'을 매핑하면 IP 주소가 변경될 때에도 'kmsjava.net' A레코드만 변경해주면 된다는 이점이 있다.

[A레코드 각각 사용시]

------------IP 변경전--------------------

레코드                     값
kms.java.net              10.10.10.10
wwww.java.net             10.10.10.10

------------IP 변경후--------------------

레코드                     값
kms.java.net              20.20.20.20
wwww.java.net             20.20.20.20

---------------------------------------------------------------------

[CNAME과 A레코드 사용시]

------------IP 변경전--------------------

레코드                     값
kms.java.net              10.10.10.10
wwww.java.net(CNAME)      kms.java.net

------------IP 변경후--------------------

레코드                     값
kms.java.net              20.20.20.20
wwww.java.net(CNAME)      kms.java.net

  • SOA(Start Of Authority): 도메인 영역에 대한 권한을 나타내는 레코드. 현재 네임 서버가 이 도메인 영역에 대한 관리 주제임을 의미 하므로 다른 네임 서버에 질의하지 않고 직접 응답한다. 도메인 영역 선언 시 SOA 레코드는 필수 항목이여서 반드시 만들어야한다. 또한 현재 도메인 관리에 필요한 속성값을 설정. 도메인 동기화에 필요한 타이머 값, TTL 값, 관리자 정보도 SOA 레코드에서 설정.

  • NS(Name Sever): 도메인에 대한 권한이 있는 네임 서버 정보를 설정하는 레코드.

  • MX(Mail eXchange): 메일 서버 구성시 사용되는 레코드.

dnslookup

네이버의 MX 레코드

네이버는 우선순위 10을 가지는 메일서버가 3개가 있음. 참고로 적을수록 우선순위가 높다.

이 경우 랜덤으로 메일서버로 요청을 보낸다.

  • PTR(Pointer): A 레코드는 도메인 주소에 대한 질의를 IP로 응답받기 위한 레코드라면 PTR은 그 반대이다. IP 주소에 대한 질의로 도메인 주소로 응답하기 위한 레코드이다. A 레코드는 정방향 조회, PTR 레코드는 역방향 조회이다. A레코드와 달리 당연하겠지만 하나의 IP 주소에 대해 하나의 도메인 주소만 가질 수 있다. 보통 화이트 도메인구성용으로 사용된다.

  • TXT(TexT): 도메인에 대한 설명과 같이 텍스트를 입력할 수 있는 레코드. 공백 포함도 가능하고 대소문자 구분, 최대 255자 입력가능.


6. 화이트 도메인

  • 정상적인 도메인을 인증, 관리하는 제도가 화이트 도메인
  • 현재 보유하고 있는 도메인을 화이트 도메인으로 등록하려면 KISA RBL 사이트에서 등록하면 된다.
  • SPF레코드를 미리 설정해야한다.
  • SPF레코드를 통해 사전에 메일 서버 정보를 공개하면 수신 측 메일서버에서 해당 도메인을 통해 발송된 메일이 실제 메일서버에 등록된 정보와 일치하는지 확인. 일치하지 않을 경우 비정상적인 이메일 서버에서 정송된 것으로 간주해 해당 이메일을 수신하지 않고 스팸처리
  • SPF레코드를 작성하기 위해서는 TXT레코드를 사용해야함.

spf

출처: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=hilineisp&logNo=220107284167

요약하자면 위 IP로 들어온 메일을 제외하면 모두 폐기하라는 뜻.

7. TTL(Time To Live)

  • DNS에 질의해 응답받은 결과를 캐시에서 유지하는 시간을 의미한다.
  • DNS 서버에서 TTL 값을 늘리면 캐시된 정보가 많아서 응답 시간이 단축되지만, 해당 도메인 정보가 변경되었을때, 정보 갱신이 자주 일어나 그만큼 지연되는 단점이 있다. 그렇기에 적절히 조절하는것이 필요하다.