DNS 를 통해 도메인을 IP 주소로 바꿔오는 과정

상대 컴퓨터와 통신을 하기 위해서 나의 MAC 주소, 나의 IP 주소, 상대 MAC 주소를 알았다면 마지막으로 상대의 IP 주소를 알아야 한다.

물론 상대의 IP 주소를 201.123.42.180 처럼 4개 옥텟으로 구성된 숫자를 알고 있으면 좋지만, 전세계에 존재하는 모든 아이피들을 다 외우기 어렵기 때문에 도메인을 사용한다.

예를 들어 google.com142.250.204.78 을, naver.com125.209.222.142 를 대신한다.

브라우저에서 google.com 을 쳐도 해당 IP 를 갖는 웹서버와 통신할 수 있는 이유는, 바로 DNS 서버를 통해 도메인을 IP 로 변환해오기 때문이다.


DNS

DNS 는 Domain Name Server, Domain Name System, Domain Name Service 등으로 불리지만, 어쨌든 도메인을 IP 로 바꿔 주는 역할을 한다.

인터넷의 발달로 네트워크가 급속도로 늘어남에 따라, 사용자 컴퓨터에 수많은 다른 컴퓨터들을 관리하기가 어려워진 대신 사용자가 DNS 서버를 참조하겠다고 설정하면 해당 도메인에 대한 쿼리를 DNS 서버에서 처리해준다.

도메인을 서버에 질의할 때, 우선 로컬 컴퓨터에 있는 도메인을 관리하는 파일(/etc/hosts)에서 해당 도메인에 대응되는 IP 가 명시되어 있는지 확인한 뒤, 다음으로는 OS 에서 관리하는 캐시테이블에서 찾고, 그럼에도 없으면 DNS 서버로 넘어간다.

이 때 DNS 서버도 계층적으로 이루어져 있다.

  • 로컬 DNS - 루트 DNS - 다음 계층의 책임 DNS - 다음 계층의 책임 DNS

처음에는 사용자의 네트워크를 관리하는 조직이나 기관에서 운영하는 로컬 DNS 서버에 질의를 한다.

예를 들어 우리 집에 KT 인터넷이 들어온다고 하면, KT 가 운영하는 로컬 DNS 에 물어본 뒤, 여기에 없으면 전 세계에 퍼져있는 13개 루트 DNS 에 질의를 날리고, 루트가 다음 책임 DNS 서버를 알려주면, 받아온 책임서버에 다시 도메인을 질의하는 방식으로 이루어진다.


반복적 질의 vs 재귀적 질의

위와 같은 방식을 반복적 질의라고 한다.

루트 DNS 에 물어보고 답을 받아오고, 받아온 답을 가지고 다시 다음 DNS 에 물어봐서 답을 받아오고, 또다시 받아온 답을 가지고 다음 DNS 에 물어봐서 답을 받아온다.

재귀적 질의는 DNS 서버에 쿼리를 날렸을 때 DNS 에서 재귀적으로 다음 DNS 를 호출해 답을 받아오는 방식이다.

예를 들어 루트 DNS 에 질의를 날렸을 때, 없을 경우 루트 DNS 가 책임서버 아이피를 알려주는 대신 자기가 직접 쿼리를 날리고, 다음 책임서버 역시 자기가 직접 다음 서버에게 쿼리를 날려 쭉쭉 반환되어 사용자에게 도착한다.

재귀적 질의는 루트서버나 책임서버들이 내부적으로 캐싱을 해놓을 수 있기 때문에 다른 곳에서 질의가 와도 캐싱된 걸 확인하여 좀 더 빠르게 응답할 수 있다는 장점이 있지만, 보안적인 문제가 있다.


/etc/hosts

DNS 서버에 질의를 날리기 앞서 로컬 컴퓨터에 있는 도메인 관리 파일을 참조해본다고 하였는데, UNIX 계열에서는 /etc/hosts 에서 관리한다.

파일을 cat 으로 확인해보면 다음과 같이 뜬다.

cat /etc/hosts

# output
127.0.0.1	localhost
127.0.1.1	bconfiden2

111.222.333.444 domain1
203.204.205.206 domain2
10.10.10.100    domain3

::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

자주 사용하는 서버를 domain1~3 처럼 IP 주소를 등록해놓으면 ssh username@domain1 과 같이 편리하게 사용할 수 있다.