설명
CentOS 7에서 CHROOT가 적용된 DNS 서비스를 이중화로 구성합니다. DNS에 질의는 제한된 네트워크에서만 가능하도록 제한합니다.
BIND 버전 및 서버 구성
OS: CentOS 7
BIND Version: 9.11.4-26
마스터: 192.168.80.176
슬레이브1: 192.168.80.177
슬레이브2: 192.168.80.178
Hostname 설정
각 서버의 호스트네임을 설정한후 재접속합니다.
### Setting Hostname ###
### Master ###
[root@localhost ~]# hostnamectl set-hostname master
### Slave1 ###
[root@localhost ~]# hostnamectl set-hostname slave1
### Slave2 ###
[root@localhost ~]# hostnamectl set-hostname slave2
SELinux 비활성화
편의상 SELinux를 사용하지 않으므로 비활성화합니다.
### Inactive the SELinux ###
### Master ###
[root@master ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@master ~]# reboot
### Slave1 ###
[root@slave1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@slave1 ~]# reboot
### Slave2 ###
[root@slave2 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@slave2 ~]# reboot
Firewall 설정
파이어월에 DNS 서비스를 등록합니다.
### Register dns service in the firewall ###
### Master ###
[root@master ~]# firewall-cmd --permanent --add-service=dns
[root@master ~]# firewall-cmd --reload
### Slave1 ###
[root@slave1 ~]# firewall-cmd --permanent --add-service=dns
[root@slave1 ~]# firewall-cmd --reload
### Slave2 ###
[root@slave2 ~]# firewall-cmd --permanent --add-service=dns
[root@slave2 ~]# firewall-cmd --reload
파이어월 서비스 리스트를 확인하여 방금 추가한 DNS 서비스가 등록되었는지 확인할수 있습니다.
### Check the service list registered in the firewall ###
### Master/Slave1/Slave2 ###
[root@master ~]# firewall-cmd --list-services
cockpit dhcpv6-client dns nfs proftpd ssh
[root@master ~]# firewall-cmd --info-service=dns
dns
ports: 53/tcp 53/udp
protocols:
source-ports:
modules:
destination:
includes:
helpers:
BIND 패키지 설치
DNS 서비스에 필요한 패키지를 설치합니다.
### Install the BIND package ###
### Master/Slave1/Slave2 ###
[root@master ~]# yum -y install bind bind-chroot bind-utils
DNS 서비스의 자동시작을 활성화하고, DNS 서비스를 시작합니다.
### Activate and start the DNS Service ###
### Master/Slave1/Slave2 ###
[root@master ~]# systemctl enable named-chroot
[root@master ~]# systemctl start named-chroot
환경파일 설정
DNS 서비스를 구성하는 환경파일을 설정합니다. 환경파일에서 많은 옵션이 있지만, 이중화 구성에 맞춰서 필요한 부분만 추가 또는 변경하겠습니다. "listen-on port 53"와 "listen-on-v6 port 53"는 각각 Master/Slave1/Slave2의 IP로 설정합니다. 쿼리 질의는 "office-nets"로 제한하며, 그외 네트워크에서 도메인 해석 질의는 거부합니다. 이중화 구성에서 가장 중요한 옵션인 "allow-transfer"를 "none"으로 설정하고, 개별 존에서 "allow-transfer"를 허용하도록 설정하겠습니다. "allow-update"는 "none"이 기본값이지만, 존 정보(레코드)를 업데이트할수 있으므로 명시적으로 "none"으로 설정하며, "allow-transfer"와 같이 필요한 존에 대해서만 개별 설정합니다.
### /etc/named.conf ###
### Master ###
acl office-nets {
192.168.80.0/24;
};
options {
listen-on port 53 { 192.168.80.176; };
listen-on-v6 port 53 { fe80::4f4b:783b:ba20:31ae; };
...
allow-query { office-nets; };
allow-transfer { none; };
allow-update { none; };
...
};
logging {
...
};
zone "." IN {
...
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
### /etc/named.conf ###
### Slave1 ###
acl office-nets {
192.168.80.0/24;
};
options {
listen-on port 53 { 192.168.80.177; };
listen-on-v6 port 53 { fe80::e88e:f526:fd9e:3215; };
...
allow-query { office-nets; };
allow-transfer { none; };
allow-update { none; };
...
};
logging {
...
};
zone "." IN {
...
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
### /etc/named.conf ###
### Slave2 ###
acl office-nets {
192.168.80.0/24;
};
options {
listen-on port 53 { 192.168.80.178; };
listen-on-v6 port 53 { fe80::d834:f330:e901:82ef; };
...
allow-query { office-nets; };
allow-transfer { none; };
allow-update { none; };
...
};
logging {
...
};
zone "." IN {
...
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
Master DNS 서버에서 이중화할 ZONE 설정
Master DNS에서 서비스 및 전송할 존을 설정합니다. 테스트용도로 아래와 같이 포워드 존과 리버스 존 하나씩 설정하겠습니다. 이 두개의 존 정보는 존 트랜트퍼 기능을 사용하여 Slave1과 Slave2로 전송하기 위해서, Slave1과 Slave2의 IP를 설정합니다. 이 두개의 존은 다이나믹 존으로 사용하지 않으므로 "allow-update"를 "none"으로 설정합니다.
### /etc/named.rfc1912.zones ###
### Master ###
### Customer's Forward Zone ###
zone "testlab.localhost" IN {
type master;
file "master/testlab.localhost.zone";
allow-transfer { 192.168.80.177; 192.168.80.178; };
allow-update { none; };
};
### Customer's Reverse Zone ###
zone "80.168.192.in-addr.arpa" IN {
type master;
file "master/80.168.192.in-addr.arpa.zone";
allow-transfer { 192.168.80.177; 192.168.80.178; };
allow-update { none; };
};
포워드 존과 리버스 존 파일을 저장할 master 폴더를 생성합니다.
### Make the master folder and change the ownership ###
[root@master ~]# mkdir /var/named/master
[root@master ~]# chown root.named /var/named/master
생성한 master 폴더에 포워드 존 파일을 생성하며, DNS 서버에 맞춰서 네임서버도 생성합니다.
### /var/named/master/testlab.localhost.zone ###
### Master ###
$TTL 1D
@ IN SOA testlab.localhost. root.testlab.localhost. (
2021120701 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
IN NS ns1.testlab.localhost.
IN NS ns2.testlab.localhost.
IN NS ns3.testlab.localhost.
ns1 IN A 192.168.80.176
ns2 IN A 192.168.80.177
ns3 IN A 192.168.80.178
www IN A 192.168.80.191
ftp IN A 192.168.80.191
정방향 영역에 맞춰서 역방향 영역의 존 파일도 함께 생성합니다. 정방향 영역의 레코드에 대응하는 역방향 영역의 레코드인 PTR은 사용하지 않는다면 만들지 않아도 무방합니다.
### /var/named/master/80.168.192.in-addr.arpa.zone ###
### Master ###
$TTL 1D
@ IN SOA testlab.localhost. root.testlab.localhost. (
2021120701 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
IN NS ns.testlab.localhost.
191 IN PTR www
191 IN PTR ftp
존 영역 파일의 생성이 끝났다면, master 폴더 및 폴더에 포함된 파일의 소유권을 모두 변경합니다. (폴더 및 존 파일의 소유가 root.root인 경우 도메인 네임 해석이 거부될수도 있으므로, 반드시 소유권을 root.named로 변경합니다)
### Change the permission of the added zone ###
### Master ###
[root@master ~]# chown root.named /var/named/master/*
Slave1/Slave2 DNS 서버에서 이중화할 ZONE 설정
실제 존 파일은 Master에서 전송되므로, Slave1/Slave2에서는 Master에서 선언한 존을 아래와 같이 Slave에 맞춰서 설정합니다. (존 파일은 allow-transfer 옵션에 의해서 자동 생성됩니다)
### /etc/named.rfc1912.zones ###
### Slave1/Slave2 ###
### Customer's Forward Zone ###
zone "testlab.localhost" IN {
type slave;
file "slaves/testlab.localhost.zone";
masters { 192.168.80.176; };
};
### Customer's Reverse Zone ###
zone "80.168.192.in-addr.arpa" IN {
type slave;
file "slaves/80.168.192.in-addr.arpa.zone";
masters { 192.168.80.176; };
};
Slave로 전송되는 존 파일은 성능향샹을 위해서 바이너리로 포멧되므로, 해당 존 파일은 열어보거나 편집할수 없습니다. 만약 일반 텍스트로 존 파일의 전송을 원한다면 아래와 같이 "masterfile-format text" 옵션을 추가한후 "named-chroot" 데몬을 재시작합니다.
### /etc/named.rfc1912.zones ###
### Slave1/Slave2 ###
### Customer's Forward Zone ###
zone "testlab.localhost" IN {
type slave;
file "slaves/testlab.localhost.zone";
masterfile-format text;
masters { 192.168.80.176; };
};
### Customer's Reverse Zone ###
zone "80.168.192.in-addr.arpa" IN {
type slave;
file "slaves/80.168.192.in-addr.arpa.zone";
masterfile-format text;
masters { 192.168.80.176; };
};
존 데이터 동기화
각 Slave에서 DNS를 시작하면 특별한 문제가 없는한 Master에서 바로 존 파일을 전송받으며, 아래와 같이 해당 존 파일이 생성됩니다.
### Zone data synchronization between master and slave1/slave2 ###
### Slave1 ###
[root@slave1 ~]# systemctl restart named-chroot
[root@slave1 ~]# ls -l /var/named/slaves
-rw-r--r-- 1 named named 314 Dec 7 17:36 80.168.192.in-addr.arpa.zone
-rw-r--r-- 1 named named 337 Dec 7 17:31 testlab.localhost.zone
### Slave2 ###
[root@slave2 ~]# systemctl restart named-chroot
[root@slave1 ~]# ls -l /var/named/slaves
-rw-r--r-- 1 named named 314 Dec 7 17:36 80.168.192.in-addr.arpa.zone
-rw-r--r-- 1 named named 337 Dec 7 17:31 testlab.localhost.zone