[Ubuntu] 08. DNS 서버 구성

Date:     Updated:

카테고리:

태그:


🔔 환경설정 파일 (Bind)



**■ 패키지 **

패키지명 설명
bind BIND 데몬의 기본 패키지
bind-utils BIND 데몬 운영에 관련된 보조 유틸리티
bind-libs BIND 데몬에서 사용되는 라이브러리
bind-chroot BIND 데몬의 보안 향상을 위해 사용되는 패키지
caching-nameserver BIND 데몬의 환경 설정을 위한 패키지 (현재 BIND에 통합되어 설치됨)


🔔 BIND : 내부 네트워크 구성



■ bind 설치

$ apt -y install bind9 bind9utils


■ 내부 네트워크에 대한 설정

  • 다음은 로컬 네트워크가 [192.168.219.0/24]이고 도메인 이름이 [test.srv]인 경우의 예
$ cat /etc/bind/named.conf

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";

# 추가
include "/etc/bind/named.conf.internal-zones";


$ cat /etc/bind/named.conf.options
acl internal-network {
        192.168.219.0/24;
};

options {
        directory "/var/cache/bind";

        ...
        ...
  
        # 위의 [로컬 네트워크] 섹션에 로컬 네트워크 세트 추가
        # 호스트에서 쿼리를 수신할 수 있는 네트워크 범위
        allow-query { localhost; internal-network; };

        # zone 파일을 클라이언트로 전송할 수 있는 네트워크 범위
        # secondary DNS 서버가 있는 경우 추가
        allow-transfer { localhost; };

        recursion yes;

        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================

        dnssec-validation auto;

        listen-on-v6 { any; };
};


$ cat /etc/bind/named.conf.internal-zones
# 네트워크 및 도메인 이름에 대한 Zone 추가
zone "test.srv" IN {
        type master;
        file "/etc/bind/named/test.srv.lan";
        allow-update { none; };
};
zone "219.168.192.in-addr.arpa" IN {
        type master;
        file "/etc/bind/named/219.168.192.db";
        allow-update { none; };
};


$ cat /etc/default/named
# IPv6를 사용하지 않고 IPv6 관련 로그도 표시하지 않는 경우 변경 가능
# IPv4만 사용하도록 BIND 설정
OPTIONS="-u bind -4"


■ Zone 파일 구성

  • 서버가 도메인 이름에서 IP 주소를 확인하는 Zone 파일 작성
$ mkdir named


$ cat /etc/bind/named/test.srv.lan

$TTL 86400
@   IN  SOA     dlp.test.srv. root.test.srv. (
        # 일련 번호에 대해서는 아무 숫자 값도 괜찮지만
        # 권장 사항은 [YYYYMMDDnn](업데이트 날짜 + 번호)
        2022081001  ;Serial
        3600        ;Refresh
        1800        ;Retry
        604800      ;Expire
        86400       ;Minimum TTL
)
        # 네임 서버 정의
        IN  NS      dlp.test.srv.
        # 네임 서버의 IP 주소 정의
        IN  A       192.168.219.101
        # 메일 교환기 서버 정의
        IN  MX 10   dlp.test.srv.

# 호스트 이름의 각 IP 주소 정의
dlp     IN  A       192.168.219.101
www     IN  A       192.168.219.102
  • 서버가 IP 주소에서 도메인 이름을 확인하는 Zone 파일을 작성
$ vim /etc/bind/named/219.168.192.db

$TTL 86400
@   IN  SOA     dlp.test.srv. root.test.srv. (
        2022081001  ;Serial
        3600        ;Refresh
        1800        ;Retry
        604800      ;Expire
        86400       ;Minimum TTL
)
        # 네임 서버 정의
        IN  NS      dlp.test.srv.

# IP 주소의 각 호스트 이름 정의
101     IN  PTR     dlp.test.srv.
102     IN  PTR     www.test.srv.


■ Start and Enable BIND.

$ systemctl restart named


■ 확인

# 필요한 경우 자신의 DNS를 참조하도록 DNS 설정을 변경
$ vi /etc/netplan/01-netcfg.yaml
# change to self IP address
    nameservers:
        addresses: [192.168.219.195]


$ netplan apply


$ dig dlp.test.srv.

; <<>> DiG 9.18.12-0ubuntu0.22.04.1-Ubuntu <<>> dlp.test.srv.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30196
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;dlp.test.srv.                  IN      A

;; ANSWER SECTION:
dlp.test.srv.           86400   IN      A       192.168.219.101

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Mon Jun 12 17:48:55 KST 2023
;; MSG SIZE  rcvd: 57


$ dig -x 192.168.219.101

; <<>> DiG 9.18.12-0ubuntu0.22.04.1-Ubuntu <<>> -x 192.168.219.101
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34538
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;101.219.168.192.in-addr.arpa.  IN      PTR

;; ANSWER SECTION:
101.219.168.192.in-addr.arpa. 7189 IN   PTR     dlp.test.srv.

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Mon Jun 12 17:50:33 KST 2023
;; MSG SIZE  rcvd: 83


🔔 BIND : 외부 네트워크 구성


  • 이후 설정은 위 예제와 같다.
$ vi /etc/bind/named.conf

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";

# 추가
include "/etc/bind/named.conf.external-zones";


$ vim /etc/bind/named.conf.options
options {
        directory "/var/cache/bind";

.....
.....

        # 변경 : 모든 호스트에서 쿼리를 수신
        allow-query     { any; };
        # Zone 파일을 클라이언트로 전송할 수 있는 네트워크 범위
        # 보조 DNS 서버가 있는 경우 추가
        allow-transfer  { localhost; };
        # 변경 : 재귀 쿼리를 허용하지 않음
        # 이 서버에만 해당 항목이 있는 영역에 대한 답변
        recursion no;

        //=======================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //=======================================================================

        dnssec-validation auto;

        listen-on-v6 { any; };
};


🔔 DNS - View Statement


특정 사용자 또는 그룹에게만 특정한 DNS 정보를 제공하는 기능으로, 예를 들어, 회사 내부에서만 접근 가능한 도메인 이름이 있는 경우, 회사 내부 IP 주소 범위를 기반으로 View Statement를 설정하여 내부 사용자에게만 해당 도메인 이름을 제공할 수 있다.

$ cat /etc/bind/named.conf

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
# comment out
# include "/etc/bind/named.conf.default-zones";

# 추가
include "/etc/bind/named.conf.internal-zones";
include "/etc/bind/named.conf.external-zones";


$ cat /etc/bind/named.conf.options
acl internal-network {
        192.168.219.0/24;
};

options {
        directory "/var/cache/bind";

        ...
        ...
  
        # 위의 [로컬 네트워크] 섹션에 로컬 네트워크 세트 추가
        # 호스트에서 쿼리를 수신할 수 있는 네트워크 범위
        allow-query { localhost; internal-network; };

        # zone 파일을 클라이언트로 전송할 수 있는 네트워크 범위
        # secondary DNS 서버가 있는 경우 추가
        allow-transfer { localhost; };

        recursion yes;

        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================

        dnssec-validation auto;

        listen-on-v6 { any; };
};


$ vi /etc/bind/named.conf.internal-zones
view "internal" {
        # 내부 네트워크 영역 설정
        match-clients {
                localhost;
                internal-network;
        };
        zone "test.srv" {
                type master;
                file "/etc/bind/test.srv.lan";
                allow-update { none; };
        };
        zone "219.168.192.in-addr.arpa" {
                type master;
                file "/etc/bind/219.168.192.db";
                allow-update { none; };
        };
        include "/etc/bind/named.conf.default-zones";
};


$ vi /etc/bind/named.conf.external-zones
view "external" {
        # 내부 섹션의 [match-client]에 정의된 대상을 제외하고 모두 일치
        match-clients { any; };
        allow-query { any; };
        # 재귀 쿼리를 허용하지 않음
        recursion no;
        zone "srv.world" {
                type master;
                file "/etc/bind/srv.world.wan";
                allow-update { none; };
        };
        zone "80.0.16.172.in-addr.arpa" {
                type master;
                file "/etc/bind/80.0.16.172.db";
                allow-update { none; };
        };
};

UBUNTU 카테고리 내 다른 글 보러가기

댓글 남기기