개인/리눅스

[리눅스] DNS 서버의 구성과 설치방법

OmeGa2 2020. 2. 28. 18:04

DNS (Domain Name System) 란?

인터넷에서는 IP주소를 이용해 여러 호스트를 식별하게 된다.

하지만 숫자로 이루어진 IP주소는 특정 컴퓨터를 찾는데에 있어 어려움이 생길 수 있으며

인터넷 사이트 수가 늘어남에 따라 IP번호를 외워서 접속하는 것은 현실적으로 힘들다.

 

DNS는 이런 IP주소를 쉽게 구분하기 위해 도메인 이름을 부여해서 관리하는 것을 말한다.

특정 컴퓨터에 접속하려는 사람들이 알아보기 쉬운 숫자와 문자를 이용해 구성하면서

의미를 부여해 도메인 이름을 만든다.

 

이후 사람들은 컴퓨터의 IP주소가 아닌 도메인 이름으로 접속할 수 있게 된다.

IP주소 기반인 인터넷 체계를 도메인명 기반으로 사용하기 위해 필수적으로 구성해야 하는

DNS 서버는 도메인명을 관리하고 클라이언트에서 도메인의 IP주소를 조회하는 경우 반환하기도 한다.

 

DNS 서버에서는 /etc/named.conf 파일에 zone 구문을 설정한 뒤,

zone 구문에서 참조할 파일을 별도로 생성해야 한다.

 

zone 파일은 정방향/역방향으로 나뉘며 IP주소를 문자로 표현한 것을 정방향이라고 하고

문자를 IP주소로 변환시키는 것을 역방향이라고 한다.

 

IP주소에 숫자와 문자를 이용한 도메인명 생성

IP주소를 문자로 표현 = 정방향

문자를 IP주소로 표현 = 역방향

 

설정파일에 zone 구문 설정

= 이후 참조할 zone 파일을 별도로 생성

 

 

 

도메인 이름 관리 기구


1. IANA(Internet Assigned Number Authority)

 = 인터넷 할당 번호 관리 기관

 

IP 주소, 최상위 도메인을 관리하는 단체로 전세계의 DNS를 관리하고 조정하는 기구이다.

ISP (인터넷 서비스 제공자)는 IANA를 통해 도메인 이름을 등록하고 IP주소 할당에 대한 일을 조정한다.


2. ICANN(internet Corporation for Assigned Names and Number)

 = 국제 인터넷주소 관리 기구


인터넷 도메인 이름과 주소를 지정하는 미국의 비영리 사설기관 으로 주요 역할은
인터넷 도메인이름 관리 시스템의 기술적 관리, ip주소 공간 할당, 프로토콜 파라미터 지정 등이며
해당 업무를 조정하는 범 세계적 합의체로서 미국 정부가 승인한 기관


3. KRNIC

 = 한국 인터넷 정보 센터

 

KISA (한국 인터넷 진흥원) 의 산하조직이며 국내 인터넷 업무를 담당한다.

IANA에서 전 세계의 인터넷 주소 자원을 총괄한다면 KRNIC는 국내 인터넷 주소 자원을

총괄 관리하는 역할을 수행한다. 

주요 업무는 kr 도메인에 대한 업무, 인터넷 주소에 관한 정책 개발, 도메인 네임 등록 업무,

IP주소 AS번호 등을 할당하고 인물정보 DB 관리 등이 있다.

 

 

DNS 서버의 기능

 

1. 도메인 네임 공간 및 리소스 레코드

 

- 도메인 네임 공간

도메인 네임의 계층적 구조 공간의 분배와 도메인 네임 할당기관을 통해 체계적으로 관리된다.

인터넷상에서 특정 도메인 네임은 언제나 유일한 이름으로써 유지한다.

 

- 리소스 레코드

도메인 네임 공간 중에서 지정된 도메인네임에 대한 필요한 인터넷 자원 정보를 매핑하는 수단을 제공한다.
www.google.com 의 IP주소가 100.100.100.100일 경우, 이것을 인터넷상에서 알려주기 위해서
www.google.com 이라는 이름에 대해 IP주소 속성을 연결시켜서 DNS 데이터베이스를 구성해야 한다.
도메인네임이 가지는 속성정보를 지정하는 수단으로 정의된 것을 리소스 레코드 라고 한다.

 

 

2. 네임서버 (NS)

도메인 존의 정보를 소유하고 이에 대한 질의에 응답하는 역할을 수행한다.
DNS서버라고 부른다.

 

 

3. 리졸빙 (reslolving)

네임서버에 의해 구성된 도메인 데이터베이스를 검색하는 역할
요청된 리소스 레코드가 존재하는 위치를 도메인 네임 시스템에서 찾고,

이 리소스레코드의 정보를 최종 응답으로 되돌려 주는 기능을 담당한다.


전체 DNS에 대해 전체 도메인 데이터베이스를 검색할 수 있도록 도메인네임 시스템 검색의

시작점이 되는 루트 네임서버의 IP주소 정보를 자신의 환경 구성 파일로 가지고있다.


동일한 DNS질의를 짧은 시간내에 빈번하게 반복하는 것을 방지하기 위해서 캐시를 내부에 구현한다.
DNS의 구성요소간에는 상호 도메인 데이터베이스의 검색과 응답을 위한 프로토콜이 필요하다.

 

- DNS 프로토콜
DNS프로토콜은 네트워크를 경유하여 DNS 구현요소 간에 질의와 응답을 수행하기 위한

클라이언트/서버 모델의 어플리케이션 프로토콜이다.
DNS프로토콜은 TCP및 UDP포트 번호 53번을 사용한다
네임서버는 TCP와 UDP 53번 포트를 디폴트 포트로 해서 네트워크상의 요청에 대기한다.
DNS질의 대부분은 UDP포트 53번을 사용하여 질의와 응답이 이루어진다.

 

DNS 서버의 종류

DNS 서버는 총 3가지의 종류가 있다.

 

1. Primary Name Server 

주 DNS 서버, Master DNS라고도 불리며 도메인을 관리하기 위해 필수적으로 구성해야 하는 서버이다.

도메인이 등록할 때 이 서버의 IP주소를 등록하고, 자체 도메인에 대한 정보를 관리한다.

 

주 네임서버는 자체가 도메인에 관련된 정보를 가지고 있으며, 도메인 등록기관에 도메인을 등록할때

주 DNS 서버를 등록하고 주 네임서버에 등록된 도메인을 IP로 변환하는 역할을 한다.

또한 zone 파일 정보를 유지하며 질의에 응답하고, 정보를 갱신하는 등 도메인을 관리한다.

 

 

2. Secondary Name Server (2차서버)

보조 DNS서버, Slave DNS 라고도 불리며 주 네임서버의 zone 파일을 백업하는 역할을 수행한다.

외부 클라이언트에서 이 서버를 2차 DNS 서버로 설정하면 주 서버가 다운된 상태라도 정상적으로

해당 도메인에 대해 reslolving 정보를 제공한다.

 

즉, 보조 네임서버는 주 네임서버가 장애발생을 대비한 백업의미로 사용된다.

보조 네임서버는 Primary 서버의 정보를 가지고 있으며 지속적으로 네임서버의 문제가 발생하는

경우를 대비해서 주기적으로 도메인 정보를 복제한다.

또한 다수의 Secondary 서버를 사용할 수도 있다.

 

 

3. Caching Name Server

캐싱 DNS서버는 관리하는 도메인 없이 reslolving 만을 제공하기 위해 구성하는 서버이다.

도메인에 대한 reslolving  결과를 저장하고 서버에 기록된 정보에 대한 요청이 들어올 경우

직접 조회하지 않고 바로 응답해 주는 역할을 수행한다.

 

또한, 인터넷 사용속도를 높이기 위해 사용되기도 한다.

도메인명의 IP를 알아내기 위해서는 여러 서버에 쿼리를 보내게 되는데, 수많은 사용자가 여러 서버에

쿼리를 보내게 되면 DNS서버에 부하가 발생하며 속도가 느려진다.

 

이런 문제를 해결하기 위해 Caching를 사용한다.

한번이라도 쿼리한 도메인에 대해 TTL(캐시가 유효한 시간)이 부여되어 TTL을 기준으로 시간이 지나면

다시 DNS 서버에 쿼리를 보낸다. 즉, TTL 값을 높에 잡으면 DNS서버의 부하를 줄일 수 있다.

 

Primary 네임서버    : 도메인 관리를 총괄하는 주 서버

Secondary 네임서버 : primary 서버의 정보를 가지는 2차 DNS서버, 백업서버

Caching 네임서버    : 관리하는 도메인 없이 reslolving 주소변환 만을 수행 하며,

                          한번 쿼리한 도메인에 대해 TTL(캐시가 유효한 시간)을 가진다.

 

 

DNS 서버 프로그램 BIND 패키지 설치

bind는 가장 널리 쓰이는 DNS 서버 프로그램으로 named 라는 이름의 데몬을 사용한다.

 

레드햇 계열의 리눅스는 bind, bind-utils, bind-libs 3개의 패키지로 배포되고 있으며

yum 명령을 통해 쉽게 설치할 수 있다.

 

]# yum install bind* 

 

bind 패키지 설치

 

■ 설치되는 주요 패키지
bind           : DNS서버 구축 프로그램 제공
bind-utils    : DNS서버 질의를 위해 사용되는 유틸리티 모음
bind-libs     : BIND와 BIND유틸리티 프로그램이 사용하는 라이브러리 패키지
bind-chroot : BIND의 chroot(change root)환경을 위해 사용되는 파일 제공

 

 

bind 관련 파일

/etc/named.conf : 전반적인 환경 설정을 담당 파일로 서버에서 사용하는 zone 파일을 지정한다.

/var/named       : 루트 도메인 서버의 정보가 담긴 named.ca와,

                       사용자가 선언하는 zone 파일 등이 위치한다.

/etc/rc.d/init.d/named : DNS 서버 가동을 위한 스크립트로 named 데몬을 제어한다.

bind-chroot 패키지는 보안 강화를 위해 추가적으로 설치할 수 있는 패키지다.

이 패키지는 주요 항목의 위치가 변경된다.

환경설정 파일 : /etc/named.conf -> /var/named/chroot/etc/named.conf

zone 파일 위치 : /var/named -> /var/named/chroot/var/named

 

 

DNS 설정파일 및 서버 구성

DNS 서버에서 도메인을 설정하기 위해서는 설정파일 (/etc/named.conf) 에서

zone 구문에 도메인을 추가하고, 읽어올 DB 참조파일 (정,역방향)을 만들어야 한다.

 

도메인 설정파일 (/etc/named.conf)

DNS 서버의 환경에 대한 설정과 운영하는 도메인에 대한 존 파일 및 리버스 존 파일을 지정한다.

주석은 C언어에서의 /* */ 과 // , 유닉스에서 사용하는 # 등을 모두 사용할 수 있다.

이 파일은 options, logging, zone, acl 등 여러 구문으로 나뉘며 각 구문은 중괄호 "{}" 로 묶인다.

 

1. options 구문

 

DNS 서버의 동작 및 제어와 관련된 여러 가지 설정을 하는 영역으로,

zone 파일이 위치하는 디렉터리를 명기한다.

 

listen-on port 53 { 127.0.0.1; };

 = 127.0.0.1 : 자기 자신주소  {any;}입력시 외부에서 누구든 접속허용

 

listen-on-v6 port 53 {;;1;};

 = IPv6의 운영설정내용

 

directory    "/var/named";

 = zone 파일이 위치하는 디렉토리명

 

dump-file    "/var/named/data/cache_dump.db";

 = named는 정보가 갱신될 때 dump 파일로 저장하는데, 덤프파일이 생성될 위치와 파일명을 지정한다.

 

statistics-file    "/var/named/data/named_stats.txt";

 = 네임 서버의 통계 파일을 생성할 위치와 파일명을 지정한다.

 

memstatistics-file    /var/named/data/named_mem_stats.txt";

 = 네임 서버의 메모리 통계 파일을 생성할 위치와 파일명을 지정한다.


allow-query {localhost;};

allow-query { 192.168.0/24 };

 = 네임 서버에 질의할 수 있는 호스트를 지정한다.

 localhost가 적힌 자리에 허용 ip나 대역을 적으면된다.

 네트워크 대역에 속한 호스트만이 질의할 수 있다.

 

datasize 512M;

 = DNS 관련 정보를 캐싱하는데 사용하는 메모리를 제한한다.

 

recursion yes;

 = 하위 도메인에 대한 검색 가능 여부를 지정한다.

 

 

2. logging 구문

디버그할때 참고할수있는 로그파일(named.run)의 위치 설정

 

 

3. zone 구문 (도메인 추가)

도메인을 관리하는 데이터베이스 파일인 zone 파일을 지정한다.

 

[기본 형식]

zone "zone 파일명" IN {

    type (master | slave | hint);

    file " zone 파일명";

};

기본적으로 루트 도메인 서버에 대한 정보파일인 named.ca 에 대한 선언이 있으며

추가적으로 localhost 등에 대한 zone 파일 선언이 되어 있다.

 

기본적으로 선언되어 있는 것은 그대로 두는 것이 좋으며 특히 named.ca 항목을 지우면

리졸빙 (데이터베이스를 검색하는 역할)이 불가능하므로 주의해야 한다.

 

보통은 도메인에 대한 zone 파일은 이런 설정들 뒤에 추가되는데,

include 지시자를 이용해 별도의 파일에서 zone 파일을 설정하기도 한다.

 

include를 이용한 외부파일 사용
zone 파일 설정

DNS 서버의 주요 설정파일인 /etc/named.conf 에서는 include 지시자를 이용해 외부 파일에

설정된 zone 파일을 가져와서 사용할 수 있다.

 

외부파일 /etc/named.rfc1912.zones 에는 사용할 도메인 네임과 IP주소를 이용해

정방향 (IP → 문자) 설정과, 역방향 (문자 → IP) 설정을 할 수 있다.

 

zone "test.com" IN {  }  = 정방향 도메인 지정 

type master;     = 서버 타입

file "test.zone";    = zone 파일 이름 설정 (사용자가 생성하는 참조파일)

allow-update{ none; };    = 동기화할 slave(2차 도메인) 서버의 IP지정 (없을경우 none)

 

zone "0.168.192.in-addr.arpa"IN { }  = 자기 자신의 IP주소를 거꾸로 기입

(IP주소를 거꾸로 적어야 네트워크 주소에소 특정 호스트까지 찾아갈 수 있다.)

type master;     = 서버 타입

file "test.rev.zone";    = 사용자가 생성하는 참조파일

 

 

zone 파일 (정/역방향 데이터베이스 파일) 만들기

사용하는 도메인에 대한 zone 파일은 정방향, 역방향 zone 파일로 나뉘고,

파일명은 관리자가 마음대로 지정할 수 있다.

 

파일은 /var/named 의 named.empty 를 따로 복사해서 사용한다.

named.empty = 도메인 데이터베이스 파일 양식

 

]# vim /var/named/named.empty

 

파일의 기본 양식은 아래와 같다.

named.empty

 

1. 정방향 zone 파일 생성

 

사용자의 도메인 zone 이 설정된 /etc/named.rfc1912.zones 파일에서 참조할

정방향 데이터베이스 파일을 만든다.

 

/etc/named.rfc1912.zones 설정
test.zone

파일명은 test.zone 만들어야 한다.

 

 

 

2. 역방향 zone 파일 생성

 

사용자의 도메인 zone 이 설정된 /etc/named.rfc1912.zones 파일에서 참조할

역방향 데이터베이스 파일을 만든다.

 

/etc/named.rfc1912.zones 설정
test.rev.zone

 

zone 파일의 구조

DNS 설정파일 (/etc/named.conf ) 에 zone 구문에서 참조할 zone파일의 구조는

최초 TTL 값을 설정한 이후 SOA(Start Of Authority) 레코드와, 자원레코드로 나뉜다.

 

TTL (Time To Live)

zone 파일의 첫 줄에 명시관 TTL 값은 다른 서버에서 도메인 관련 정보를

가져갔을 경우 가져간 서버의 캐시에 정보가 머무는 기간을 설정한다.

 

1. SOA 레코드

해당 도메인에 대해 여기서 설정한 정보가 모든 정보를 가지고 있음을 선언한다.

도메인에 대한 모든 권한이 여기에 있다.

 

nameserver = ns.test.com. 

 = 네임서버의 호스트명과 도메인명을 기입한다. 

 마지막에는 루트도메인을 말하는 '.'을 찍는다.

 

contact_email_address = root.test.com.

 = 관리자의 이메일 주소를 "계정.도메인" 형태로 기입한다.

 마지막에는 루트 도메인을 뜻하는 '.'을 찍는다.

 

serial = 0

 = 일종의 일련번호로 보통 "YYYYMMDDNN" 형식으로 기입하며 NN은 수정횟수를 말한다.

 (2020년 2월 1일 수정1회 = 2020020101) 

 

refresh = 1D

 = 2차 DNS 서버가 정보를 업데이트 하기 위해 주 네임 서버를 체크하는 주기

 일반 숫자로 입력할 경우 초를 나타낸다. (21600 = 21600초)

 

retry = 1H

 = 2차 DNS 서버가 주 네임서버로 접속실패 했을 경우 재시도하는 주기

 일반 숫자로 입력할 경우 초를 나타낸다. (900 = 15분)

 

expire = 1W

 = 2차 DNS 서버가 주 네임 서버로 접근에 실패해서 재시도를 하는 경우,

 만기되는 시간을 지정한다.

 

minimum = 3H

 = TTL값과 동일하며 zone파일 정보의 최소 보관 시간을 설정한다.

 

 

 

2. 자원 레코드

IN        : 네트워킹 주소 클래스

NS       : 도메인의 네임서버 정보 
MX      : 도메인의 Mail 서버로, MX 다음 숫자는 메일처리의 우선순위를 명시한 것.
       : 해당 도메인의 실제 IP주소(IPv4)를 설정 하는 레코드
CNAME : 별칭으로 부여된 name (서브도메인을 사용하기 위해 지정)
HINFO  : 호스트의 CPU정보와 운영체제 정보
MINFO : 메일박스와 메일 리스트 정보 
PTR      : IP주소에 대한 호스트명
TXT      : 호스트에 대한 텍스트 정보
UINFO  : 사용자 정보
ANY     : 호스트에 관련된 모든 레코드들의 정보 

 

 

 

모든 설정이 끝난 후

 

[문법검사]

]# named-checkconf

 = /etc/named.conf 설정파일의 문법적 오류 검사

]# named-checkzone

 = zone 파일의 문법적 오류 검사

zone은 DNS 주요 설정파일인 /etc/named.conf 에 설정할 수도 있으며

include 지시자를 이용해 다른 파일에 설정할 수도 있다.

 

zone 구문이 설정된 파일명으로 설정에 오류가 없는지 검사한다.

ex)

]# named-checkconf /etc/named.conf

]# named-checkconf /etc/named.rfc1912.zones

 

이후 설정파일에서 참조하는 zone 정방향/역방향 데이터베이스 파일에 대한

문법적 오류도 같이 검사한다.

ex)

]# named-checkzone test.zone      = 정방향 파일 검사

]# named-checkzone test.rev.zone  = 역방향 파일 검사

 

 

[서버 주소 설정]

 

]# vim /etc/resolv.conf

 = DNS 서버의 주소 IP를 설정한다.

 

"nameserver [IP주소]" 형식으로 DNS 서버가 구성된 IP 주소를 설정한다.