[bind9] 자체 DNS(Domain Name System) 구축하기 (Ubuntu)

gweowe·2023년 6월 28일
0

회사에서 일을 하거나 개인 작업을 하다보면 Domain을 사용하여 테스트를 할 일이 자주 생기기 마련입니다. 이럴 때 DNS 서버가 있다면 정말 유용하게 사용할 수 있기에, DNS 서버를 구축하는 방법에 대해 정리해보았습니다.

사전 준비 사항

1. DNS를 구축할 서버(Ubuntu) 1대가 필요합니다.

작성자의 Ubuntu 버전은 Ubuntu 22.04.3 입니다.

2. DNS 서버에 bind9 패키지를 설치해주어야 합니다.

sudo apt install bind9

3. DNS 서버에 resolvconf 패키지를 설치해주어야 합니다.

sudo apt install resolvconf

4. DNS 서버의 53번 Port가 열려있어야 합니다.

sudo ufw allow 53

자기 자신을 네임서버로 등록하기

1. resolv.conf 파일 수정

/etc/resolv.conf
nameserver 127.0.0.53

127.0.0.53은 systemd-resolved가 DNS를 관리하기 위해 사용하는 IP 주소입니다.

이제 resolv.conf의 값을 수정해야 하는데 /etc/resolv.conf를 수정할 경우, 서버가 재부팅 되었을 때 값이 초기화되는 문제가 생깁니다. 그 이유는 /etc/resolv.conf의 값은 재부팅 시 /etc/resolvconf/resolv.conf.d/head의 값을 참조하여 가져오기 때문입니다. 이를 해결하기 위해서는 /etc/resolv.conf가 아니라 /etc/resolvconf/resolv.conf.d/head의 값을 수정해야 합니다.

/etc/resolvconf/resolv.conf.d/head
nameserver 127.0.0.1

이와 같이 루프백 IP 주소를 추가하면 자기 자신을 네임서버로 등록할 수 있습니다. 서버의 실제 IP 주소를 직접 입력하셔도 됩니다.

2. 서버 재부팅

sudo reboot

변경사항을 적용하기 위해 서버를 재부팅합니다. 서버를 재부팅하기 어려운 상황이라면 /etc/resolv.conf를 직접 동일하게 수정하는 것도 방법입니다.

bind9을 이용해서 DNS 서버 만들기

1. zone 기본 파일 구성 확인

우선 기본적으로 제공되어 있는 db.local파일을 살펴봅시다.

/etc/bind/db.local
;
; BIND data file for local loopback interface
;
$TTL  604800
@ IN  SOA localhost. root.localhost. (
            2   ; Serial
       604800   ; Refresh
        86400   ; Retry
      2419200   ; Expire
       604800 ) ; Negative Cache TTL
;
@ IN  NS  localhost.
@ IN  A 127.0.0.1
@ IN  AAAA  ::1

zone 파일에 들어가는 값은 아래와 같습니다.

  • TTL : DNS 서버 정보가 캐시될 수 있는 시간, DNS 서버 정보의 데이터 유효 기간을 결정

  • SOA : 해당 Domain에 대한 기본적인 속성을 지정

    • Serial : 일련번호
    • Refresh : DNS 서버에 대한 정보를 새로고침하는 시간 간격
    • Retry : DNS 서버에 재시도 요청을 보내는 시간 간격
    • Expire : DNS 서버로부터 정보를 갱신하기 전에 기다리는 최대 시간 간격
    • Negative Cashe TTL : DNS 서버에 정상적인 응답이 없는 경우, 응답을 캐시하는 시간 간격
  • NS : 해당 domain을 관리하는 서버를 정의

  • A : Domain 이름과 IP 주소를 매핑합니다. IPv4 주소를 정의

  • AAAA : domain 이름과 IP 주소를 매핑합니다. IPv6 주소를 정의

  • CNAME : 해당 domain 이름에 새로운 별칭을 정의

  • MX : 해당 domain에서 이메일을 처리하는 메일 서버를 지정

  • TXT : 해당 domain에 대한 추가 정보를 포함하는 텍스트 데이터를 작성

2. zone 파일 생성

zone 파일을 생성하여 domain과 IP를 매핑시켜줘야 합니다. db.gweowe-test-domain.com이라는 domain으로 진행합니다.

/etc/bind/db.gweowe-test-domain.com.zone
$TTL  604800
@ IN  SOA gweowe-test-domain.com. root.gweowe-test-domain.com. (
            2   ; Serial
       604800   ; Refresh
        86400   ; Retry
      2419200   ; Expire
       604800 ) ; Negative Cache TTL
;
@ IN  NS gweowe-test-domain.com.
@ IN A 127.0.0.1

만약 자기 자신이 아닌 다른 IPv4 주소를 매핑하고 싶다면 [Domain 이름] IN A [IP 주소] 규칙으로 작성하면 다른 서버의 IP에 Domain을 등록할 수 있습니다.

예를 들어 examaple IN A 12.34.56.78와 같이 입력할 경우, 12.34.56.78 IP는 example.gweowe-test-domain.com domain을 가지게 됩니다.

3. zone 파일 등록

이제 생성한 db.gweowe-test-domain.com.zone 파일을 bind9에서 읽어올 수 있도록 등록해야합니다.

/etc/bind/named.conf.default-zones
# ..............................생략..............................

zone "gweowe-test-domain.com" {
  type master;
  file "/etc/bind/db.gweowe-test-domain.com.zone";

named.conf.default-zones 파일 맨 아래에 다음과 같은 레코드를 추가합니다. file 에 지정한 zone 파일을 읽어옵니다.

4. Options 파일 설정

자체 DNS 서버를 사용하기 위해 Options 파일을 설정합니다.

/etc/bind/named.conf.options
# ..............................생략..............................

  forwarders {
    8.8.8.8;
  };
  
  allow-query-cache {
    10.100.10.1;
    10.110.0.0/16;
  };
  
# ..............................생략..............................

forwarders : 자체 DNS 서버에 없을 경우, 외부 DNS 서버에 쿼리를 전달하고 해당 결과를 반환하는 역할을 하는 구성 요소입니다.

allow-query-cache : 자체 DNS 서버를 사용할 대상의 IP 혹은 CIDR를 지정하여 접근을 허용하는 구성 요소입니다.

5. bind9 재시작

모든 설정이 끝났으므로, bind9을 재시작합니다.

sudo systemctl restart bind9

DNS 서버 구축이 완료되었습니다.

테스트

4. nslookup 명령어를 사용하여 테스트

Input :
nslookup gweowe-test-domain.com
Output :
Server:            127.0.0.1
Address:        127.0.0.1#53

Name:   gweowe-test-domain.com
Address: 127.0.0.1

만약 성공적으로 DNS 서버를 구축했다면, 위와 같은 output이 출력되며 정상적으로 작동하는 것을 확인하실 수 있습니다.

profile
정리하는 공간

0개의 댓글