ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Bind Setup Guide
    IT 2020. 12. 5. 00:10
    반응형

    CentOS에서 DNS 서버 구축 방법을 정리하였습니다. 소규모 인프라에서는 DNS가 별로 쓸모가 없다고 느껴질수도 있지만 On-premise의 대규모 인프라를 구축한다면 반드시 DNS 서버를 구축해주는게 좋습니다. 예를 들어 서비스 안정화를 위해 WAS 앞단에 이중화를 위해 L4를 Setup했다고 가정해 보겠습니다. 많이 사용되는 프로그램은 HAProxy와 Nginx 정도로 예상되며 이 둘을 사용하면 이중화는 쉽게 해결할 수 있으나 가상 아이피에 몰리는 네트워크 트래픽은 분산을 시키지 못합니다. 이때 DNS Round Robin을 걸면 이러한 문제를 쉽게 해결 할 수 있습니다. 다음으로는 DNS의 알려진 장점인 아이피 변경이 매우 쉽다는것을 알 수 있습니다.

     

    가이드에서는 CentOS에서 Bind를 사용하여 DNS를 구축하는 방법을 설명합니다.

     

    bind 및 bind-utils 설치

    [root@garage ~]# dnf -y install bind bind-utils
    Last metadata expiration check: 0:25:15 ago on Fri 04 Dec 2020 10:02:49 PM KST.
    Dependencies resolved.
    =============================================================================================================================================
     Package                            Architecture               Version                                   Repository                     Size
    =============================================================================================================================================
    Installing:
     bind                               x86_64                     32:9.11.13-6.el8_2.1                      AppStream                     2.1 M
     bind-utils                         x86_64                     32:9.11.13-6.el8_2.1                      AppStream                     443 k
    Installing dependencies:
     bind-libs                          x86_64                     32:9.11.13-6.el8_2.1                      AppStream                     172 k
     bind-libs-lite                     x86_64                     32:9.11.13-6.el8_2.1                      AppStream                     1.2 M
     bind-license                       noarch                     32:9.11.13-6.el8_2.1                      AppStream                     101 k
     python3-bind                       noarch                     32:9.11.13-6.el8_2.1                      AppStream                     148 k
    
    Transaction Summary
    =============================================================================================================================================
    Install  6 Packages
    
    Total download size: 4.1 M
    Installed size: 9.2 M
    Downloading Packages:
    (1/6): bind-libs-9.11.13-6.el8_2.1.x86_64.rpm                                                                495 kB/s | 172 kB     00:00
    (2/6): bind-license-9.11.13-6.el8_2.1.noarch.rpm                                                             4.7 MB/s | 101 kB     00:00
    (3/6): bind-utils-9.11.13-6.el8_2.1.x86_64.rpm                                                               8.0 MB/s | 443 kB     00:00
    (4/6): bind-libs-lite-9.11.13-6.el8_2.1.x86_64.rpm                                                           2.6 MB/s | 1.2 MB     00:00
    (5/6): python3-bind-9.11.13-6.el8_2.1.noarch.rpm                                                             6.5 MB/s | 148 kB     00:00
    (6/6): bind-9.11.13-6.el8_2.1.x86_64.rpm                                                                     3.5 MB/s | 2.1 MB     00:00
    ---------------------------------------------------------------------------------------------------------------------------------------------
    Total                                                                                                        2.5 MB/s | 4.1 MB     00:01
    Running transaction check
    Transaction check succeeded.
    Running transaction test
    Transaction test succeeded.
    Running transaction
      Preparing        :                                                                                                                     1/1
      Installing       : bind-license-32:9.11.13-6.el8_2.1.noarch                                                                            1/6
      Installing       : bind-libs-lite-32:9.11.13-6.el8_2.1.x86_64                                                                          2/6
      Installing       : bind-libs-32:9.11.13-6.el8_2.1.x86_64                                                                               3/6
      Installing       : python3-bind-32:9.11.13-6.el8_2.1.noarch                                                                            4/6
      Installing       : bind-utils-32:9.11.13-6.el8_2.1.x86_64                                                                              5/6
      Running scriptlet: bind-32:9.11.13-6.el8_2.1.x86_64                                                                                    6/6
      Installing       : bind-32:9.11.13-6.el8_2.1.x86_64                                                                                    6/6
      Running scriptlet: bind-32:9.11.13-6.el8_2.1.x86_64                                                                                    6/6
      Verifying        : bind-32:9.11.13-6.el8_2.1.x86_64                                                                                    1/6
      Verifying        : bind-libs-32:9.11.13-6.el8_2.1.x86_64                                                                               2/6
      Verifying        : bind-libs-lite-32:9.11.13-6.el8_2.1.x86_64                                                                          3/6
      Verifying        : bind-license-32:9.11.13-6.el8_2.1.noarch                                                                            4/6
      Verifying        : bind-utils-32:9.11.13-6.el8_2.1.x86_64                                                                              5/6
      Verifying        : python3-bind-32:9.11.13-6.el8_2.1.noarch                                                                            6/6
    
    Installed:
      bind-32:9.11.13-6.el8_2.1.x86_64              bind-libs-32:9.11.13-6.el8_2.1.x86_64       bind-libs-lite-32:9.11.13-6.el8_2.1.x86_64
      bind-license-32:9.11.13-6.el8_2.1.noarch      bind-utils-32:9.11.13-6.el8_2.1.x86_64      python3-bind-32:9.11.13-6.el8_2.1.noarch
    
    Complete!
    [root@garage ~]#

    bind 구성

    bind가 설치되면 /etc 디렉토리 아래에 named.conf 파일이 생성됩니다. bind에 직접적인 설정 변경이며 반드시 필요한 항목만 변경하였습니다.

    - listen-on port 53 { any; };
      서버에 할당된 모든 IP로 서비스가 필요하므로 any로 변경하였습니다. IP를 고정해서 서비스를 하고 싶다면 아이피를 직접 입력해도 됩니다.

    - allow-query     { 10.0.0.0/24; };

      DNS Query에 응답할 아이피 대역을 입력해줍니다. DHCP서버에서 10.0.0.0/24 아이피를 할당해주므로 해당 아이피 대역을 입력하였습나다. 대역이 여러개이면 { 10.0.0.0/24; 192.168.1.0/24; }; 처럼 입력 가능합니다.

    - allow-transfer { none; };

      Slave 서버가 존재할 경우 Slave 서버의 아이피를 입력합니다. DNS 이중화는 반드시 필요한 항목입니다. 운영 환경이라면 반드시 이중화를 구성하는것을 권장합니다. 

    - recursion no;

      recursion 항목을 yes로 설정할 경우 DNS 등록된 레코드가 없을 경우 연결된 DNS 포워딩하여 질의합니다. yes로 설정하게 된다면 추가로 forwarders 항목이 필요합니다. forwarders는 아래와 같이 설정해야 합니다.

      forwarders {

        1.1.1.1;

        8.8.8.8;

      }

    - include "/etc/named/homelab.local.zones";

      도메인 정보를 설정할 파일입니다. 자세한 내용은 아래에서 설명하겠습니다.

    - include "/etc/named/homelab.local.key";

      DNS Record의 다이나믹 업데이트를 위한 key 파일입니다. 다이나믹 업데이트를 허용해두면 cli로 레코드를 업데이트 가능하므로 매우 편리합니다. 반드시 설정하도록 합니다. DNS Key 생성은 dnssec-keygen 명령으로 생성가능합니다.

     

    설정 파일의 전체 내용은 아래와 같습니다.

    //
    // 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 { 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";
    	secroots-file	"/var/named/data/named.secroots";
    	recursing-file	"/var/named/data/named.recursing";
    	allow-query     { 10.0.0.0/24; };
    	allow-transfer  { none; };
    
    	/*
    	 - 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 no;
    
    	dnssec-enable yes;
    	dnssec-validation yes;
    
    	managed-keys-directory "/var/named/dynamic";
    
    	pid-file "/run/named/named.pid";
    	session-keyfile "/run/named/session.key";
    
    	/* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
    	include "/etc/crypto-policies/back-ends/bind.config";
    };
    
    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";
    
    include "/etc/named/homelab.local.zones";
    include "/etc/named/homelab.local.key";

    도메인 설정

    이어서 homelab.local.zones을 설정해보도록 하겠습니다. Sample 내용은 /etc/named.rfc1912.zones 파일을 참고하면 됩니다. 전체 내용은 정방향과 역방향에 대한 내용과 이중화에 대한 내용을 포함하고 있습니다.

    - type master;

       type을 사용하여 master/slave 구분이 가능합니다. master 서버이므로 master를 입력합니다.

    - file "named.homelab.local.forward"

      실제 레코드가 저장되어 있는 파일입니다. 일반적으로 /var/named 경로에 위 파일 이름으로 저장됩니다.

    - allow-update { key "homelab.local.key"; };

      다이나믹 업데이트를 사용한다면 위 항목을 설정해야합니다. 다이나믹 업데이트가 가능한 서버를 지정해 줄 수 있습니다.

    zone "homelab.local" IN {
            type master;
            file "named.homelab.local.forward";
            allow-update { key "homelab.local.key"; };
    };
    
    zone "0.0.10.in-addr.arpa" IN {
            type master;
            file "named.homelab.local.reverse";
            allow-update { key "homelab.local.key"; };
    };

    이제 다이나믹 업데이트를 위한 키 파일을 생성합니다. key는 dnssec-keygen 명령으로 생성 가능합니다. 아래 출력 내용의 /etc/named/homelab.local.key 내용을 참고하시면 됩니다. 키 파일을 이용하면 레코드 변경이 가능하므로 유출되지 않도록 합니다. 

    [root@garage named]# dnssec-keygen -a HMAC-MD5 -b 512 -n HOST homelab.local.key
    Khomelab.local.key.+157+44589
    [root@garage named]# ls -tlr
    total 12
    -rw-------. 1 root root 229 Dec  4 23:02 Khomelab.local.key.+157+44589.private
    -rw-------. 1 root root 126 Dec  4 23:02 Khomelab.local.key.+157+44589.key
    [root@garage named]# cat "Khomelab.local.key.+157+44589.key"
    homelab.local.key. IN KEY 512 3 157 dxxxxxxxxxxxxxx xxxxxxxxxxxxx==
    [root@garage named]# cat /etc/named/homelab.local.key
    key "homelab.local.key" {
        algorithm hmac-md5;
        secret "dxxxxxxxxxxxxxx xxxxxxxxxxxxx==";
    };
    [root@garage named]#

     

    레코드 파일 설정

    정방향 파일부터 설정하겠습니다. 설명은 파일 내용 안에 포함하였습니다.

    $TTL 86400
    @ IN SOA dns.homelab.local. root.homelab.local. (
        2020010101    ; Serial
        86400         ; Refresh (1 day)
        3600          ; Retry   (1 hour)
        604800        ; Expire  (1 week)
        10800         ; Min TTL (3 hours)
    )
        ; Set your name servers hostname
        IN NS         dns.homelab.local.
        ; Set your name server ip
        IN A          10.0.0.1
    
    ; Set each IP Address
    dns               IN A 10.0.0.1

    역방향 파일을 설정하겠습니다. 마찬가지로 세부 내용을 내용 안에 포함하였습니다.

    $TTL 86400
    @ IN SOA dns.homelab.local. root.homelab.local. (
        2020010101    ; Serial
        86400         ; Refresh (1 day)
        3600          ; Retry   (1 hour)
        604800        ; Expire  (1 week)
        10800         ; Min TTL (3 hours)
    )
        ; Set your name servers hostname
        IN NS         dns.homelab.local.
    
    ; Set each IP Address of hostname.
    1                 IN PTR dns.homelab.local.

    전체 설정이 완료되면 named-checkconf 명령으로 설정이 제대로 되었는지 확인 가능합니다.

    [root@garage ~]# named-checkconf -z /etc/named.conf
    zone localhost.localdomain/IN: loaded serial 0
    zone localhost/IN: loaded serial 0
    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: loaded serial 0
    zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
    zone 0.in-addr.arpa/IN: loaded serial 0
    zone homelab.local/IN: loaded serial 2020010101
    zone 0.0.10.in-addr.arpa/IN: loaded serial 2020010101
    [root@garage ~]#

    그리고 host 명령으로 정방향, 역방향이 정상적으로 조회되는지 확인합니다.

    [root@garage named]# host dns.homelab.local
    dns.homelab.local has address 10.0.0.1
    [root@garage named]# host 10.0.0.1
    1.0.0.10.in-addr.arpa domain name pointer garage.homelab.local.
    [root@garage named]#

     

    다이나믹 업데이트

    DNS 키를 사용하여 동적 업데이트가 되는지 확인해 봅니다.

    [root@garage ~]# nsupdate -v -k /etc/named/homelab.local.key << EOF
    > update add test.homelab.local. 10864 A 10.0.0.100
    > send
    > update add 100.0.0.10.in-addr.arpa 10864 PTR test.homelab.local.
    > send
    > EOF
    [root@garage ~]# host test.homelab.local
    test.homelab.local has address 10.0.0.100
    [root@garage ~]# host 10.0.0.100
    100.0.0.10.in-addr.arpa domain name pointer test.homelab.local.
    [root@garage ~]#

    동적 업데이트 후 추가된 레코드에 대해서 정방향 역방향 조회가되면 정상적으로 업데이트되었습니다.

     

    정리

    CentOS 8에서 DNS 서비스를 구축해보았습니다. 비록 이중화에 대한 부분은 빠져있지만 전체 적인 내용만 이해한다면 참조 내용에 포함되어 있는 이중화 부분은 그리 어렵지 않게 구축 가능하리라 생각됩니다.

     

     

    참조

    - https://computingforgeeks.com/configure-authoritative-bind-dns-server-on-centos-rhel/

    반응형

    'IT' 카테고리의 다른 글

    Kubernetes Cluster Version 업그레이드  (0) 2021.01.01
    UEFI를 위한 PXE Boot 서버 구축  (0) 2020.12.05
    389 Directory Server 설치 [3]  (0) 2020.11.30
    389 Directory Server 설치 [2]  (0) 2020.11.30
    389 Directory Server 설치 [1]  (0) 2020.11.30
Designed by Tistory.