[CentOS] 08. DNS 서버 구성
카테고리: CENTOS
🔔 환경설정 파일 (Bind)
■ 환경설정 파일
| 패키지명 | 설명 |
|---|---|
| bind | BIND 데몬의 기본 패키지 |
| bind-utils | BIND 데몬 운영에 관련된 보조 유틸리티 |
| bind-libs | BIND 데몬에서 사용되는 라이브러리 |
| bind-chroot | BIND 데몬의 보안 향상을 위해 사용되는 패키지 |
| caching-nameserver | BIND 데몬의 환경 설정을 위한 패키지 (현재 BIND에 통합되어 설치됨) |
■ 환경설정 파일
| 파일명 | 설명 |
|---|---|
| /etc/named.conf | BIND 데몬의 동작에 관련된 설정 파일 |
| /etc/named.rfc1912.zones | 네임 서버가 해석을 지원할 수 있는 zone을 등록하는 파일 |
| /var/named/정방향 zone파일 | 특정 zone에 대한 정방향 해석을 위한 리소스 레코드가 설정된 Zone Database 파일 |
| /var/named/역방향 zone 파일 | 특정 zone에 대한 역방향 해석을 위한 리소스 레코드가 설정된 Zone Database 파일 -> 설정된 리소스 레코드를 기반으로 in-addr.arpa 도메인을 구성 함 |
| /var/named/named.ca | Root Hint 동작이 수행된 때 참조하는 Root DNS가 등록된 파일 |
🔔 BIND : 내부 네트워크 구성
■ bind 설치
$ dnf -y install bind*
■ 내부 네트워크에 대한 설정
- 다음은 로컬 네트워크가 [192.168.219.0/24]이고 도메인 이름이 [test.srv]인 경우의 예
$ vi /etc/named.conf
...
...
# 로컬 네트워크에 대한 ACL 항목 설정
acl internal-network {
192.168.219.0/24;
};
options {
# change ( listen all )
listen-on port 53 { any; };
# 필요한 경우 변경(IPv6를 수신하지 않을 경우 [none]으로 설정)
listen-on-v6 { any; };
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; internal-network; };
# zone 파일을 클라이언트로 전송할 수 있는 네트워크 범위
# secondary DNS 서버가 있는 경우 추가
allow-transfer { localhost; };
.....
.....
recursion yes;
dnssec-enable yes;
dnssec-validation yes;
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
/* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
include "/etc/crypto-policies/back-ends/bind.config";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
$ vim /etc/named.rfc1912.zones
# 네트워크 및 도메인 이름에 대한 Zone 추가
zone "test.srv" IN {
type master;
file "test.srv.lan";
allow-update { none; };
};
zone "219.168.192.in-addr.arpa" IN {
type master;
file "219.168.192.db";
allow-update { none; };
};
■ Zone 파일 구성
- 서버가 도메인 이름에서 IP 주소를 확인하는 Zone 파일 작성
$ vi /var/named/test.srv.lan
$TTL 86400
@ IN SOA dlp.test.srv. root.test.srv. (
# 일련 번호에 대해서는 아무 숫자 값도 괜찮지만
# 권장 사항은 [YYYYMMDDnn](업데이트 날짜 + 번호)
2022081001 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)
# 네임 서버 정의
IN NS dlp.test.srv.
# 네임 서버의 IP 주소 정의
IN A 192.168.219.101
# 메일 교환기 서버 정의
IN MX 10 dlp.test.srv.
# 호스트 이름의 각 IP 주소 정의
dlp IN A 192.168.219.101
www IN A 192.168.219.102
- 서버가 IP 주소에서 도메인 이름을 확인하는 Zone 파일을 작성
$ vi /var/named/219.168.192.db
$TTL 86400
@ IN SOA dlp.test.srv. root.test.srv. (
2022081001 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)
# 네임 서버 정의
IN NS dlp.test.srv.
# IP 주소의 각 호스트 이름 정의
101 IN PTR dlp.test.srv.
102 IN PTR www.test.srv.
■ Start and Enable BIND.
$ systemctl enable --now named
■ 방화벽이 실행 중인 경우 Samba 서비스를 허용
$ firewall-cmd --add-service=dns
success
$ firewall-cmd --runtime-to-permanent
success
■ 확인
# 필요한 경우 자신의 DNS를 참조하도록 DNS 설정을 변경
$ nmcli connection modify ens160 ipv4.dns 192.168.219.101
$ nmcli connection down ens160; nmcli connection up ens160
$ dig dlp.test.srv
; <<>> DiG 9.16.23-RH <<>> dlp.test.srv
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38942
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 7b049a9250cd969e01000000643e434874e1d34106deb514 (good)
;; QUESTION SECTION:
;dlp.test.srv. IN A
;; ANSWER SECTION:
dlp.test.srv. 86400 IN A 192.168.219.101
;; Query time: 0 msec
;; SERVER: 192.168.219.101#53(192.168.219.101)
;; WHEN: Tue Apr 18 16:14:16 KST 2023
;; MSG SIZE rcvd: 85
$ dig -x 192.168.219.101
; <<>> DiG 9.16.23-RH <<>> -x 192.168.219.101
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48419
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 1d8fff54d229d88401000000643e43596945866c743b16bd (good)
;; QUESTION SECTION:
;101.219.168.192.in-addr.arpa. IN PTR
;; ANSWER SECTION:
101.219.168.192.in-addr.arpa. 86400 IN PTR dlp.test.srv.
;; Query time: 0 msec
;; SERVER: 192.168.219.101#53(192.168.219.101)
;; WHEN: Tue Apr 18 16:14:33 KST 2023
;; MSG SIZE rcvd: 111
🔔 BIND : 외부 네트워크 구성
- 이후 설정은 위 예제와 같다.
$ vi /etc/named.conf
.....
.....
options {
# change ( listen all )
listen-on port 53 { any; };
# 필요한 경우 변경(IPv6를 수신하지 않을 경우 [none]으로 설정)
listen-on-v6 { any; };
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; };
# Zone 파일을 클라이언트로 전송할 수 있는 네트워크 범위
# 보조 DNS 서버가 있는 경우 추가
allow-transfer { localhost; };
.....
.....
# 변경 : 재귀 쿼리를 허용하지 않음
# 이 서버에만 해당 항목이 있는 영역에 대한 답변
recursion no;
dnssec-enable yes;
dnssec-validation yes;
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
/* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
include "/etc/crypto-policies/back-ends/bind.config";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
🔔 DNS - View Statement
특정 사용자 또는 그룹에게만 특정한 DNS 정보를 제공하는 기능으로, 예를 들어, 회사 내부에서만 접근 가능한 도메인 이름이 있는 경우, 회사 내부 IP 주소 범위를 기반으로 View Statement를 설정하여 내부 사용자에게만 해당 도메인 이름을 제공할 수 있다.
$ vi /etc/named.conf
.....
.....
# 추가 - 로컬 네트워크에 대한 ACL 항목 설정
acl internal-network {
10.0.0.0/24;
};
options {
# change ( listen all )
listen-on port 53 { any; };
# 필요한 경우 변경(IPv6를 수신하지 않을 경우 [none]으로 설정
listen-on-v6 { any; };
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";
# 위의 [acl] 섹션에 설정된 로컬 네트워크 추가
# 호스트에서 쿼리를 수신할 수 있는 네트워크 범위
allow-query { localhost; internal-network; };
# Zone 파일을 클라이언트에 전송할 수 있는 네트워크 범위
# 존재하는 경우 보조 DNS 서버 추가
allow-transfer { localhost; };
.....
.....
recursion yes;
dnssec-enable yes;
dnssec-validation yes;
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
/* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
include "/etc/crypto-policies/back-ends/bind.config";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
# 내부 네트워크 영역 설정
view "internal" {
match-clients {
localhost;
internal-network;
};
zone "." IN {
type hint;
file "named.ca";
};
zone "test.srv" IN {
type master;
file "test.srv.lan";
allow-update { none; };
};
zone "219.168.192.in-addr.arpa" IN {
type master;
file "219.168.192.db";
allow-update { none; };
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
};
# 외부 네트워크 영역 설정
view "external" {
# 내부 섹션의 [match-client]에 정의된 대상을 제외하고 모두 일치
match-clients { any; };
allow-query { any; };
# 재귀 쿼리를 허용하지 않음
recursion no;
zone "srv.world" IN {
type master;
file "srv.world.wan";
allow-update { none; };
};
zone "80.0.16.172.in-addr.arpa" IN {
type master;
file "80.0.16.172.db";
allow-update { none; };
};
};
댓글 남기기