커피닉스, 시스템 엔지니어의 쉼터 커피향이 나는 *NIX
커피닉스
시스템/네트웍/보안을 다루는 곳
* HanIRC의 #coffeenix 방
[ 장비 및 회선 후원 ]
HOME > 네트워크(network) > 네임서버(name server, dns, bind) 도움말
검색 : 사이트 WHOIS 웹서버 종류


  chrooted 네임서버 설치, bind-9.2.0 for FreeBSD 4.5 작성일 : 2003/09/23 20:24
 
  • 글쓴이 : hsmok ( http://www.systemadmin.co.kr/ )
  • 조회수 : 11752
          [ 이전화면 / 수정 ]   비밀번호 :     인쇄용 화면
     

    #
    # 글제목 : CHRooted DNS(bind 9.2.0)-FreeBSD 4.5
    # 작성자 : hsmok@systemadmin.co.kr
    # 등록일 : 2002. 01. 22
    #
    

    CHRooted DNS/bind-9.2.0 for FreeBSD 4.5

    H.S. Mok
    hsmok@sv.co.kr
    2002/1/21
    수정: 2002/4/30
    

    버전

    FreeBSD 4.5
    bind 9.2.0
    

    1. Domain Name System(DNS) 관련 문서

    RFC 문서(http://www.ietf.org/rfc.html)

    • RFC-1033: DOMAIN ADMINISTRATORS OPERATIONS GUIDE
    • RFC-1034: DOMAIN NAMES - CONCEPTS AND FACILITIES
    • RFC-1035: Domain Names - Implementation and Specification

    2. CHRooted DNS/BIND?

    CHRooted DNS/BIND는 bind를 '/somewhere/bind'등의 디렉토리를 chrooted 되게 설치해서 bind로 하여금 그 디렉토리를 루트 디렉토리로 인식하게 해서 chroot 디렉토리 외의 디렉토리는 접근하지 못하게 한다. 만약 bind가 악의의 사용자에 의해 공격 당하더라도 bind 디렉토리 밖으로 접근하지 못하게 한다. 또한 bind를 root가 아닌 nobody 또는 bind 권한으로 실행 시켜서 보다 안전한 DNS 서비스가 가능해진다.


    3. 설치 준비

    FreeBSD 4.4 시스템은 bind 8.2.4 버전이 /usr 에 설치되어 있다. bind 8.2.2p7이전 버전 사용자라면 보안버그가 발견 되었기 때문에 반드시 최신버전으로 업그레이드 해야된다. 현재 최신 버전은 bind 8.3.0, bind 9.2.0 이다. 포트에서는 bind 8.2.5, bind 9.1.3이 지원된다. FreeBSD 포트 버전이 최신 버전보다 낮아서 소스를 다운받아 설치 하고자 한다. http 나 ftp로 bind-9.2.0.tar.gz 파일을 컴파일할 디렉토리로 다운로드 받느다.


    4. 설치

    configure

    • --prefix=/usr/local

      bind가 설치 될 디렉토리를 지정할 때 사용하고 기본값은 /usr/local 이다.

    • --sysconfdir=/usr/local/bind9/etc

      설정파일(named.conf)이 설치될 디렉토리를 변경한다. 기본값은 이전 버전과 호환을 문제로 /etc 이다. prefix를 지정했다면 $prefix/etc가 된다.

    • --localstatedir=/usr/local/bind9/var

      run/named.pid의 상위 디렉토리이고 기본값은 /var 이다. prefix를 지정했다면 $prefix/var가 된다.

    • --enable-openssl=/usr

      bind9에서 제공하는 DNSSEC을 지원하게 한다. DNSSEC은 OpenSSL 0.9.5a 이상의 버전이 필요하다. FreeBSD 4.4 시스템에는 "/usr"에 OpenSSL 0.9.6 이 설치되어 있다. OpenSSL의 버전 확인은 다음과 같이한다.

       # /usr/bin/openssl version
      OpenSSL 0.9.6 24 Sep 2000
    • --enable-threads

      멀티스레드를 지원하기 위한 옵션이고, 멀티 프로세서 시스템에서 성능의 향상이 있다.

    • --with-kame=/somewhere

      IPv6 지원에 대한 옵션이다. 시스템에 IPv6가 기본적으로 지원 되면 설치시 자동으로 인식한다.

    • --help

      좀더 자세한 configure의 도움말을 보여준다.

    FreeBSD 4.4 시스템은 기본적으로 bind 8.2.4 버전이 /usr에 설치 되어 있다. 새로운 버전을 /usr 에 설치해서 이전 버전을 덮어 쓴다. prefix를 지정하게 되면 sysconfdir과 localstatedir이 $prefix/etc, $prefix/var로 되므로 시스템에 맞게 추가적으로 지정해주는 것이 좋다. 컴파일과 설치가 끝나면 새로운 버전으로 dns 서버를 운영할 수 있다. chroot 서비스를 원하지 않는 다면 여기까지 설치하면 된다.

    # fetch ftp://ftp.isc.org/isc/bind9/9.2.0/bind-9.2.0.tar.gz
    # tar xvzf bind-9.2.0.tar.gz
    # cd bind-9.2.0
    # ./configure --prefix=/usr --sysconfdir=/etc/namedb --localstatedir=/var
    # make
    # make install
    # mv /usr/sbin/nslookup /usr/sbin/nslookup.old
    # ln -s /usr/bin/nslookup /usr/sbin/nslookup
    

    5. chroot 설정

    chroot 디레토리와 서브디렉토리를 만든다. dev 서브디렉토리에는 null 디바이스와 random 디바이스를 만든다. etc 서브디렉토리는 bind 설정파일(named.conf)과 localtime을 위한 것이다. 로커타임은 sysinstll 메뉴나 tzsetup 명령으로 타임존을 설정하면 /etc/localtime 이 생기므로 복사해서 쓰면 되고, /usr/share/zoneinfo/Asia/Seoul 타임존 파일을 복사해서 쓴다. sbin 서브디렉토리에는 /usr/sbin/named 바이너리를 복사하고 strip 으로 심볼릭을 삭제해준다.

    # mkdir /usr/local/bind
    # cd /usr/local/bind
    # mkdir -p dev etc/namedb sbin var/run var/log
    # 
    # mknod dev/null c 2 2
    # mknod dev/random c 2 3
    # chmod a+w dev
    #
    # cp /etc/localtime etc/localtime
    # cp /usr/sbin/named sbin/named
    # strip sbin/named
    #
    # chown -R bind.bind etc/namedb var/run var/log
    

    네임서버의 로그를 설정하기 위해서는 로그파일을 만들어 준다.

    # touch var/log/named.log
    # chown bind.bind var/log/named.log
    

    6. Name Server 설정

    Caching-only Nameserver 설정

    cache only server는 Caching Name Server 또는 Recursive Server 라고 하며 클라이언트에 대한 recursive rookup만을 수행한다. 즉 인터넷 도메인 네임 영역을 등록하고 관리하지 않는다. 예를 들어 윈도우 사용자가 네트워크 환경에서 dns server ip를 caching server ip 주소로 설정한 경우 사용자 브라우저에서 www.sv.co.kr 이라는 도메인을 요청하면 도메인네임에 대한 IP 주소 전달해 주어 사용자가 원하는 웹 페이지를 찾아 갈 수 있게 해주는 역할을 한다.

    필요한 파일은 etc/namedb/named.conf, etc/namedb/localhost.rev, etc/namedb/named.root 이고 설정 예는 다음과 같다.

    • etc/namedb/named.conf
      
      // etc/named.conf -----------------------------------------------------------
      //
      
      acl "my_net" { localhost; 192.168.1.0/24; 192.168.2.5/28; };
      options {
           directory "/etc/namedb";                  // 도메인 영역파일 위치
           pid-file  "/var/run/named.pid";           // named pid 파일 위치
           allow-query { "my_net"; };                // acl에서 정의한 허용 리스트
      };
      
      zone "."                    { type hint;   file "named.root"; };
      zone "0.0.127.in-addr.arpa" { type master; file "localhost.rev"; notify no; };
      // --------------------------------------------------------------------------
      
    • etc/namedb/localhost.rev
      • TTL: 타 네임서버가 이 zone 데이터를 가지고 갔을 경우 가져간 데이터의 유효기간을 정한다.(초)
      • Serial: zone 파일 수정시 이번호를 날짜 기준 증가 시켜준다. slave 서버에서는 serial의 변경 여부를 이 번호를 참조하고 zone 백업을 업데이트 한다.
      • Refresh: slave server가 primary의 수정 여부를 검사하는 주기(초)
      • Retry: slave server가 masert server와 연결이 않될 경우 재시도 주기(초)
      • Expire: master server와 설정 기간동안 연결 않될 때 zone 백업 카피의 무효화 한다.
      • Minimum: 타 네임서버가 이 zone 데이터를 가지고 갔을 경우 가져간 데이터의 유효기간을 정한다. TTL값이 명시 되지 않았을 때 이 값을 가진다. 설정을 0으로 했을 때 캐싱 하지 않도록 한다.
      // etc/namedb/localhost.rev -o------------------------------------------------------
      //
      $TTL    3600
      @       IN      SOA     ns.sv.co.kr. root.ns.sv.co.kr.  (
                                      2002012201      ; Serial
                                      3600            ; Refresh  (   1 hour)
                                      900             ; Retry    (  15 min )
                                      3600000         ; Expire   (1000 hours)
                                      3600 )          ; Minimum  (   1 hour)
              IN      NS      ns.sv.co.kr.
      1       IN      PTR     localhost.sv.co.kr.
      // --------------------------------------------------------------------------
      
    • etc/namedb/named.root

      이 파일은 루트 네임서버의 정보를 가지고 있는 파일이다. 직접 만드는 것이 아니라 /etc/namedb/named.root 에 존재하며 이 파일을 필요한 곳으로 복사해서 쓴다. 직접 internic(ftp://rs.internic.net/domain/named.root) 에서 다운로드해도 된다.

      # cp /etc/namedb/named.root /usr/local/bind/namedb/.
      

      또는

      # cd /usr/local/bind/etc/namedb
      # fetch ftp://rs.internic.net/domain/named.root
      

    Authoritative Nameserver 설정

    도메인 영역에 대한 서비스를 수행하는 네임서버를 말한다.

    Authoritative Server에 필요한 파일

    • etc/namedb/named.conf
      // etc/namedb/named.conf -----------------------------------------------------------
      //
      options {
           directory "/etc/namedb";           // 도메인 영역파일 위치
           pid-file  "/var/run/named.pid";    // named pid 파일 위치
           allow-query { any; };              // 쿼리 허용
           allow-transfer { 192.168.1.2 };    // secondary name server
           //recursion no;                    // recursive 서비스를 사용 않할 때
           //auth-nxdomain yes;               // 네트웍에 오래된 DNS가 있을 경우
      };
      
      logging {
           channel bind_log    { file "/var/log/named.log"; severity info; };
           category xfer-out   { bind_log; };
           category default    { bind_log; };        // 기본 로그를 bind_log로 출력
           //category default  { default_syslog; };  // 기본 로그를 시스템의 syslog로 출력
      };
      
      
      zone "."                      { type hint; file "named.root"; };
      zone "0.0.127.in-addr.arpa"   { type master; file "localhost.rev"; notify no; };
      zone "1.168.192.in-addr.arpa" { type master; file "1.168.192.rev"; notify no; };
      
      zone "systemadmin.co.kr" {                    // master 영역 설정 예
           type master;
           file "systemadmin.co.kr.db";
      };
      
      zone "sv.co.kr" {                    // slave 영역 설정 예
           type slave;
           file "sv.co.kr.bk";
           masters { 192.168.4.12; };      // master server IP
      };
      // --------------------------------------------------------------------------
      
    • etc/namedb/localhost.rev

      caching server의 localhost.rev와 같음.

    • etc/namedb/1.1678.192.rev

      리버드 도메인영역은 전산원에 리버스도메인이 등록되어야 정상적으로 작동한다. 전산원에 등록되지 않더라도 ISP업체에 해당 아이피 주소의 리버스 영역을 매핑해 달라고 하면 된다.

      $TTL    3600
      @       IN      SOA     ns.systemadmin.co.kr. root.ns.systemadmin.co.kr.  (
                                      2002012201      ; Serial
                                      3600            ; Refresh  (   1 hour)
                                      900             ; Retry    (  15 min )
                                      3600000         ; Expire   (1000 hours)
                                      3600 )          ; Minimum  (   1 hour)
              IN      NS      ns.systemadmin.co.kr.
      1       IN      PTR     ns.systemadmin.co.kr.
      
    • etc/namedb/named.root

      caching server의 named.root와 같음.

    • etc/namedb/systemadmin.co.kr.db
      $TTL            86400
      @               IN      SOA     ns.systemadmin.co.kr.  hsmok.systemadmin.co.kr. (
                                      2002012201      ; Serial
                                      3600            ; Refresh  (   1 hour )
                                      900             ; Retry    (  15 min  )
                                      3600000         ; Expire   (1000 hours)
                                      3600 )          ; Minimum  (   1 hour )
      
                      IN      NS      ns.systemadmin.co.kr.
                      IN      NS      ns2.systemadmin.co.kr.
                      IN      A       192.168.1.1
                      IN      MX  10  mail
      
      ns              IN      CNAME   @
      www             IN      CNAME   @
      ftp             IN      CNAME   @
      mail            IN      A       192.168.1.1
      ns2             IN      A       192.168.1.2
      

    7. named 실행

    bind 버전확인

    # /usr/local/bind/sbin/named -v
    BIND 9.2.0
    #
    

    chrooted 실행

    /usr/local/bind/sbin/named -t /usr/local/bind -c /etc/namedb/named.conf -u bind
    

    named 데몬 확인

    ps 명령으로 named 데몬을 확인하면 bind 권한으로 실행되어 있을 것이다.

    #
    # ps aux | grep named
    bind    84931  0.0  6.7  2372 1996  ??  Is    3:32PM  \
            0:00.24 /usr/local/bind/sbin/named -t /usr/local/bind \
    		-c /etc/namedb/named.conf -u bind
    #
    # cat var/run/named.pid 
    84931
    

    로그확인

    로그 메시지를 확인해 보면 다음과 같이 작동할 것이다. rndc와 127.0.0.1 커맨드 채널을 추가 할 수 없다는 에러가 나지만 이것은 rndc를 설정하면 된다. named.conf에서 rndc 키와 control을 설정하게 된다. rndc를 사용하지 않는다면 굳이 설정할 필요는 없다.

    # cat /usr/local/bind/var/log/named.log
    zone 0.0.127.in-addr.arpa/IN: loaded serial 2002012201
    zone 1.168.192.in-addr.arpa/IN: loaded serial 2002012201
    zone systemadmin.co.kr/IN: loaded serial 2002043001
    running
    zone systemadmin.co.kr/IN: sending notifies (serial 2002043001)
    loading configuration from '/etc/namedb/named.conf'
    no IPv6 interfaces found
    none:0: open: /etc/namedb/rndc.key: file not found
    couldn't add command channel 127.0.0.1#953: file not found
    #
    #
    # cat /var/log/messages
    ....................
    Apr 30 12:18:25 ns1 named[8114]: none:0: open: /etc/namedb/rndc.key: file not found
    Apr 30 12:18:25 ns1 named[8114]: couldn't add command channel 127.0.0.1#953: file not found
    

    named query 확인

    dig 명령으로 설정된 도메인을 확인해 본다.

    
    ns3# dig @localhost mail.systemadmin.co.kr
    
    ; <<>> DiG 9.2.0 <<>> @localhost mail.systemadmin.co.kr
    ;; global options:  printcmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7082
    ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;mail.systemadmin.co.kr.                 IN      A
    
    ;; ANSWER SECTION:
    mail.systemadmin.co.kr.          86400   IN      A       211.192.187.216
    
    ;; AUTHORITY SECTION:
    systemadmin.co.kr.               86400   IN      NS      ns.systemadmin.co.kr.
    systemadmin.co.kr.               86400   IN      NS      ns2.systemadmin.co.kr.
    
    ;; Query time: 12 msec
    ;; SERVER: 127.0.0.1#53(localhost)
    ;; WHEN: Tue Jan 22 16:21:14 2002
    ;; MSG SIZE  rcvd: 82
    

    시스템 시작시 자동 실행 설정

    /etc/rc.conf 파일을 에디터로 열어 다음 내용을 추가한다.

    named_enable="YES"
    named_program="/usr/local/bind/sbin/named"
    named_flags="-t /usr/local/bind -c /etc/named.conf -u nobody"
    

    ** rndc 설정**

    rndc를 chrooted에서 설정하려면 문제점이 생긴다. rndc를 실행하게 되면 rndc.conf를 chrooted 가 아닌 /etc/named/에서 rndc.conf를 참조하게 되는데 이것은 별도로 심볼릭 링크를 걸거나 하는 방법으로 해결해야 한다.

    rndc key 만들기

    키는 공개키(*.key)와 개인키(*.private)가 만들어 진다. 공개키는 공개키 파일에서 "bind. IN KEY 0 2 157 " 뒷부분을 named.conf 파일에 넣어준다. 개인키는 개인키 파일에서 "Key: " 뒷 부분을 rndc.conf 파일에 넣어주게 된다.

    # dnssec-keygen -a hmac-md5 -r /dev/urandom -b 512 -n user bind
    Kbind.+157+29280
    #
    # ls -al
    -rw-------   1 root  wheel  111 Apr 30 12:31 Kbind.+157+29280.key
    -rw-------   1 root  wheel  145 Apr 30 12:31 Kbind.+157+29280.private
    

    etc/namedb/named.conf 파일에 다음 부분을 추가한다.

    key "rndc_key" {
         algorithm hmac-md5;
         secret "xPdYeSnIFS6+.......중간생략..........V0fEHGF3ll/uXJsA==";
    };
    controls {
         //inet ::1 allow { ::1; }           keys { "rndc_key"; };
         inet 127.0.0.1 allow { 127.0.0.1; } keys { "rndc_key"; };
    };
    
    

    etc/namedb/rndc.conf 파일을 만든다.

    options {
         default-server localhost;
         default-key "rndc_key";
    };
    
    server localhost { key "rndc_key"; };
    
    key "rndc_key" {
         algorithm hmac-md5;
         secret "xPdYeSn.........중간생략............YZJV0fEHGF3ll/uXJsA==";
    };
    

    bind를 새로 시작한다.

    rndc가 잘 설정되었다면 별 다른 에러 없이 작동한다. rndc 사용법에 대한 내용은 다음기회에...

    # ln -s /usr/local/bind/etc/namedb/rndc.conf /etc/namedb/rndc.conf
    # /usr/local/bind/sbin/named -t /usr/local/bind -c /etc/namedb/named.conf -u bind
    #
    # rndc reload
    loading configuration from '/etc/namedb/named.conf'
    
      커피닉스 카페 최근 글
    [11/06] World News Digest:
    [06/16] [질문]SAN 스위치 브로드케이드 dcx8510-4 장비관련입니다.
    [04/22] Re: 영화속에 컴퓨터 이야기 ~스워드피쉬(2001)
    [10/20] Cross Compiler 깔
    [07/14] SSL АО
    [04/26] Re: 도스화면 원격조종 여부
    [04/25] 도스화면 원격조종 여부
    [10/30] Cshell에서 난수 설정
    [10/23] 공항철도주식회사 SE 구인 件
    [01/26] Re: wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/25] wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/11] 특정 안드로이드 WebView 버전에서 SSL 문제 (WebView 버그)
    [08/01] DNS forwarder (전달자) 서버를 통해서 쿼리하면 역방향을 받아오질 못합니다.
    [05/16] (주)후이즈 시스템엔지니어 (경력자) 모집
    [02/15] [AWS] Cloudfront edge 확인하기
      New!   최근에 등록한 페이지
      KiCad EDA Suite project (Free/Libre/Open-Source EDA Suite) (CAD)
      오픈캐스케이드 캐드 (OpenCASCADE CAD)
      QCad for Windows --- GNU GPL (Free Software)
      The Hello World Collection
      IPMI를 활용한 리눅스 서버관리
      DNS 설정 검사
      nagiosgraph 설치 방법
      Slony-I 설치 방법 (postgresql replication tool)
      Qmail기반의 Anti spam 시스템 구축하기
      clusterssh

    [ 함께하는 사이트 ]




    운영진 : 좋은진호(truefeel), 야수(yasu), 범냉이, sCag
    2003년 8월 4일~