본문 바로가기

CS/네트워크

DNS Recursive Query를 직접 해보자

2021년 11월 29일에 작성된 글입니다.

Recursive Query

호스트 이름을 IP 주소로 변환해주는 DNS는 계층적 구조를 가지고 있다.

루트 네임 서버

해당 TLD 네임 서버

해당 도메인 네임 서버

루트 네임 서버가 모든 도메인의 레코드를 가지고 모든 쿼리를 감당하기에는 너무 부담스럽기 때문에 하위 네임 서버가 레코드를 가지고, 상위 네임 서버는 하위 네임 서버의 주소를 반환한다.

루트 네임 서버에서 시작해 상위 네임 서버에서 하위 네임 서버로 해당 도메인의 네임 서버까지(원하는 호스트 네임의 레코드가 나올 때까지) 재귀적으로 쿼리하는 것


일반적인 상황에서의 DNS 쿼리

DNS 서버 주소를 따로 건드리지 않았다면 기본적으로 사용하는 통신사의 DNS 서버로 지정이 되어있을 것이다.
사용자는 일반적으로 루트 네임 서버나 해당 도메인의 네임 서버가 아니라 통신사 DNS 서버 같은 로컬 DNS 서버에 쿼리를 하게 된다.

DNS Resolver 라고도 한다.

  1. 브라우저, 운영체제의 DNS 캐시, hosts
  2. 로컬 DNS 서버에 질의
  3. 로컬 DNS 캐시
  4. 루트 네임 서버
  5. 해당 TLD 네임 서버
  6. 해당 도메인 네임 서버
  7. 사용자에게 반환

Root Servers

DNS의 최상위 계층에 위치하는 루트 네임 서버는 root 또는 root-servers.net의 네임서버를 조회해보면 알 수 있다.

1. root NS 레코드 조회

nslookup -type=ns .
(root)  nameserver = e.root-servers.net
(root)  nameserver = j.root-servers.net
(root)  nameserver = m.root-servers.net
(root)  nameserver = i.root-servers.net
(root)  nameserver = b.root-servers.net
(root)  nameserver = c.root-servers.net
(root)  nameserver = k.root-servers.net
(root)  nameserver = l.root-servers.net
(root)  nameserver = d.root-servers.net
(root)  nameserver = g.root-servers.net
(root)  nameserver = h.root-servers.net
(root)  nameserver = a.root-servers.net
(root)  nameserver = f.root-servers.net

a.root-servers.net      internet address = 198.41.0.4
b.root-servers.net      internet address = 199.9.14.201
c.root-servers.net      internet address = 192.33.4.12
d.root-servers.net      internet address = 199.7.91.13
e.root-servers.net      internet address = 192.203.230.10
f.root-servers.net      internet address = 192.5.5.241
g.root-servers.net      internet address = 192.112.36.4
h.root-servers.net      internet address = 198.97.190.53
i.root-servers.net      internet address = 192.36.148.17
j.root-servers.net      internet address = 192.58.128.30
k.root-servers.net      internet address = 193.0.14.129
l.root-servers.net      internet address = 199.7.83.42
m.root-servers.net      internet address = 202.12.27.33
a.root-servers.net      AAAA IPv6 address = 2001:503:ba3e::2:30
b.root-servers.net      AAAA IPv6 address = 2001:500:200::b

루트 네임 서버는 a.root-servers.net부터 m.root-servers.net까지 13개의 서버가 있다는 것을 알 수 있다.

실제로 서버가 13대만 있는 것은 아니다.

2. root-servers.net NS 레코드 조회

nslookup -type=ns root-servers.net
...
root-servers.net        nameserver = l.root-servers.net
root-servers.net        nameserver = a.root-servers.net
root-servers.net        nameserver = j.root-servers.net
root-servers.net        nameserver = h.root-servers.net
root-servers.net        nameserver = m.root-servers.net
root-servers.net        nameserver = c.root-servers.net
root-servers.net        nameserver = d.root-servers.net
root-servers.net        nameserver = k.root-servers.net
root-servers.net        nameserver = g.root-servers.net
root-servers.net        nameserver = f.root-servers.net
root-servers.net        nameserver = e.root-servers.net
root-servers.net        nameserver = i.root-servers.net
root-servers.net        nameserver = b.root-servers.net

a.root-servers.net      internet address = 198.41.0.4
b.root-servers.net      internet address = 199.9.14.201
c.root-servers.net      internet address = 192.33.4.12
d.root-servers.net      internet address = 199.7.91.13
e.root-servers.net      internet address = 192.203.230.10
f.root-servers.net      internet address = 192.5.5.241
g.root-servers.net      internet address = 192.112.36.4
h.root-servers.net      internet address = 198.97.190.53
i.root-servers.net      internet address = 192.36.148.17
j.root-servers.net      internet address = 192.58.128.30
k.root-servers.net      internet address = 193.0.14.129
l.root-servers.net      internet address = 199.7.83.42
m.root-servers.net      internet address = 202.12.27.33
a.root-servers.net      AAAA IPv6 address = 2001:503:ba3e::2:30
b.root-servers.net      AAAA IPv6 address = 2001:500:200::b

3. root-servers.net whois 조회

whois root-servers.net

_Windows_에서는 별도 설치가 필요하다.

...
Name Server: A.ROOT-SERVERS.NET
Name Server: B.ROOT-SERVERS.NET
Name Server: C.ROOT-SERVERS.NET
Name Server: D.ROOT-SERVERS.NET
Name Server: E.ROOT-SERVERS.NET
Name Server: F.ROOT-SERVERS.NET
Name Server: G.ROOT-SERVERS.NET
Name Server: H.ROOT-SERVERS.NET
Name Server: I.ROOT-SERVERS.NET
Name Server: J.ROOT-SERVERS.NET
Name Server: K.ROOT-SERVERS.NET
Name Server: L.ROOT-SERVERS.NET
Name Server: M.ROOT-SERVERS.NET
...

whois 조회 결과 아래쪽을 보면 Name Server를 알 수 있다.


직접 해보자

www.google.com을 루트 네임 서버에서 시작해서 하위 네임 서버로 레코드 값이 나올 때까지 반복한다.

1. 루트 네임 서버에 www.google.com 쿼리

루트 네임 서버 중에 하나를 골라 쿼리를 날려보자.

nslookup www.google.com a.root-servers.net

서버 주소에 IP 주소가 아닌 도메인 네임을 넣었으므로 실제로는 a.root-servers.net의 DNS 레코드 조회 과정이 있을 것이다.

...
서버:    UnKnown
Address:  198.41.0.4

이름:    www.google.com
Served by:
- e.gtld-servers.net
          192.12.94.30
          2001:502:1ca1::30
          com
- b.gtld-servers.net
          192.33.14.30
          2001:503:231d::2:30
          com
- j.gtld-servers.net
          192.48.79.30
          2001:502:7094::30
          com
- m.gtld-servers.net
          192.55.83.30
          2001:501:b1f9::30
          com
- i.gtld-servers.net
          192.43.172.30
          2001:503:39c1::30
          com
- f.gtld-servers.net
          192.35.51.30
          2001:503:d414::30
          com
- a.gtld-servers.net
          192.5.6.30
          2001:503:a83e::2:30
          com
- g.gtld-servers.net
          192.42.93.30
          2001:503:eea3::30
          com
- h.gtld-servers.net
          192.54.112.30
          2001:502:8cc::30
          com
- l.gtld-servers.net
          192.41.162.30
          2001:500:d937::30
          com

예상대로 www.google.com의 레코드가 아닌 com의 네임 서버(gtld-servers.net)가 반환된다.

2. 해당 TLD 네임 서버에 www.google.com 쿼리

루트 네임 서버가 알려준 TLD(여기서는 com) 네임 서버 중에서 하나를 골라 쿼리를 날려보자.

nslookup www.google.com a.gtld-servers.net
...
서버:    UnKnown
Address:  192.5.6.30

이름:    www.google.com
Served by:
- ns2.google.com
          2001:4860:4802:34::a
          216.239.34.10
          google.com
- ns1.google.com
          2001:4860:4802:32::a
          216.239.32.10
          google.com
- ns3.google.com
          2001:4860:4802:36::a
          216.239.36.10
          google.com
- ns4.google.com
          2001:4860:4802:38::a
          216.239.38.10
          google.com

이번에는 google.com의 네임 서버가 반환된다.

번외: google.com whois 조회

google.com의 네임 서버가 위의 결과와 같은지 whois를 통해 확인해보자.

whois google.com
...
Name Server: ns3.google.com
Name Server: ns1.google.com
Name Server: ns4.google.com
Name Server: ns2.google.com
...

3. 해당 도메인의 네임 서버에 www.google.com 쿼리

nslookup www.google.com ns1.google.com
서버:    ns1.google.com
Address:  216.239.32.10

이름:    www.google.com
Addresses:  2404:6800:4004:823::2004
          142.250.199.100

드디어 원하는 값을 찾았다!

만약 www.google.com에 A 또는 AAAA 레코드가 아닌 NS 레코드가 지정되어 있다면 앞의 과정과 마찬가지로 하위 네임 서버의 주소를 반환했을 것이다.


번외: 루트 네임 서버는 다른 루트 네임 서버의 주소를 알고 있을까?

루트 네임 서버에 다른 루트 네임 서버의 DNS를 질의했을 때 어떻게 나오는지 알아보자.

nslookup b.root-servers.net a.root-servers.net
...
서버:    UnKnown
Address:  198.41.0.4

이름:    b.root-servers.net
Addresses:  2001:500:200::b
          199.9.14.201

하위 네임 서버의 주소를 반환하지 않고 바로 알려준다!

루트 네임 서버는 root-servers.net의 네임 서버이기도 하다.

번외: net 네임 서버는 루트 네임 서버의 주소를 알고 있을까?

이번에는 루트 네임 서버가 아닌 net의 네임 서버는 루트 네임 서버의 주소를 질의했을 때 어떻게 나오는지 알아보자.

nslookup b.root-servers.net a.gtld-servers.net
서버:    UnKnown
Address:  192.5.6.30

이름:    b.root-servers.net
Served by:
- a.root-servers.net
          198.41.0.4
          2001:503:ba3e::2:30
          root-servers.net
- h.root-servers.net
          198.97.190.53
          2001:500:1::53
          root-servers.net
- c.root-servers.net
          192.33.4.12
          2001:500:2::c
          root-servers.net
- g.root-servers.net
          192.112.36.4
          2001:500:12::d0d
          root-servers.net
- f.root-servers.net
          192.5.5.241
          2001:500:2f::f
          root-servers.net
- b.root-servers.net
          199.9.14.201
          2001:500:200::b
          root-servers.net
- j.root-servers.net
          192.58.128.30
          2001:503:c27::2:30
          root-servers.net
- k.root-servers.net
          193.0.14.129
          2001:7fd::1
          root-servers.net
- l.root-servers.net
          199.7.83.42
          2001:500:9f::42
          root-servers.net
- m.root-servers.net
          2001:dc3::35
          202.12.27.33
          root-servers.net

당연하게도(?) root-servers.net의 네임 서버 주소를 반환한다.

'CS > 네트워크' 카테고리의 다른 글

[네트워크] 라우팅(routing)  (0) 2024.09.04