Domain Name System은 도메인(호스트) 이름을 IP 주소로 변환하는 네트워크 시스템이다.
그 외에도 도메인 이름에 연결된 메일 서버, 네임서버 등의 정보를 저장하고 조회할 수 있도록 구성된 분산형 계층적 시스템이다.
일반적으로 우리가 웹페이지에 접근할 때에는 기억하고 쓰기 편한 test.com 등의 도메인 이름을 입력하여 접근한다.
그러나 실제로 인터넷 상에서 서버를 찾아가기 위해서는 IP 주소가 필요하다.
이때, DNS는 도메인 이름을 IP 주소로 변환한다.
여러 개의 DNS 서버로 구성 된 분산 시스템이다.
통신에 일반적으로 UDP 53번 포트를 사용한다. 512Byte를 초과할 시, DNS Header Flags에서 Truncated를 세팅하고 TCP 53번 포트를 사용한다.
일반적인 웹페이지 도메인 이름의 DNS 변환 과정을 살펴보기 위해 관련된 서버들을 알아두어야 한다.
Recursive DNS Resolver
: 웹 브라우저 등의 애플리케이션을 통해 클라이언트로부터 최초로 쿼리를 받는 서버. 클라이언트의 DNS 쿼리를 처리하기 위해(IP 주소를 알아내기 위해) 재귀적으로 DNS 쿼리를 진행한다.
Root DNS Server
: 호스트 이름을 IP 주소로 변환할 때 처음으로 거치게 되는 루트 서버다. 다음 네임 서버(TLD DNS Server)의 IP 주소를 제공한다.
TLD DNS Server
: TLD(최상위 도메인) 서버로, 호스트 이름 마지막 부분을 호스팅한다. 즉, test.com에서 .com에 해당하는 최상위 도메인 영역을 관리하며, 해당 TLD 아래에 위임된 네임 서버(전체 도메인 네임을 지닌 DNS Server)의 IP 주소를 제공한다.
(Authoritative) DNS Server
: 재귀적인 서버 쿼리의 종착점이다. 해당 이름이 속한 DNS Zone에 대해 권한이 있다면, 요청한 호스트 이름의 IP 주소를 최초 요청자인 Recursive DNS로 보낸다. test.com DNS 서버일 경우, own.test.com처럼 test.com의 서브 도메인들에 대한 IP 주소도 모두 관리한다. 다만 일부 서브 도메인이 별도의 Zone으로 위임된 경우에는 직접 관리하지 않는다.
하나의 DNS 서버가 모든 정보를 갖고 있는 것이 아니라, 여러 DNS 서버들이 계층적인 구조를 형성한다.

DNS는 주요 도메인 네임/IP 외에도 여러 레코드 유형을 사용하여 매핑 및 확인을 제공한다.
DNS 영역 내의 특정 도메인에 대한 매핑 및 정보를 포함하는 파일을 DNS Zone File이라고 한다.
DNS Zone File에는 도메인 이름에 대한 IP 주소 매핑 정보가 담긴 DNS 레코드들이 저장된다.
DNS 레코드는 (Name, Value, Type, TTL) 형식으로 구성된다.
(ex. Name: test.com, Value: 10.10.10.10, Type: A, TTL: 14400)
일반적으로 DNS Zone에는 N, SOA 레코드가 필요하다.
- NS : 이름 서버 레코드. 도메인에 대한 권한 있는 이름 서버를 나타낸다.
- SOA : 권한 시작 레코드. 해당 DNS 영역의 주요 권한 이름 서버 명시.
그 이외에 여러 다른 유형의 레코드들이 포함된다.
- A : IPv4 주소.
- AAAA : IPv6 주소.
- MX : 메일 교환기 레코드. 도메인에 대한 SMTP 이메일 서버를 지정.
- CNAME : 표준 이름 레코드. 별칭 호스트 이름을 다른 도메인(정규 도메인)으로 매핑. 예를들어 own.test.com에 대한 IP 주소를 쿼리하는 경우, 먼저 own.test.com 도메인에 대한 CNAME 레코드를 확인하고, own.test.com이 test.com에 대한 alias임을 확인하였으니, test.com 도메인에 대한 DNS 쿼리를 요청하여 IP 주소를 반환한다.
- PTR : 포인터 레코드. 역방향 DNS Zone에서 IP 주소에 대응하는 도메인 이름을 지정.
- TXT : 텍스트 레코드. 메모 및 이메일 인증을 위한 발신자 정책 프레임워크 같은 자동화된 처리에 사용.


Q. 사용자가 웹페이지 접근 시, 무조건 DNS 쿼리가 진행되는지?
A. ㄴㄴ 웹에 접근할때마다 매번 DNS 질의 과정이 수행되면 성능이 떨어지거나 네트워크 부하가 발생할 수 있다. DNS 캐싱, hosts 파일을 이용하여 이를 방지한다.
일반적으로 웹 브라우저에서는 일정 시간 동안 DNS 레코드를 캐시하도록 한다.
이러한 DNS 캐싱이 되어있다면 재귀적인 DNS 쿼리를 요청하지 않고 바로 IP 주소를 확인하여 통신이 가능한다.
Recursive DNS Resolver에서도 일정 시간 동안 DNS 레코드를 캐싱하므로, 자주 질의되는 도메인 이름에 대해서는 바로 IP를 받아올 수 있다.
Q. DNS 서버들은 인터넷 어디서든 사용할 수 있는 공용인지?
A. Public DNS들은 ISP 또는 각 도메인 측에서 관리하며 인터넷에서 누구나 접근 가능하다.
Private DNS들은 기업 네트워크나 Virtual Private Clooud 같은 폐쇄된 내부 네트워크 내부 사용자들만 조회 가능하다. 이러한 Private DNS들은 내부 URL과 IP 주소를 외부에서 숨기며, 내부 사용자들에게만 DNS 서비스를 제공한다.
Public DNS와 Pricate DNS가 결합된 방식인 Split-Horizon DNS가 일반적인 기업 환경에서 사용된다. 이 구성에서는 동일한 도메인 이름에 대해 질의자의 네트워크 상 위치에 따라 서로 다른 DNS 응답을 제공한다. 내부에서는 사설 IP를 반환하고, 외부에서는 공인 IP를 반환하는 형태로 주로 구성된다.
DNS Spoofing
: 일반적으로 DNS Server에 캐시 포이즈닝을 이용하는 공격 방식.
공격자는 Recursive DNS Resolver의 캐시에 악의적으로 다른 주소 레코드를 삽입하여 Resolver가 도메인 질의에 대해 위조된 IP 주소를 반환하게 한다. 사용자가 해당 IP 주소로 접근하게 되면 악성 사이트로 리다이렉션 시킬 수 있다.
정상 응답보다 공격자가 더 빠르게 DNS 응답을 보내는 형식의 Sniffing 기반 DNS Spoofing도 있다.
DNS Amplification 공격
: 공격자가 출발지 IP를 특정 사용자 IP 주소로 위조하여 DNS 서버에 쿼리를 보내는 형식의 DDoS 공격. DNS 서버는 대량의 응답을 사용자 IP 주소로 전송하게 된다.
비연결적이며 출발지 IP 위조가 가능한 UDP 기반의 DNS 질의의 특성을 악용한다. 작은 쿼리로도 대량의 트래픽으로 증폭되어 사용자에게 전달되는 점을 이용하여 리소스 과부하를 일으킨다.