Profile picture

[Linux] DNS 레코드(record) 이해하기

JaehyoJJAng2024년 07월 25일

DNS

DNS(Domain Name System)은 무엇일까

간단하게 지도로 비유해볼 수 있다.

동탄에 "피자 스쿨" 이라는 전문 피자집을 가기 위해 네이버 지도 앱을 켜서 검색한다고 가정해보자.

그러면 아래와 같이 상세한 위치 정보가 나온다.
image


여기서 주의깊게 봐야할 점은,

나는 분명히 "동탄 피자 스쿨" 이라고 검색했는데 "경기 화성시 동탄솔빛로 65" 라는 정확한 주소가 나왔다.


그렇다면 동탄에 있는 "피자 스쿨"을 찾아가고 싶다면 "경기 화성시 동탄솔빛로 65"를 항상 외워두고 있어야 할까?

사용자는 저런 상세한 주소보다는 간단한 주소를 더 외우기 쉬워할 것이다.

  • 기억하기 쉬운 이름 -> 동탄 피자스쿨
  • 실제 주소: 경기 화성시 동탄솔빛로 65

그리고 네이버 지도는 "동탄 피자스쿨" 이라고만 입력했을 뿐인데, "경기 화성시 동탄솔빛로 65"라는 상세한 주소를 안내해주었다.


이처럼, 사용자가 기억하기 쉬운 주소(동탄 피자스쿨)를 정확한 주소(경기 화성시 동탄솔빛로 65)로 찾아주는 지도의 역할을

DNS도 동일하게 수행한다.


image
jaehyojjang.dev 블로그의 주소는 185.199.110.153이다.

하지만 방문자는 185.199.110.153 같이 어려운 숫자를 일일이 전부 기억하기 쉽지 않다.

하지만 DNS를 사용한다면 숫자가 아닌 도메인 네임을 넣어 접속할 수 있다.

이번 포스팅에서는 이러한 DNS의 레코드 타입에 대해 이해해보도록 하겠다.


DNS 레코드

A Record

A 레코드는 특정 도메인에 매핑하는 IP 주소(IPv4)를 알려준다.

간단히 말하자면, A 레코드는 jaehyojjang.dev의 IP 주소가 185.199.110.153 이라고 말하는 역할을 한다.


이름
jaehyojjang.dev 185.199.110.153

가장 기본적인 레코드이다.

최종적으로는 해당 도메인 주소가 어디로(185.199.110.153) 가야할지 주소를 가리키고 있으니까.


그리고 A 레코드는 반드시 일대일 매칭이 될 필요는 없다.

일대다, 다대일도 가능하다.

예를 들면, 도메인 하나에 IP 주소 여러개를 할당할 수도 있다.

이름
jaehyojjang.dev 185.199.110.153
185.199.110.154
185.199.110.155

반대로 도메인 여러개에 IP 주소를 하나 할당할 수도 있다.

이름
jaehyojjang.dev
jaehyojjang-test.dev
185.199.110.153

nslookup 명령을 사용하여 도메인 네임의 IP 주소를 조회해보자.

nslookup jaehyojjang.dev

# 출력
Non-authoritative answer:
Name:   jaehyojjang.dev
Address: 185.199.110.153
Name:   jaehyojjang.dev
Address: 185.199.111.153
Name:   jaehyojjang.dev
Address: 185.199.109.153
Name:   jaehyojjang.dev
Address: 185.199.108.153

NS Record

Name Server 레코드.

네임서버 레코드는

jaehyojjang.dev 도메인을 관리하는 네임서버는 ns-cloud-d4.googledomains.com 입니다.

라고 알려주는 역할을 한다.


✅ 네임서버

네임서버는 도메인 이름과 IP 주소를 서로 상호전환 시켜주는 서버를 의미한다.

대부분 도메인 네임 하나당 2개 이상의 네임서버를 가지고 있다.


jaehyojjang.dev 도메인의 네임서버를 조회해보자.

nslookup -type=ns jaehyojjang.dev

# 출력
jaehyojjang.dev nameserver = ns-cloud-d3.googledomains.com.
jaehyojjang.dev nameserver = ns-cloud-d2.googledomains.com.
jaehyojjang.dev nameserver = ns-cloud-d4.googledomains.com.
jaehyojjang.dev nameserver = ns-cloud-d1.googledomains.com.

가용성을 위해 4대의 네임서버가 운용 중인 것을 볼 수 있다.


이번에는 jaehyojjang.dev의 IP 주소를 해당 네임서버에 직접 질의해보자.

# nslookup <도메인주소> <네임서버주소>
nslookup jaehyojjang.dev ns-cloud-d3.googledomains.com

# 출력
Name:   jaehyojjang.dev
Address: 185.199.109.153
Name:   jaehyojjang.dev
Address: 185.199.110.153
Name:   jaehyojjang.dev
Address: 185.199.108.153
Name:   jaehyojjang.dev
Address: 185.199.111.153

이번에는 Non-authoritative answer 없이 바로 A 레코드가 출력되는 것을 볼 수 있다.

📌 Non-authoritative answer가 뭐지?

왜 A 레코드를 질의했을 땐 위 문구가 뜨고, 네임 서버를 질의하면 안 나오는걸까?

Non-authoritative answer란, 현재 도메인이 실제로 사용하고 있는 DNS 서버가 아닌, 다른 DNS 서버에서 저장한 캐시를 보여주었다는 뜻이다.

위 예시에서는 실제로 사용하고 있는 네임서버를 지정해서 보여주니 Non-authoritative answer 답변이 없는 것이다.


AAAA Record

AAAA 레코드는, A 레코드와 동일한 역할을 수행한다.

차이점은 IPv4 주소 체계에서 쓰이는 A 레코드와 달리, AAAA 레코드는 IPv6 주소 체계에서 쓰인다.


CNAME

CNAME 레코드는

mail.jaehyojjang.devjaehyojjang.dev를 바라고 있습니다. 라고 말하는 역할을 한다.


만약 운영 중인 도메인의 구조가 아래와 같이 서브 도메인 구조로 되어있다고 가정해보자.

  • jaehyojjang.dev
    • mail.jaehyojjang.dev
    • test.jaehyojjang.dev

그리고 DNS 레코드가 아래와 같이 설정되어 있다고 가정해보자.

이름 타입
jaehyojjang.dev A 185.199.110.153
mail.jaehyojjang.dev CNAME jaehyojjang.dev
test.jaehyojjang.dev CNAME jaehyojjang.dev

A 레코드에 의하여 jaehyojjang.dev는 185.199.110.153을 가리키게 된다.
jaehyojjang.dev => 185.199.110.153


CNAME 레코드에 의하여 mail.jaehyojjang.devjaehyojjang.dev을 가리키게 된다.

그리고 다시 A 레코드에 의하여 jaehyojjang.dev은 185.199.110.153을 가리키게 된다.
mail.jaehyojjang.dev => jaehyojjang.dev => 185.199.110.153


그렇다면 test.jaehyojjang.dev도 위와 마찬가지일 것이다.
test.jaehyojjang.dev => jaehyojjang.dev => 185.199.110.153


그럼 CNAME 레코드의 용도는 무엇일까?

jaehyojjang.dev의 IP 주소인 185.199.110.153가 서버 이전 등으로 변경되었다고 가정해보자.

만약 mail, test도 각각 A 레코드를 지정해두었다면, 세 개 모두 A 레코드를 새로운 서버의 IP 주소로 변경해줘야 한다.
image
위 그림으로 예시를 든다면 A 레코드 주소를 기존 183.190.111.112에서 110.190.130.100으로 바꿔주는 작업이 필요했을 것이다.


하지만 CNAME으로 test, mailjaehyojjang.dev을 가리키도록 설정 되어있다면

실제로는 jaehyojjang.dev의 A 레코드만 변경하면 끝이다.
image
이처럼 CNAME은 IP 주소가 자주 바뀌는 상황에서 유용하게 사용 가능하다.


MX Record

Mail Exchanger 레코드.

해당 도메인을 메일 주소로 갖는 메일 서버를 MX 레코드를 통해서 선언할 수 있다.

MX 레코드가 해당 도메인에 설정되어 있어야, 해당 도메인을 이메일 주소로 사용할 수 있다.

MX 레코드는 일반적으로 도메인을 구입한 호스팅 사 (Cafe24, 가비아 등)에서 설정 가능하다.


아래 명령어로 도메인의 MX 레코드를 확인할 수 있다.

# nslookup -type=mx {도메인}
nslookup -type=mx jaehyojjang.dev

SOA Record

Start of Authority의 약어.

SOA 레코드는 네임서버가 해당 도메인에 관하여 인증된 데이터를 가지고 있음을 의미한다.

SOA 레코드가 없는 도메인은 네임서버에서 정상적으로 동작하지 않는다.

SOA 레코드는 도메인당 1개를 설정할 수 있다.


PTR Record

Pointer 레코드.

A 레코드의 반대 방향인 레코드이다.

A 레코드가 도메인네임에 대한 질의를 IP로 응답한다면, PTR 레코드는 IP에 대한 질의를 도메인네임으로 응답한다.

A 레코드와 달리, PTR 레코드는 1개의 IP에 1개의 도메인네임만 가질 수 있다.

이름
185.199.110.153 jaehyojjang.dev

TXT Record

TeXT 레코드의 줄임말.

TXT 레코드는 DKIM, DMARC, SPF 레코드를 설정하거나 사이트 확인용으로 쓰는 등, 여러 목적으로 사용할 수 있다.


예시

형식

example.com IN TXT "This domain name is reserved"

예시

jaehyojjang.dev 1 IN TXT "v=spf1 include:_spf.google.com ~all"

📌 SPF Record

SPF(Sender Policy Framework)는 도메인의 이메일을 보내도록 승인된 메일 서버를 명시 하는 이메일 인증 방법이다.

SPF 레코드를 사전에 설정하여 메일 서버 정보를 공개하면, 스푸핑을 방지할 수 있고, 수신자 측에서 스팸메일로 분류되는 것을 방지할 수 있다.

추가로 SPF 레코드는 지원 중단(deprecated) 되었으므로, 이제 SPF 레코드는 TXT 레코드에서 설정해야 한다.
(출처: https://cloud.google.com/dns/records?hl=ko)


SRV Record

Service 레코드.

SRV 레코드는 서비스를 호스팅하는 서버의 위치(호스트 이름 및 포트 번호)를 식별하는데 사용되는 DNS 레코드이다.

예를 들어, 서버의 특정 포트에서 비디오나 오디오 연결을 하려면 SIP 프로토콜을 사용해야 하는데,

이 SIP 프로토콜에 SRV 레코드가 들어간다.


형식

_service._proto.name. TTL class SRV priority weight port target.

설명

  • service
    • 서비스 이름. 앞에 언더바(_)가 붙는다.
  • proto
    • 서비스의 전송 프로토콜.
    • 일반적으로 TCP 또는 UDP이며, 앞에 언더바(_)가 붙는다.
  • name
    • 이 레코드가 적용되는 도메인 이름.
    • 점으로 끝남.
  • TTL
    • 표준 DNS TTL(Time to Live)
  • class
    • 표준 DNS class.
  • SRV
    • 레코드 유형
  • priority
    • 대상 호스트의 우선 순위
    • 값이 낮을수록 선호도가 높음
  • weight
    • 우선 순위가 같은 레코드에 대한 상대적 가중치.
      • 값이 높을수록 선택될 가능성이 높음.
  • port
    • 서비스의 포트.
  • target
    • 서비스를 제공하는 시스템의 정식 호스트 이름.
    • 점으로 끝남.

Loading script...