DNS 서버 설치 · 10 min read · Sep 08, 2025
Rocky Linux 9에서 BIND로 DNS 서버 설치하는 방법

BIND 또는 Berkeley Internet Name Domain은 무료이며 오픈 소스 DNS 서버 소프트웨어입니다. 이는 인터넷에서 70% 이상의 DNS에서 사용되는 가장 인기 있는 DNS 서버 소프트웨어 중 하나입니다. BIND는 1980년대부터 존재해 왔으며, 유연성, 성능 및 기능으로 잘 알려져 있습니다. BIND는 권한 있는 DNS와 캐싱 DNS 모두로 사용할 수 있으며, 로드 밸런싱, 동적 업데이트, 분할 DNS, DNSSEC, IPv6 등 많은 기능을 지원합니다.
BIND DNS 소프트웨어는 Unix 유사 운영 체제에서 가장 신뢰할 수 있는 DNS 서버 중 하나입니다. 대부분의 Linux 배포판에서 사용할 수 있으며 DNS 서버의 진단 및 테스트를 위한 추가 도구를 제공합니다.
이 튜토리얼에서는 Rocky Linux 9 서버에서 BIND로 DNS 서버를 설정하는 방법을 보여줍니다. BIND는 권한 있는 DNS, 캐시 전용 DNS, 기본 DNS 로드 밸런싱, 분할 DNS, DNSSEC, IPv6 등 다양한 기능을 제공하는 가장 인기 있는 DNS 서버 소프트웨어 중 하나입니다.
전제 조건
이 튜토리얼을 통해 마스터-슬레이브 아키텍처로 BIND DNS 서버를 설정하고 구현할 것입니다. 따라서 두 개의 Rocky Linux 서버가 필요합니다. 또한 각 서버에서 루트/관리자 권한이 필요합니다.
도메인을 처리할 수 있는 공개 DNS 서버(권한 있는 DNS 서버)를 설정하려면 도메인 이름이 등록되어 있고 ‘Glue Records’가 구성되어 있어야 합니다.
또한 이 가이드에서는 SELinux가 ‘permissive’ 모드로 실행되고 있다고 가정합니다.
시스템 준비
이 가이드를 시작하기 위해 각 Rocky Linux 서버에서 올바른 FQDN(정규화된 도메인 이름)을 설정합니다. 이는 ‘hostnamectl‘ 명령 유틸리티와 ‘/etc/hosts‘ 파일을 통해 수행할 수 있습니다.
아래는 이 가이드의 예로 사용될 서버의 세부 정보입니다:
Hostname IP Address FQDN Used as
---------------------------------------------------------------
ns1 192.168.5.100 ns1.howtoforge.local Master
ns2 192.168.5.120 ns2.howtoforge.local Slave마스터 서버에서 아래의 hostnamectl 명령 유틸리티를 실행하여 fqdn을 ‘ns1.howtoforge.local‘로 설정합니다.
sudo hostnamectl set-hostname ns1.howtoforge.local슬레이브 서버에서도 fqdn을 ‘ns2.howtoforge.local‘로 설정하기 위해 hostnamectl 명령을 실행해야 합니다.
sudo hostnamectl set-hostname ns2.howtoforge.local다음으로, 아래의 nano 편집기 명령을 사용하여 마스터 및 슬레이브 서버의 ‘/etc/hosts’ 파일을 엽니다.
sudo nano /etc/hosts파일에 다음 줄을 추가합니다.
192.168.5.100 ns1.howtoforge.local ns1
192.168.5.120 ns2.howtoforge.local ns2작업이 완료되면 파일을 저장하고 편집기를 종료합니다.
마지막으로, 각 서버에서 fqdn을 확인하기 위해 다음 ‘hostname’ 명령을 실행합니다. 마스터 서버는 fqdn이 ‘ns1.howtoforge.local‘이고, 슬레이브 서버는 fqdn이 ‘ns2.howtoforge.local‘이어야 합니다.
sudo hostname -f아래는 마스터 서버의 출력입니다.

아래는 슬레이브 서버의 출력입니다.

fqdn이 구성되었으므로 이제 Rocky Linux 서버에 BIND를 설치할 준비가 되었습니다.
BIND 패키지 설치
기본적으로 Rocky Linux AppStream 리포지토리는 BIND 패키지의 최신 안정 버전을 제공합니다. 이 글을 작성할 당시 BIND의 현재 안정 버전은 v9.16입니다.
이 단계에서는 마스터 및 슬레이브 서버 모두에 BIND 패키지를 설치합니다. 그런 다음 BIND를 IPv4 전용으로 실행하도록 설정하고 firewalld를 구성하여 DNS 포트를 허용합니다.
아래의 dnf 명령을 실행하여 마스터 및 슬레이브 서버 모두에 BIND 패키지를 설치합니다. 확인을 요청받으면 y를 입력하여 확인하고 ENTER를 눌러 진행합니다.
sudo dnf install bind bind-utils
BIND 패키지가 설치된 후, 아래의 nano 편집기 명령을 사용하여 구성 ‘ /etc/sysconfig/named‘을 엽니다.
sudo nano /etc/sysconfig/named다음 줄로 기본 ‘OPTIONS=..‘을 추가합니다. 이 명령 옵션은 ‘bind’ 또는 ‘named’가 IPv4 전용으로 BIND를 실행하도록 합니다.
OPTIONS="-4"작업이 완료되면 파일을 저장하고 편집기를 종료합니다.
다음으로, 아래의 systemctl 명령 유틸리티를 실행하여 BIND 서비스 ‘named‘를 시작하고 활성화합니다. ‘named’ 서비스는 이제 실행 중이며 활성화되어 부팅 시 자동으로 시작됩니다.
sudo systemctl start named
sudo systemctl enable named
이제 다음 명령을 통해 ‘named’ 서비스가 실행 중이고 활성화되어 있는지 확인합니다.
sudo systemctl is-enabled named
sudo systemctl status named다음과 유사한 출력을 받게 됩니다 - BIND ‘named’ 서비스가 활성화되어 있으며 현재 실행 중입니다.

BIND ‘named’ 서비스가 실행 중이므로, 이제 firewalld에 DNS 포트를 추가해야 합니다. 이는 Rocky Linux에서 기본적으로 활성화되고 실행 중입니다.
아래의 firewall-cmd 명령 유틸리티를 실행하여 DNS 서비스를 firewalld에 추가합니다. 그런 다음 firewalld를 다시 로드하여 변경 사항을 적용합니다.
sudo firewall-cmd --add-service=dns --permanent
sudo firewall-cmd --reloadfirewalld에서 활성화된 서비스 목록을 확인하면 DNS 서비스가 활성화되어 있는 것을 볼 수 있어야 합니다. 아래의 firewall-cmd 명령을 실행하여 서비스 목록을 확인합니다.
sudo firewall-cmd --list-services출력:

이 시점에서 fqdn 구성, BIND 패키지 설치 및 firewalld 구성 작업을 완료했습니다. 이를 염두에 두고 이제 마스터 서버에서 BIND 마스터를 구성할 수 있습니다.
마스터 BIND DNS 서버 구성
이 단계에서는 Rocky Linux ‘ns1.howtoforge.local‘를 사용하여 BIND 마스터 서버를 설정하고 서버 IP 주소는 ‘192.168.5.100‘입니다. 다음 명령을 마스터 서버에서 실행해야 합니다.
다음 단계로 BIND 마스터 서버를 구성합니다:
- 기본 구성에는 ACL(액세스 제어 목록) 구성, BIND 서비스를 실행할 IP 주소 설정, 포워더 설정 등이 포함됩니다.
- 영역 설정 - 여기에서 도메인에 대한 구성을 생성합니다. 여기에는 기본 도메인 구성 및 역 DNS 구성이 포함됩니다.
기본 구성
RHEL 기반 배포판의 기본 BIND 구성은 ‘/etc/named.conf’에 있습니다.
이제 아래의 nano 편집기 명령을 사용하여 파일 ‘ /etc/named.conf‘을 엽니다.
sudo nano /etc/named.conf기본 구성을 다음 줄로 변경합니다.
acl "trusted" {
192.168.5.100; # ns1 - 또는 ns1에 localhost를 사용할 수 있습니다.
192.168.5.120; # ns2
192.168.5.0/24; # 신뢰할 수 있는 네트워크
};
options {
listen-on port 53 { 192.168.5.100; };
// listen-on-v6 port 53 { ::1; };
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 { localhost; trusted; };
recursion yes;
allow-recursion { trusted; };
allow-transfer { localhost; 192.168.5.120; };
forwarders {
8.8.8.8;
1.1.1.1;
};작업이 완료되면 파일을 저장하고 편집기를 종료합니다.

이 구성으로 BIND를 다음과 같은 구성으로 설정합니다:
- 로컬 네트워크에서 쿼리를 허용하는 ACL ‘trusted‘를 설정합니다.
- 기본 포트 ‘53‘로 ‘ 192.168.5.100‘에서 BIND 서비스를 실행합니다.
- 재귀를 활성화하고 ‘trusted‘ ACL 네트워크에서 재귀를 허용합니다.
- IP 주소 ‘192.168.5.120‘의 슬레이브 서버로 영역 전송을 허용합니다.
- Cloudflare의 공용 DNS 서버 1.1.1.1 및 Google의 8.8.8.8로 포워더를 설정합니다.
다음으로, BIND 구성 ‘ /etc/named.conf‘을 확인하기 위해 아래 명령을 실행합니다.
sudo named-checkconf /etc/named.conf마지막으로, 아래의 systemctl 명령 유틸리티를 실행하여 BIND ‘named’ 서비스를 재시작하고 변경 사항을 적용합니다.
sudo systemctl restart named이제 BIND DNS 서버의 기본 구성을 완료했습니다.
영역 설정
이제 BIND DNS 서버로 영역을 설정합니다. ‘ns1.howtoforge.local’과 ‘ns2.howtoforge.local’ 주소로 새로운 DNS 서버를 생성합니다.
시작하려면 아래의 nano 편집기 명령을 사용하여 BIND 구성 ‘ /etc/named.conf‘을 엽니다.
sudo nano /etc/named.conf파일의 맨 아래에 다음 구성을 추가합니다.
include "/etc/named/zones.conf.local";작업이 완료되면 파일을 저장하고 편집기를 종료합니다.
다음으로, 아래의 nano 편집기 명령을 사용하여 새로운 구성 ‘ /etc/named/zones.conf.local‘을 생성합니다.
sudo nano /etc/named/zones.conf.local파일에 다음 줄을 추가합니다.
zone "howtoforge.local" {
type master;
file "db.howtoforge.local"; # zone file path
allow-transfer { 192.168.5.120; }; # ns2 IP address - secondary DNS
};
zone "5.168.192.in-addr.arpa" {
type master;
file "db.192.168.5"; # subnet 192.168.5.0/24
allow-transfer { 192.168.5.120; }; # ns2 private IP address - secondary DNS
};작업이 완료되면 파일을 저장하고 종료합니다.
이 구성으로 다음과 같은 구성을 정의합니다:
- 도메인 ‘howtoforge.local‘ 및 역 DNS ‘5.168.192.in-addr.arpa‘에 대한 두 개의 영역을 생성합니다.
- 두 영역 모두 유형은 ‘master‘입니다.
- 슬레이브 DNS 서버에 대한 영역 전송을 허용합니다. 이 서버는 IP 주소 ‘192.168.5.120‘에서 실행됩니다.

다음으로, 아래의 nano 편집기 명령을 사용하여 새로운 DNS 영역 구성 ‘ /var/named/db.howtoforge.local‘을 생성합니다.
sudo nano /var/named/db.howtoforge.local파일에 다음 줄을 추가합니다.
;
; BIND data file for the local loopback interface
;
$TTL 604800
@ IN SOA ns1.howtoforge.local. admin.howtoforge.local. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
; NS records for name servers
IN NS ns1.howtoforge.local.
IN NS ns2.howtoforge.local.
; A records for name servers
ns1.howtoforge.local. IN A 192.168.5.100
ns2.howtoforge.local. IN A 192.168.5.120
; Mail handler or MX record for the domain howtoforge.local
howtoforge.local. IN MX 10 mail.howtoforge.local.
; A records for domain names
howtoforge.local. IN A 192.168.5.50
mail.howtoforge.local. IN A 192.168.5.15작업이 완료되면 파일을 저장하고 종료합니다.
이 예제에서는 다음과 같은 구성으로 영역을 설정합니다:
- IP 주소 ‘192.168.5.100‘의 Name Server 레코드 ‘ns1.howtoforge.local‘과 IP 주소 ‘192.168.5.120‘의 ‘ns2.howtoforge.local‘을 정의합니다.
- 두 개의 추가 도메인 ‘howtoforge.local‘을 정의하며, 이는 서버 IP 주소 ‘192.168.5.50‘로 해결됩니다. 도메인 ‘mail.howtoforge.local‘은 IP 주소 ‘192.168.5.15‘로 해결됩니다.
- 또한 도메인 ‘howtoforge.local‘에 대한 MX 레코드를 생성하여 메일 서버 ‘mail.howtoforge.local‘이 처리하도록 합니다.

다음으로, 도메인 ‘howtoforge.local‘에 대한 역 DNS를 구성합니다.
아래의 nano 편집기 명령을 사용하여 새로운 역 DNS 구성 ‘ /var/named/db.192.168.5‘을 생성합니다.
sudo nano /var/named/db.192.168.5파일에 다음 줄을 추가합니다.
;
; BIND reverse data file for the local loopback interface
;
$TTL 604800
@ IN SOA ns1.howtoforge.local. admin.howtoforge.local. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
; name servers - NS records
IN NS ns1.howtoforge.local.
IN NS ns2.howtoforge.local.
; PTR Records
100 IN PTR ns1.howtoforge.local. ; 192.168.5.100
120 IN PTR ns2.howtoforge.local. ; 192.168.5.120
50 IN PTR howtoforge.local. ; 192.168.5.50
15 IN PTR mail.howtoforge.local. ; 192.168.5.15작업이 완료되면 파일을 저장하고 종료합니다.
이 구성으로 다음과 같은 역 DNS 또는 PTR 레코드를 설정합니다.
- 역 DNS 구성에서 Name Server ‘ns1.howtoforge.local‘ 및 ‘ns2.howtoforge.local‘을 정의합니다.
- 각 역 DNS 구성은 각 도메인으로 해결되는 IP 주소의 마지막 숫자를 사용합니다. 이 예제에서는 Name Server ‘ns1.howtoforge.local‘의 IP 주소 ‘192.168.5.100‘이며, PTR 레코드는 ‘100‘이어야 합니다.
- 나머지 PTR 레코드는 위에서 설명한 것과 동일합니다.

이 시점에서 도메인 ‘howtoforge.local‘에 대한 두 개의 영역 구성을 생성하고 Name Server ‘ns1.howtoforge.local‘ 및 ‘ns2.howtoforge.local‘을 생성했습니다.
이제 아래의 chmod 명령을 실행하여 두 영역 구성의 소유권을 변경합니다.
sudo chown -R named: /var/named/{db.howtoforge.local,db.192.168.5}그런 다음 ‘ named-checkconf ‘ 명령 유틸리티를 통해 영역 구성 파일을 확인합니다.
sudo named-checkconfsudo named-checkzone howtoforge.local /var/named/db.howtoforge.local
sudo named-checkzone 5.168.192.in-addr.arpa /var/named/db.192.168.5적절한 BIND 구성이 있는 경우 다음 스크린샷과 유사한 출력을 받게 됩니다.

마지막으로, 아래의 systemctl 명령을 실행하여 BIND ‘named’ 서비스를 재시작하고 변경 사항을 적용합니다. 그런 다음 BIND 서비스 상태를 확인하여 서비스가 실행 중인지 확인합니다.
sudo systemctl restart named
sudo systemctl status named다음과 유사한 출력을 받게 됩니다 - BIND ‘ named ‘ 서비스가 실행 중이며 BIND 마스터 구성을 완료했습니다.

다음 단계에서는 BIND 슬레이브 서버를 설정합니다.
슬레이브 BIND DNS 서버 설정
DNS 마스터 서버를 구성한 후, IP 주소 ‘192.168.5.120’의 서버 ‘ns2.howtoforge.local’에서 BIND 슬레이브 서버를 구성하기 시작합니다.
‘named.conf’의 기본 구성은 BIND 마스터와 유사하며, 영역 파일의 경우 실제 파일을 생성하지 않고 파일 이름을 정의할 수 있습니다.
시작하기 전에 BIND 슬레이브 서버에서 다음 명령을 실행해야 합니다.
이제 슬레이브 서버에서 BIND 구성 ‘ /etc/named.conf‘을 아래의 nano 편집기 명령으로 엽니다.
sudo nano /etc/named.conf기본 구성을 다음 줄로 변경합니다.
acl "trusted" {
192.168.5.100; # ns1 - 또는 ns1에 localhost를 사용할 수 있습니다.
192.168.5.120; # ns2
192.168.5.0/24; # 신뢰할 수 있는 네트워크
};
options {
listen-on port 53 { 192.168.5.120; };
//listen-on-v6 port 53 { ::1; };
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 { any; };
recursion yes;
allow-recursion { trusted; };
allow-transfer { none; };
forwarders {
8.8.8.8;
1.1.1.1;
};
};설정은 BIND 마스터 서버와 유사하며, 구성의 차이점은 다음과 같습니다.
- 슬레이브 서버에서 BIND 서비스는 IP 주소 ‘192.168.5.120‘에서 실행됩니다.
- 재귀가 활성화되어 있지만 ‘allow-transfer’는 ‘none‘으로 구성되어 있습니다.

이제 영역을 정의하기 위해 ‘named.conf’ 파일의 맨 아래에 다음 줄을 추가합니다.
include "/etc/named/zones.conf.local";작업이 완료되면 파일을 저장하고 편집기를 종료합니다.
다음으로, 아래의 nano 편집기 명령을 사용하여 새로운 구성 ‘ /etc/named/zones.conf.local‘을 생성합니다.
sudo nano /etc/named/zones.conf.local파일에 다음 줄을 추가합니다.
zone "howtoforge.local" {
type slave;
file "slaves/db.howtoforge.local";
masters { 192.168.5.100; }; # ns1 IP address - master DNS
};
zone "5.168.192.in-addr.arpa" {
type slave;
file "slaves/db.192.168.5";
masters { 192.168.5.100; }; # ns1 IP address - master DNS
};작업이 완료되면 파일을 저장하고 종료합니다.
이로써 BIND 슬레이브 서버에서 다음과 같은 구성을 정의합니다:
- 도메인 ‘howtoforge.local‘ 및 역 DNS에 대한 두 개의 영역을 정의합니다.
- 두 영역 모두 유형은 ‘slave‘입니다.
- 각 영역 파일은 BIND 마스터 서버에서 전송된 ‘/var/named/slaves‘ 디렉토리에서 가져옵니다.

다음으로, 아래의 ‘named-checkconf’ 명령 유틸리티를 실행하여 BIND 구성을 확인합니다. 그런 다음 슬레이브 서버에서 systemctl 명령을 통해 BIND ‘named’ 서비스를 재시작합니다.
sudo named-checkconf
sudo systemctl restart named적절한 BIND 구성이 있는 경우 오류 메시지가 표시되지 않습니다.
마지막으로, 슬레이브 서버에서 BIND ‘ named ‘ 서비스가 실행 중인지 확인하기 위해 다음 systemctl 명령을 실행합니다.
sudo systemctl status named이제 BIND 슬레이브 서버에서 BIND ‘named’ 서비스가 실행 중이라는 다음과 유사한 출력을 받게 됩니다.

이 시점에서 마스터-슬레이브 아키텍처로 BIND DNS 설치를 완료했습니다. 이제 클라이언트 머신에서 테스트를 시작할 준비가 되었습니다.
클라이언트에서 테스트
이 예제에서는 클라이언트 머신으로 Debian 시스템을 사용하므로, 시작하기 전에 아래의 패키지를 APT를 통해 설치합니다.
sudo apt install dnsutils bind9-utils확인을 요청받으면 y를 입력하고 ENTER를 눌러 진행합니다.

다음으로, 아래의 명령을 실행하여 기본 링크 파일 ‘ /etc/resolv.conf‘을 제거하고 nano 편집기를 사용하여 새 파일을 생성합니다.
sudo unlink /etc/resolv.conf
sudo nano /etc/resolv.conf파일에 다음 구성을 추가합니다. 다음 구성에서는 BIND DNS 마스터, 보조 BIND DNS 서버 및 공용 Cloudflare DNS 리졸버의 세 가지 서로 다른 리졸버를 정의합니다. 클라이언트 머신이 도메인 이름에 대한 정보를 요청하면 정보는 DNS 리졸버에서 위에서 아래로 가져옵니다.
nameserver 192.168.5.100
nameserver 192.168.5.120
nameserver 1.1.1.1
search howtoforge.local작업이 완료되면 파일을 저장하고 종료합니다.
이제 클라이언트 머신에서 DNS 서버를 확인할 준비가 되었습니다.
아래의 dig 명령을 실행하여 도메인 이름
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.