Ubuntu에서 BIND9(DNS) 설정하기

Ubuntu에서 BIND9(DNS) 설정하기

BIND9와 DNS 한눈에 보기

DNS 서버·네임서버·DNS 차이 요약

BIND9(Berkeley Internet Name Domain)은 오픈소스 DNS 서버 소프트웨어로, 호스트 이름과 IP 주소 간의 매핑을 처리하는 이름 해석 기능을 제공합니다.

DNS 서버는 네임서비스를 수행하는 서버 유형이며, 네임서버는 이름 해석을 제공하는 서버 전반을 가리키는 더 넓은 개념입니다.

즉, 모든 DNS 서버는 네임서버에 포함되지만 모든 네임서버가 DNS 서버인 것은 아닙니다. 실무에서는 두 용어가 혼용되는 경우가 많습니다.


준비사항(Prerequisites & Test Setup)

이 가이드는 Ubuntu 환경에서 BIND9로 로컬 DNS 서버를 구성하는 방법을 다룹니다.

사전에 BIND9가 설치되어 있어야 하며 방화벽에서 TCP/UDP 53 포트가 허용되어야 합니다.

테스트 환경은 VMware® Workstation 15 Pro에서 Ubuntu 18.04.4 LTS(64-bit)BIND 9.11.3을 사용하고, 네임서버 VM은 Host ns / FQDN ns.rex.local / IP 10.0.1.32, 검증용 외부 VM은 Host test / FQDN test.rex.local / IP 10.0.1.31를 사용합니다.

FQDN은 호스트명과 도메인명으로 구성된 전체 도메인 이름을 의미합니다.

bind9 설치 방법은 Ubuntu에 패키지로 BIND9 설치하기 를 참고하시기 바랍니다.
방화벽 설정 방법은 Ubuntu에서 UFW 방화벽 설정하기 또는 Ubuntu에서 iptables 설정하기 를 참고하시기 바랍니다.


요약(SUMMARY)

  • 호스트 식별 구성: /etc/hosts, /etc/hostname 정리
  • BIND9 옵션: named.conf.options에서 listen, forwarders, DNSSEC, recursion 설정
  • 존 구성: named.conf.local에 정/역방향 존 선언, 존 파일 2종 생성
  • 검증: named-checkconf, named-checkzone으로 문법 검사 후 서비스 재시작
  • 조회 테스트: 서버 VM·외부 VM에서 nslookup, dig로 정/역방향 확인

1. DNS 서버 VM 호스트 식별 정보 설정

1.1 /etc/hosts 구성

$ sudo vi /etc/hosts
127.0.0.1   localhost
127.0.1.1   ns.rex.local
10.0.1.32   ns.rex.local

# The following lines are desirable for IPv6 capable hosts
::1         ip6-localhost ip6-loopback
fe00::0     ip6-localnet
ff00::0     ip6-mcastprefix
ff02::1     ip6-allnodes
ff02::2     ip6-allrouters

1.2 /etc/hostname 구성

$ sudo vi /etc/hostname
ns.rex.local

호스트명 변경 뒤에는 VM 재시작이 필요합니다.


2. BIND9 핵심 옵션(named.conf.options)

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

    dnssec-validation auto;   // 루트 신뢰앵커 기반 DNSSEC 검증
    auth-nxdomain no;         // 구형 호환 필요 시 yes
    listen-on port 53 { localhost; 10.0.1.0/24; }; // 수신 인터페이스/포트
    allow-query { any; };     // 쿼리 허용 범위
    forwarders { 8.8.8.8; };  // 상위 포워더
    recursion yes;            // 재귀 질의 허용
};
  • directory: BIND 작업 디렉터리(기본 /var/cache/bind)
  • dnssec-validation: auto면 루트 신뢰앵커를 사용해 검증 (DNSSEC 유효성 검사 활성화)
  • listen-on: 요청을 수신할 인터페이스/포트 지정
  • allow-query: 질의 허용 대상
  • forwarders: 외부 이름해석 시 참조할 상위 DNS (forwarding에 사용할 IP address)
  • recursion: 로컬 캐싱 목적이면 yes 유지 (recursive query를 활성화)
Ubuntu에서 BIND9(DNS) 설정하기

3. 로컬 DNS 및 영역(Zone) 구성

이 단계에서는 BIND9에 정방향(Forward)역방향(Reverse) 영역을 선언하고, 각각의 존 파일을 작성합니다. 정방향 존은 호스트명/FQDN → IP 주소 매핑을, 역방향 존은 IP 주소 → 호스트명/FQDN 매핑을 담당합니다.

3.1 /etc/bind/named.conf.local 설정

우선 BIND에 두 개의 존을 알려줍니다. 하나는 rex.local 도메인을 책임지는 정방향 존이고, 다른 하나는 10.0.1.0/24 네트워크를 커버하는 역방향 존입니다.

$ sudo vi /etc/bind/named.conf.local

// FORWARD ZONE
zone "rex.local" IN {
    type master;
    file "rex.local.zone";
};

// REVERSE ZONE
zone "1.0.10.in-addr.arpa" IN {
    type master;
    file "rex.local.zone.rev";
};
  • zone "rex.local" IN { ... }
    • 이 블록은 rex.local 도메인에 대한 권한 존(authoritative zone)을 선언합니다.
    • N은 클래스(Class)로, 인터넷을 의미하며 일반적으로 생략하더라도 인터넷 클래스로 해석됩니다.
  • type master;
    • 이 서버를 해당 존의 마스터(Primary)로 설정합니다.
    • 상황에 따라 slave(Secondary), stub, forward, mirror, hint, redirect, static-stub, delegation-only 등으로 구성할 수도 있습니다.
  • file "rex.local.zone";
    • 정방향 존 데이터가 기록될 파일 경로입니다.
    • 절대경로가 아니면 named.conf.optionsdirectory 설정(기본: /var/cache/bind)을 기준으로 해석됩니다.
  • zone "1.0.10.in-addr.arpa" IN { ... }
    • 역방향 존 선언입니다. 10.0.1.0/24 대역의 바이트 순서를 뒤집어 표기합니다.
    • 예를 들어, /24라면 1.0.10.in-addr.arpa가 되며, /16 대역(10.0.0.0/16 또는 10.0.1.0/16 유사 케이스)이라면 0.10.in-addr.arpa처럼 더 상위 옥텟 단위로 선언합니다.

3.2 정방향 존 파일 생성

/var/cache/bind/rex.local.zone

다음 파일은 rex.local 도메인에 대한 권한 레코드를 담습니다. SOA, NS, A 레코드의 최소 구성을 예시로 제시합니다.

$ sudo vi /var/cache/bind/rex.local.zone

$TTL 86400
@   IN  SOA ns.rex.local. root.ns.rex.local. (
        1        ; Serial
        604800   ; Refresh
        86400    ; Retry
        2419200  ; Expire
        86400 )  ; Negative Cache TTL
;
@       IN  NS  ns.rex.local.
ns      IN  A   10.0.1.32
  • $TTL 86400
    • 리졸버가 레코드를 캐시하는 기본 유효시간(초)입니다.
    • 0으로 두면 캐시하지 않습니다.
  • @ IN SOA ns.rex.local. root.ns.rex.local. ( ... )
    • SOA(Start of Authority)는 존의 메타데이터와 책임 서버, 관리자 메일(마침표 앞의 root@ns.rex.local 의미) 등을 정의합니다.
    • 이 블록은 존마다 하나만 존재해야 합니다.
      • Serial: 존 데이터가 변경될 때마다 증가시키는 버전 번호(무부호 32비트 범위).
      • Refresh: 슬레이브가 마스터에 동기화를 요청하기 전 대기 시간.
      • Retry: 동기화 실패 시 재시도 간격.
      • Expire: 슬레이브가 마스터와 장시간 통신이 끊긴 경우 데이터를 더 이상 권한 있는 것으로 보지 않는 시점.
      • Negative Cache TTL: NXDOMAIN과 같은 부정 응답의 캐시 지속시간(전통적으로 최대 3시간 권장).
  • @ IN NS ns.rex.local.
    • 이 존의 권한 네임서버를 지정합니다.
    • 일반적인 텍스트 포맷은 owner-name / class / type / type-specific-data 순서를 따릅니다.
    • 여기서 @은 현재 존의 루트(= $ORIGIN)를 의미합니다.
  • ns IN A 10.0.1.32
    • ns.rex.local 호스트의 IPv4 주소를 명시합니다(A 레코드).

3.3 역방향 존 파일 생성

/var/cache/bind/rex.local.zone.rev

역방향 존 파일은 IP 주소에서 이름을 찾아야 할 때 사용합니다. 아래 예시는 10.0.1.32ns.rex.local 로 해석되도록 구성합니다.

$ sudo vi /var/cache/bind/rex.local.zone.rev

$TTL 86400
@   IN  SOA ns.rex.local. root.ns.rex.local. (
        2        ; Serial
        604800   ; Refresh
        86400    ; Retry
        2419200  ; Expire
        86400 )  ; Negative Cache TTL
;
@       IN  NS  ns.
32      IN  PTR ns.rex.local.
  • @ IN NS ns.
    • 이 역방향 존의 권한 네임서버를 지정합니다.
    • ns. 뒤의 마침표는 FQDN 종결을 의미하며, 상대 이름으로 처리되는 것을 방지합니다.
  • 32 IN PTR ns.rex.local.
    • 10.0.1.32의 호스트 부분(32)을 사용하여 ns.rex.local로 역방향 매핑합니다.
    • 만약 서브넷이 /16 등으로 더 넓다면 PTR 레코드의 오너(owner) 표기가 달라질 수 있으므로(예: 32.1 형태) 네트워크 경계를 기준으로 적절히 분리해 구성해야 합니다.

4. 설정 검사와 서비스 재시작

전체 설정 파일 확인

$ named-checkconf

정방향/역방향 존 파일 확인

# 정방향 존
$ named-checkzone rex.local /var/cache/bind/rex.local.zone
zone rex.local/IN: loaded serial 1
OK

# 역방향 존
$ named-checkzone 10.0.1.32 /var/cache/bind/rex.local.zone.rev
zone 10.0.1.32/IN: loaded serial 2
OK

오류가 없다면 서비스 재시작

$ sudo systemctl restart bind9.service
Ubuntu에서 BIND9(DNS) 설정하기

5. DNS 서버 VM에서 조회 검증(nslookup, dig)

아래 명령은 BIND가 설치된 VM(10.0.1.32)에서 실행합니다.

5.1 nslookup

$ nslookup ns.rex.local
Server:  127.0.0.53
Address: 127.0.0.53#53

Non-authoritative answer:
Name:   ns.rex.local
Address: 10.0.1.32
Name:   ns.rex.local
Address: 127.0.1.1
$ nslookup ns.rex.local localhost.localdomain
Server:  localhost.localdomain
Address: ::1#53

Name:   ns.rex.local
Address: 10.0.1.32

5.2 dig

$ dig ns.rex.local
; <<>> DiG 9.11.x-Ubuntu <<>> ns.rex.local
;; ->>HEADER<<- opcode: QUERY, status: NOERROR
;; flags: qr rd ra; QUERY: 1, ANSWER: 2

;; QUESTION SECTION:
;ns.rex.local.        IN A

;; ANSWER SECTION:
ns.rex.local.  0 IN A 127.0.1.1
ns.rex.local.  0 IN A 10.0.1.32
$ dig -x 10.0.1.32
; <<>> DiG 9.11.x-Ubuntu <<>> -x 10.0.1.32
;; ->>HEADER<<- opcode: QUERY, status: NOERROR
;; QUESTION SECTION:
;32.1.0.10.in-addr.arpa.   IN PTR

;; ANSWER SECTION:
32.1.0.10.in-addr.arpa. 0 IN PTR ns.rex.local.

.local은 mDNS 예약 도메인이라 테스트 환경에 따라 경고가 보일 수 있습니다.


6. 외부 VM에서 조회 검증(nslookup, dig)

아래 명령은 외부 VM(10.0.1.0/24)에서 실행하며, 해당 VM의 네임서버를 10.0.1.32로 지정해 둡니다.

6.1 nslookup

$ nslookup ns.rex.local
Server:  10.0.1.32
Address: 10.0.1.32#53

Name:   ns.rex.local
Address: 10.0.1.32
$ nslookup 10.0.1.32
32.1.0.10.in-addr.arpa   name = ns.rex.local.

6.2 dig

$ dig ns.rex.local
; <<>> DiG 9.11.x-Ubuntu <<>> ns.rex.local
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, aa
;; QUESTION SECTION:
;ns.rex.local.        IN A

;; ANSWER SECTION:
ns.rex.local. 86400 IN A 10.0.1.32

;; AUTHORITY SECTION:
rex.local.   86400 IN NS ns.rex.local.
$ dig -x 10.0.1.32
; <<>> DiG 9.11.x-Ubuntu <<>> -x 10.0.1.32
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, aa
;; QUESTION SECTION:
;32.1.0.10.in-addr.arpa.   IN PTR

;; ANSWER SECTION:
32.1.0.10.in-addr.arpa. 86400 IN PTR ns.rex.local.

;; AUTHORITY SECTION:
1.0.10.in-addr.arpa. 86400 IN NS ns.

마무리(CONCLUSION)

Ubuntu에서 BIND9(DNS) 설정하기

Ubuntu에서 BIND9로 로컬 DNS 서버를 준비, 구성, 검증하는 흐름을 단계별로 확인했습니다. 운영 환경에서는 DNSSEC, ACL(allow-query/allow-recursion), 로깅, 보조(slave) 서버, 뷰(View) 등의 보안·가용성 항목도 함께 고려해 안정성과 확장성을 높이길 권장합니다.


참고 자료(REFERENCES)


취업, 이직, 퇴사, 커리어 고민으로 힘든가요?

Notices를 확인하고 상담 서비스를 받으세요.

1분만 투자하세요.
1분으로 1년을 아끼고, 10년의 커리어가 달라져요.