본문 바로가기

컴퓨터/리눅스 서버구축

서버셋팅 2. BIND설치와 네임서버(DNS 서버)의 구축

  DNS(Domain Name System)서버를 구축하기 위해서는 DNS의 역할을 수행하는 프로그램을 설치해야한다. 리눅스에서 가장 널리 사용되는 프로그램으로 BIND(Berkeley Internet Name Domain)가 있다. (홈페이지 : www.isc.org)


  BIND를 설치하기 전에 몇가지 설정파일에 대해서 알아보자.


/etc/host.conf

  호스트파일과 네임서버의 요청에 대한 우선순위를 결정짓는 파일이다. 즉, 도메인네임의 IP주소를 호스트 파일에서 먼저 찾을 것인지, 아니면 네임서버에 질의를 먼저 할 것인지에 대한 우선 순위를 결정한다. 다음은 host.conf 파일의 기본설정값이다.


  위의 기본 설정파일 처럼 order옵션을 생략하면, 호스트 파일의 검색이 먼저라는 것은 기억해 둘 필요가 있겠다.

 order hosts, bind 

 호스트 파일을 먼저 검색한 후에 네임서버에 질의를 한다. (기본값)

 order bind, hosts 

 네임서버의 질의를 먼저 한 후에 호스트 파일을 검색한다.  


  multi 옵션은 on과 off의 두 가지 값으로 설정할 수 있다. multi on은 호스트파일이 여러개의 IP주소를 가질 수 있도록 한다. 따라서 호스트 파일에 두 개 이상의 도메인 주소를 지정하는 경우 multi on으로 설정하면 되겠다. 이 외에도 몇가지 옵션들이 더 있다.


/etc/hosts

  호스트 파일에 대한 설명은 지난글(http://lovelyhare.tistory.com/3) 참고.


/etc/resolv.conf

  컴퓨터가 사용할 네임서버를 설정하는 파일이다. 아래의 내용은 현재 특정 도메인의 네임서버와, 웹서버로 운영중인  리눅스 서버의 resolv.conf파일의 내용이다. 아래와 같이 간단하게 설정할 수 있다.


 # Generated by NetworkManager

 nameserver 168.126.63.1


  #은 주석문을 의미한다.  네임서버는 최대 3개까지 지정이 가능하며, 네임서버로 운영중인 컴퓨터라면 자신의 IP를 입력해도 상관없다. 


  다음과 같이 resolv.conf를 사용할 수도 있다.


 # Generated by NetworkManager

 

 domain mydomain.com


 search lovelyhare.com myserver.net


 nameserver 168.126.63.1

 nameserver 168.126.63.2

 nameserver 8,8,8,8



  domain 구문을 사용해서 로컬컴퓨터의 도메인이름을 명시할 수 있다.


  search 구문에 명시된 도메인이름은 호스트이름을 서버로 보내기 전에 확장하는데에 사용된다.  예를 들어 서브 도메인을 이용해서 linux.myserver.net과 story.myserver.net이라는 이름으로 텔넷 서버를 운영하고 있다면 telnet linux만 입력하더라도 linux.myserver.net에 접속되며, telnet story만 입력하더라도 story.myserver.net에 접속하게 된다.


  내가 리눅스 서버를 구축하게 된 이유는 하나의 도메인을 신청해서, 그 도메인으로 4~50개의 서브도메인을 생성하여, 각각의 서브도메인마다 독립적인 홈페이지를 운영하기 위함이었다. 당연한 얘기겠지만 대게의 웹호스팅 업체에서는 이러한 작업에 대해서 별도의 비용을 청구한다. 따라서 서브도메인의 수량이 많아지면 소요되는 비용을 무시할 수가 없다. 이럴 때는 서버호스팅 서비스를 이용하여 직접 네임서버를 구축하는 것이 훨씬 경제적이다. 서버호스팅 업체에서는 기본 리눅스 설치와 SSH나 telnet 으로 접속할 수 있게끔 셋팅을 해주며, 그 이상의 작업은 사용자의 몫이다. 다수의 홈페이지를 운영할 목적이라면 서버호스팅을 이용하거나 KT, SK, LG 등 ISP 에서 제공하는 고정IP 서비스를 고려해 보는 것도 괜찮을 것이다.  네임서버, 웹서버 등을 구축하기 위해서는 고정IP 주소와 도메인은 반드시 있어야 한다.


  이제 BIND를 설치하여 네임서버를 구축해보자. 소스파일을 받아서 컴파일 하는 방법, 레드햇(Red Hat) 계열의 리눅스에서는 RPM을 이용할 수 있겠지만, 간편하게 yum을 사용하기로 한다.


  리눅스에 BIND가 설치되어 있는지 먼저 확인해보자.

 # rpm -qa bind* 


  이미 설치되어 있다면 아래와 같이 설치된 패키지들이 보일것이다.


  yum을 이용해서 간편하게 설치해보자.

 # yum -y install bind bind-chroot


  설치되어 있는 패키지인 경우는 아래와 같이 최신 버전으로 업데이트가 된다.


  네임서버의 설정은 (1)네임서버(BIND)의 환경설정과, (2)도메인네임을 IP주소로 연결해주는 존(ZONE)파일(포워드 존 - forward zone이라고도 한다)의 설정으로 나눌 수 있다. 이와 반대로 IP주소를 도메인네임으로 변경해주는 리버스 존(Reverse Zone) 파일도 설정할 수 있다. 이러한 설정(역방향)을 위해서 필요한 인버스(inverse) 도메인은 해당 ISP 업체에 별도로 요청해야 한다. 개인적으로 인버스 도메인의 필요성을 느끼지 못하였으나, 메일서버를 구축하여 사용하는 경우, 해외의 RBL(Realtime Black List)사이트 들이 블랙리스트화 하여 메일을 전송할 수 없다고 한다. 이 부분은 시간이 된다면 메일서버 설정과정에서 다시 한번 다루어 보겠다. 일단 네임서버의 구축은 기본환경 설정과 포워드존 파일의 설정까지만 다루기로 한다.


/etc/named.conf

  네임서버의 기본 설정파일이며, 기본 내용은 다음과 같다.

//

// named.conf

//

// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS

// server as a caching only nameserver (as a localhost DNS resolver only).

//

// See /usr/share/doc/bind*/sample/ for example named configuration files.

//


options {

        listen-on port 53 { 127.0.0.1; };

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

        directory       "/var/named";

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

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

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

        allow-query     { localhost; };


        /*

         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.

         - If you are building a RECURSIVE (caching) DNS server, you need to enable

           recursion.

         - If your recursive DNS server has a public IP address, you MUST enable access

           control to limit queries to your legitimate users. Failing to do so will

           cause your server to become part of large scale DNS amplification

           attacks. Implementing BCP38 within your network would greatly

           reduce such attack surface

        */

        recursion yes;


        dnssec-enable yes;

        dnssec-validation yes;


        /* Path to ISC DLV key */

        bindkeys-file "/etc/named.iscdlv.key";


        managed-keys-directory "/var/named/dynamic";


        pid-file "/run/named/named.pid";

        session-keyfile "/run/named/session.key";

};


logging {

        channel default_debug {

                file "data/named.run";

                severity dynamic;

        };

};


zone "." IN {

        type hint;

        file "named.ca";

};


include "/etc/named.rfc1912.zones";

include "/etc/named.root.key";


  주석은 //으로 처리하며, 여러줄을 주석처리 하는 경우에는 주석문의 시작을 알리는 /*과 주석문의 끝을 알리는 */을 사용할 수 있다.


  상단의 option 부분을 아래와 같이 수정하면 되겠다. 수정한 부분만 굵은 글씨로 표기했다.

options {

        listen-on port 53 { any; };

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

        directory       "/var/named";

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

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

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

        allow-query     { any; };


  첫 번째 줄은 외부영역에서 네임서버가 사용하는 53번 포트로의 접속에 대한 IP를 설정하는 부분이다. 기본값이 루프백주소로 되어 있기 때문에, 이를 수정하지 않으면 외부에서 사용할 수 없게된다. 마찬가지로 allow-query에 대한 부분도 localhost를 any로 변경해야 한다. 두 번째 줄은 IPv6에 대한 설정으로 none으로 기재하면 된다. 이것으로 네임서버의 기본설정은 끝낸 셈이다. 


  이제 우리가 사용하려고 등록한 도메인을 셋팅해야 할 차례다. 새로 신청한 도메인이름이 lovelyhare.com이고, 고정IP주소는 123.45.67.8이라고 가정하면, 존 구문은 아래와 같이 설정할 수 있다.

  zone "lovelyhare.com" IN {

            type master;

            file "lovelyhare.com.zone";

            allow-update { none; };

  };

  첫 번째 줄의 " " 안에는 도메인이름을 기재한다. 두 번째 줄의 type master는 1차 네임서버로 사용하겠다는 의미이다. 2차 네임서버의 경우는 slave로 기재한다. 세 번째 줄의 file은 존파일의 이름이다. 위의 예에서는 lovelyhare.com.zone으로 설정했지만 파일명은 자유롭게 지정할 수 있다. 보통은 도메인이름에 zone, db 등을 덧붙이는 것이 일반적이며, 도메인이름과 동일한게 사용해도 아무런 문제는 없다. 심지어 (사용할 수 있다면)한글로 작성해도 정상적으로 작동한다. 네번째 줄의 { } 안에는 2차 네임서버의 IP주소를 입력한다. 2차 네임서버가 없다면 위의 예처럼 none으로 작성한다.


  위와 같이 우리가 새로 작성한 존 구문은 named.conf 파일의 내부에 추가하거나 include 된 named.rfc1912.zones에 추가하면 된다. 아래는 named.conf 파일을 직접 수정한 경우이다.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 생략 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


logging {

        channel default_debug {

                file "data/named.run";

                severity dynamic;

        };

};


zone "." IN {

        type hint;

        file "named.ca";

};


zone "lovehare.com" IN {

       type master;

       file "lovelyhare.com.zone";

       allow-update { none; };

};


include "/etc/named.rfc1912.zones";

include "/etc/named.root.key"




  다음과 같이 named.rfc1912.zones파일에 추가하여 사용해도 무방하다. (개인적으로 이 방법을 더 권한다)

// named.rfc1912.zones:

//

// Provided by Red Hat caching-nameserver package

//

// ISC BIND named zone configuration for zones recommended by

// RFC 1912 section 4.1 : localhost TLDs and address zones

// and http://www.ietf.org/internet-drafts/draft-ietf-dnsop-default-local-zones-02.txt

// (c)2007 R W Franks

//

// See /usr/share/doc/bind*/sample/ for example named configuration files.

//


zone "localhost.localdomain" IN {

        type master;

        file "named.localhost";

        allow-update { none; };

};


zone "localhost" IN {

        type master;

        file "named.localhost";

        allow-update { none; };

};


zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {

        type master;

        file "named.loopback";

        allow-update { none; };

};


zone "1.0.0.127.in-addr.arpa" IN {

        type master;

        file "named.loopback";

        allow-update { none; };

};


zone "0.in-addr.arpa" IN {

        type master;

        file "named.empty";

        allow-update { none; };

};


zone "lovelyhare.com" IN {

        type master;

        file "lovelyhare.com.zone";

        allow-update { none; };

};


  이제 존 파일의 설정이 남았다. 우리가 사용하기 위해서 신청한 도메인(public domain)과 IP주소와를 연결해주는 핵심이 바로 존 파일이다. 존 파일은 named.conf 파일에서 명시된 디렉토리인 /var/named에 위치해야 한다. 


   /var/named/lovelyhare.com.zone을 만들고 내용은 다음과 같이 하자.

 $TTL        3H

 @           SOA      @      root. (  2016060801   1D   1H   1W   1H  )

             IN       NS     @

             IN       A      123.45.67.8

 www         IN       A      123.45.67.8


  TTL(Time To Live)은 외부의 네임서버가 도메인(lovelyhare.com)의 IP주소를 캐시(chche)에 저장하는 시간을 의미한다. 예를 들어 외부의 네임서버가 lovelyhare.com의 IP주소를 얻기 위해서 (우리가 지금 구축하고 있는) lovelyhare.com의 도메인을 관리하는 네임서버에 질의하여 주소가 123.45.67.8 이라는 것을 알게되었다면, 이후로 3시간 동안은 같은 요청이 들어왔을 경우 다시 lovelyhare.com의 네임서버에 질의하지 않고, 자신의 캐시에서 해당도메인의 IP주소를 얻게 되는 것이다.


  @는 존파일에서 도메인네임을 의미한다. 위의 예에서는 lovelyhare.com을 나타내는 것이다


  IN은 Internet을 의미하는 클레스이름이다. IN외에서 HS, CHAOS 등의 거의 사용되지 않는 클레스 이름도 있다.


  SOA는 Start Of Authority을 의미한다. SOA 다음에 도메인이름(여기서는 @으로 대체함), 그 다음에는 관리자의 이메일 주소를 적어 넣는다. 만약 관리자의 이메일 주소가 root@lovelyhare.com 이라면 root.lovelyhare.com. 이라고 기재해 야 한다(이메일 주소에 사용되는 @는 존파일에서 도메인이름을 의미하기 때문). 이메일은 위의 예와 같이 도메인이름을 생략한 계정이름만 기재해도 무방하다. 유의해야 할 것은 마지막에 .을 붙여야 한다는 것이다. 


  괄호안의 것들은 순서대로 serial, refresh, retry, expire, minimum을 나타내며 시간을 의미한다. 


  serial은 2차 네임서버가 1차 네임서버(Primary name server)의 존 파일이 업데이트 되었는지 확인할 때에 사용된다. 업데이트 여부는 이 시리얼을 통해 검사하며, 1차 네임서버의 시리얼번호가 2차네임서버(Secondary name server)의 시리얼보다 큰 경우 2차네임서버는 1차 네임서버가 업데이트 되었다고 판단하여 1차 네임서버의 존 파일은 전송해온다. 따라서 도메인이 변경되었거나 업데이트 된 경우 1차 네임서버의 시리얼번호를 변경(증가)시켜 주는 것이 2차 네임서버와의 동기화를 위해서 필요하다. 물론 2차 네임서버를 운영하고 있다면 말이다.


  refresh는 위에서 설명한 2차 네임서버가 1차 네임서버가 업데이트 되었는지의 여부를 검사하는 시간주기이다. 존파일에서의 시간은 초(second) 단위로 기재가능하며, BIND가 업데이트 되면서 1D(하루:24시간), 1H(1시간), 1W(일주일) 등으로도 표기가 가능해졌다. 1D 대신에 86400, 2H 대신에 7200으로 기재해도 같은 내용이라는 뜻이다.


  retry는 2차 네임서버가 1차 네임서버의 업데이트 여부를 확인하는 과정에서 1차 네임서버가 응답이 없는 경우, 2차 네임서버가 1차 네임서버의 업데이트 여부를 재확인하는 주기를 의미한다. 2차 네임서버를 운영하고 있다면 1800 (30분) 정도가 적당할 것이다.


  expire는 2차 네임서버가 1차 네임서버에 재응답을 요청할 수 있는 시간 제한을 나타낸다. 여기서 설정한 시간동안 1차 네임서버로부터 응답을 받지 못했다면 2차 네임서버의 이전 정보들은 삭제된다. 


  NS는 네임서버(Name Server)의 약자로 해당 도메인의 네임서버를 지칭한다. 위의 예에서 lovelyhare.com의 네임서버는 lovelyhare.com이다. 


  A는 호스트에 IP주소를 지정할 때 쓰인다. 마지막줄에 www라는 호스트이름에 123.45.67.8의 주소를 지정했다. 결국 www.lovelyhare.com의 주소는 123.45.67.8로 지정하겠다는 의미이다.


  이 외에도 메일서버에 사용되는 MX(Mail Exchange), 호스트 이름에 별칭을 부여하는 CNAME 등이 있다.


  네임서버의 구축이 끝났다면 방화벽 설정을 통해서 53번 포트를 열어줘야 한다. X윈도우 환경이라면 방화벽 설정에서 public 영역의 dns를 선택하는 것만으로 설정이 가능할 것이다. 텍스트 모드라면 아래와 같이 입력하자.


 # firewall-cmd --permanent --zone=public --add-port=53/tcp

 # firewall-cmd --permanent --zone=public --add-port=53/udp 

 # firewall-cmd --reload


  실제 실행시킨 모습은 아래와 같다.


  이제 네임서버 데몬을 작동시키자.

 # systemctl start named 


  여기까지가 네임서버 구축에 대한 개략적인 설명이다.  참고로 신규 도메인을 등록신청 할 때에 대행업체에서 제공하는 네임서버를 사용할 수 도 있다. 하지만 이를 사용하게 되면 서브도메인의 생성이나 관리 등에 많은 제약이 생기게 된다. 물론 하나의 도메인에 하나의 홈페이지를 운영할 계획이라면 굳이 네임서버를 구축할 필요가 없을 수도 있지만, 그러한 경우라면 직접적인 서버의 구축 자체가 불필요하지 않을까...라는 생각이다. 도메인을 등록신청 할 때에 보통은 1차 네임서버와 2차네임서버의 (호스트)이름과 IP주소를 입력해야 한다. 이때의 호스트이름을 네임서버라는 의미로 ns, ns1, ns2 정도로 사용하지만, 이는 관례로 사용할 뿐이다. 정작 중요한 것은 1차 네임서버로 지정한 IP주소이다. 


  앞으로 서브도메인의 생성과 그에 따른 웹서버의 설정(가상호스트), SSH, FTP, 메일서버 등을 하나하나 구축 해 나가면서 네임서버의 수정, 보완이 필요한 경우에 다시 정리할 예정이다.