본문 바로가기

자격증

정보보안기사 (실기) / 리눅스마스터 1급 :: DNS(Domain Name System)

DNS(Domain Name System)은 전화번호부가 사람의 이름을 전화번호에 매핑하는 것처럼 도메인을 IP주소에 매핑하는 인터넷 서비스로 웹 브라우저에 입력한 웹 주소(URL)를 통해 웹 서버의 IP 주소를 알아보기 위해 DNS 쿼리가 만들어집니다. 예를 들면 URL www.sample.com을 사용하는 경우 www는 는 host 이름이고 sample.com이 도메인 이름이 되는 것입니다.  

 

 

 

■ 동작방식

 

DNS 동작방식
[ DNS 동작방식 ]

 

Recursive Server는 클라이언트 쿼리에 대한 적절한 IP 주소로 응답하기 위해 수 많은 DNS 조회를 수행하는 서버로 일반적으로 ISP(인터넷 서비스 공급업체- KT, kornet, 구글) 업체가 제공해 주는 DNS 서버가 이에 해당이 됩니다. Authoritative Server는 각 회사나 사이트별로 자신의 도메인을 관리하는 DNS 서버로 특정 도메인에 대한 정보를 관리(Zone)하면서 해당 도메인에 대한 쿼리에만 응답해 주는 DNS 서버입니다. 

 

윈도우의 경우는 쿼리에 대한 검색 순서가 로컬 DNS 캐시 → hosts.ics 파일 → hosts 파일 순으로 검색하고 찾기 못하면 설정되어 있는 DNS 서버로 요청하게 됩니다. 리눅스나 유닉스의 경우는 /etc/hosts 파일 → /etc/resolv.conf 파일 순으로 검색하게 됩니다. 참고로 /etc/hosts 파일은 도메인 또는 호스트 이름과 IP 주소를 매핑한 정보를 가지고 있는 파일이고 네임서버로 쿼리하기 전에 먼저 참조됩니다. 그리고 /etc/resolv.conf 파일은 기본 네임서버를 설정한 정보가 저장되어 있는 파일입니다.

 

※  hosts.ics 파일 

인터넷 연결 공유(ICS) 기능을 사용할 경우 클라이언트의 IP 주소를 강제로 지정하는 기능으로 hosts 파일보다 DNS 쿼리에 대한 검색 우선순위가 높습니다.

 

 

 

■ DNS 서버 Query / Response 

 

DNS UDP 응답

 

위 그림은 네임서버로 쿼리를 요청했을 때 응답 패킷에 대한 내용입니다. 일반적으응답 데이이터가  512 byte 이하일 경우 53/udp 포트를 사용합니다. 위 그림에서 보면 응답 데이터가 112 byte이기 때문에 53/udp(User Datagram Protocol)로 응답하는 것을 확인할 수 있습니다. 만약에 응답 데이터가 512 byte를 초과하는 경우에는  53/tcp 포트를 사용하게 됩니다. 그 이유는 응답 데이터 전송에 대한 신뢰성이 떨어지기 때문에 신뢰성 있는 전송을 보장하기 위해 53/tcp 포트를 사용하는 것입니다.

 

DNS 헤더에서 flag 중에 "Truncated" 설정이 되어있다면 53/udp 포트로 응답 데이터를 전송했지만 패킷 사이즈가 512 byte를 초과하여 53/tcp 포트로 재전송을 요청했다는 의미입니다.

 

 

 

■ DNS 쿼리 타입

 

DNS lookup 명령(nslookup, dig)은 존 파일에 저장된 레코드 타입(쿼리 유형)을 지정하여 쿼리하면 해당 타입으로 응답해 주게 됩니다.  아래 표는 쿼리 유형에 대한 설명입니다.

 

 쿼리 유형 설명 
 A (Address) 도메인의 호스트 이름에 대해 매핑된 IP 주소 (IPv6의 경우 AAA)
 ANY 도메인에 대한 모드 레코드 쿼리(캐시된 모든 레코드), ANY 유형은 요청 대비 응답 데이터의 크기가 크기 때문에 DNS 증폭 DRDOS 공격에 악용이 될 수 있습니다.
 MX (Mail Exchager)  도메인 이름을 해당 도메인의 메시지 전송 에이전트(메일 서버) 목록에 매핑합니다. 
 NS (Name Server) Authoritative 서버로 사용하도록 위임합니다.
 SOA (Start Of Authority)  Zone의 기본속성 정보(존 파일의 버전, 존 전송 주기 등) 쿼리
 TXT (Text)  도메인에 대한 텍스트 정보 쿼리. TXT 유형은  요청 대비 응답 데이터의 크기가 크기 때문에 DNS 증폭 DRDOS 공격에 악용이 될 수 있습니다.
CNAME (Canonical name) 호스트 이름을 다른 이름으로 별칭합니다.
HINFO (Host Information) 호스트의 CPU, 운영체제 정보를 확인할 수 있습니다.
 PTR (Pointer)  A 유형의 반대로 IP 주소를 도메인의 호스트 이름으로 매핑합니다.
AXFR (Authoritative Zone Transfer) 존 파일 전송 시 존 버전에 상관없이 무조건 존 파일을 전송합니다. 

예제) # dig @[Master DNS 서버] [zone 이름] axfr
IXFR (Incremental Zone Transfer) 존 파일 전송 시 존 버전을 비교하여 상위 버전일 경우에만 존 파일을 전송합니다.

예제) # dig @[Master DNS 서버] [zone 이름] ixfr=[버전정보]

 

nslookup 명령을 사용할 경우 > server [DNS 서버]  지정을 통해 기본 DNS 서버를 지정하여 이용할 수 있고, > set type=[쿼리 타입] 을 통해서는 쿼리 유형을 지정하여 원하는 유형으로 쿼리를 수행할 수도 있습니다.

 

 

 

■ DNS Cache 관련 명령어

 

윈도우에서 ipconfig /displaydns 명령은 로컬 DNS 캐시 정보를 조회하기 위한 명령어로 TTL(Time to Live)은 해당 캐시 정보를 유지하는 시간을 의미하는 것으로 만료가 되면 해당 정보는 삭제가 됩니다.

 

C:\Users\MSPARK>ipconfig /displaydns

Windows IP 구성

    kubernetes.docker.internal
    ----------------------------------------
    데이터 이름 . . . . . : kubernetes.docker.internal
    데이터 유형 . . . . . : 1
    TTL(Time To Live) . : 0
    데이터 길이 . . . . . : 4
    섹션 . . . . . . . : 응답
    (호스트) 레코드 . . . : 127.0.0.1

 

DNS Spoofing 공격의 경우 위 내용의 DNS 캐시 정보를 조작하여 의도하지 않은 주소로 접속하게 만들 수 있습니다.   ipconfig /flushdns 명령어로 로컬 DNS 캐시 정보를 삭제할 수 있습니다.