회사에서 일을 하거나 개인 작업을 하다보면 Domain을 사용하여 테스트를 할 일이 자주 생기기 마련입니다. 이럴 때 DNS 서버가 있다면 정말 유용하게 사용할 수 있기에, DNS 서버를 구축하는 방법에 대해 정리해보았습니다.
작성자의 Ubuntu 버전은 Ubuntu 22.04.3
입니다.
sudo apt install bind9
sudo apt install resolvconf
sudo ufw allow 53
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
의 값을 수정해야 합니다.
nameserver 127.0.0.1
이와 같이 루프백 IP 주소를 추가하면 자기 자신을 네임서버로 등록할 수 있습니다. 서버의 실제 IP 주소를 직접 입력하셔도 됩니다.
sudo reboot
변경사항을 적용하기 위해 서버를 재부팅합니다. 서버를 재부팅하기 어려운 상황이라면 /etc/resolv.conf
를 직접 동일하게 수정하는 것도 방법입니다.
우선 기본적으로 제공되어 있는 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에 대한 추가 정보를 포함하는 텍스트 데이터를 작성
zone 파일을 생성하여 domain과 IP를 매핑시켜줘야 합니다. db.gweowe-test-domain.com
이라는 domain으로 진행합니다.
$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을 가지게 됩니다.
이제 생성한 db.gweowe-test-domain.com.zone
파일을 bind9에서 읽어올 수 있도록 등록해야합니다.
# ..............................생략..............................
zone "gweowe-test-domain.com" {
type master;
file "/etc/bind/db.gweowe-test-domain.com.zone";
named.conf.default-zones
파일 맨 아래에 다음과 같은 레코드를 추가합니다. file
에 지정한 zone 파일을 읽어옵니다.
자체 DNS 서버를 사용하기 위해 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를 지정하여 접근을 허용하는 구성 요소입니다.
모든 설정이 끝났으므로, bind9을 재시작합니다.
sudo systemctl restart bind9
DNS 서버 구축이 완료되었습니다.
nslookup
명령어를 사용하여 테스트nslookup gweowe-test-domain.com
Server: 127.0.0.1
Address: 127.0.0.1#53
Name: gweowe-test-domain.com
Address: 127.0.0.1
만약 성공적으로 DNS 서버를 구축했다면, 위와 같은 output이 출력되며 정상적으로 작동하는 것을 확인하실 수 있습니다.