SW 개발 보안 구축/DNS 서버/도메인 질의/네임서버에 도메인 등록하기/도메인추가하기/스크립트 (교육 43일, 44일차)

SW·2023년 1월 19일
0








































##############
📌 DNS 서버 📌
##############

Powered by DNS
https://wiki.kldp.org/KoreanDoc/html/PoweredByDNS-KLDP/index.html

전길남 박사 검색
https://ko.wikipedia.org/wiki/전길남
알파넷의 산실인 UCLA에서 있었던 것이 인연이 되어 한국의 인터넷 도입에 핵심적인 역할을 하였다.
1982년 5월 15일 전길남 박사가 주도하여 서울대학교와 한국전자기술연구소(현 ETRI) 사이에 인터넷 시스템을 구축했다.
이로써 한국은 미국에 이어 세계에서 두 번째로 인터넷 연결에 성공한 나라가 되었다.

도메인 등록 업체
-가비아 (https://www.gabia.com)

-아이네임즈 (https://www.inames.co.kr)

DNS란 무엇인가 ?
DNS는 Domain Name System으로 Domain주소를 IP주소로 변환해주는 시스템을 말한다.
예를 들어서 도메인이름(www.linuxmaster.net)을 서버가 인식하는
초기 인터넷에서는 호스트 이름별로 IP주소를 HOSTS.txt 파일로 관리하던 것을 보다 체계적으로 관리하기 위해 DNS가 개발되었다.

초기 인터넷
-다른 시스템과 통신할 때는 IP주소(숫자 형태)를 사용.
-여러 많은 다른 시스템이 시스템의 IP주소를 기억하기 쉽지 않음.
-사용자가 쉽게 기억할 수 있는 문자 형태의 호스트 이름을 사용.

도메인 네임 시스템의 세가지 구성요소
-도메인 네임 공간(Domain Name Space)과 리소스 레코드(Resource Record)
-네임서버(Name Server) , DNS Server
-리졸버(Resolver)

실습> hosts 파일 확인하기

리눅스 hosts 파일
/etc/hosts

윈도우 hosts 파일
%systemroot%\system32\drivers\etc\hosts

실습> DNS cache 확인하기

C:\Users\user>ipconfig/flushdns
C:\Users\user>ping www.naver.com
C:\Users\user>ping dns.google.com
C:\Users\user>ipconfig/displaydns

Windows IP 구성

실습> DNS 서버를 위한 리눅스 서버 2대 설치하기

네임서버1
VMname: ns1
VMware Network: VMnet8
Host name: ns1.server.com
IP Address: 200.200.200.3/24
Gateway: 200.200.200.2
DNS: 168.126.63.1, 168.126.63.2

네임서버2
VMname: ns2
VMware Network: VMnet8
Host name: ns2.server.com
IP Address: 200.200.200.4/24
Gateway: 200.200.200.2
DNS: 168.126.63.1, 168.126.63.2

실습> 호스트명 등록하기

ns1(200.200.200.3), ns2(200.200.200.4) 동시에 생성해서 실행한다.

1. ns1에서 설정하기
[root@ns1 ~]# hostname
ns1.server.com
[root@ns1 ~]# cd
[root@ns1 ~]# install /dev/null bin/hosts.sh
[root@ns1 ~]# vi bin/hosts.sh
-- bin/hosts.sh --
#!/bin/sh

#파일명: hosts.sh
#프로그램 설명: 호스트명 등록 스크립트
#작성자: 리눅스마스터넷

hostsFile="/etc/hosts"
echo 200.200.200.3 ns1.server.com ns1 >> $hostsFile
echo 200.200.200.4 ns2.server.com ns2 >> $hostsFile
cat /etc/hosts
-- bin/hosts.sh --

스크립트를 실행하고 확인한다.
[root@ns1 ~]# hosts.sh

2. ns2에서 설정하기
[root@ns2 ~]# hostname
ns2.server.com
[root@ns2 ~]# cd
[root@ns2 ~]# install /dev/null bin/hosts.sh
[root@ns2 ~]# vi bin/hosts.sh
-- bin/hosts.sh --
#!/bin/sh

#파일명: hosts.sh
#프로그램 설명: 호스트명 등록 스크립트
#작성자: 리눅스마스터넷

hostsFile="/etc/hosts"
echo 200.200.200.3 ns1.server.com ns1 >> $hostsFile
echo 200.200.200.4 ns2.server.com ns2 >> $hostsFile
cat /etc/hosts
-- bin/hosts.sh --

스크립트를 실행하고 확인한다.
[root@ns2 ~]# hosts.sh

실습> 네임서버 방화벽 설정하기

ns1(200.200.200.3), ns2(200.200.200.4) 동시에 생성해서 실행한다.

1. 방화벽 설정
firewalld를 중지하고 비활성화하고 iptables 방화벽을 설치하고 활성화 한다.
firewalld Off , iptables On

ns1(200.200.200.3)에서 방화벽 스크립트를 생성한다.
[root@ns1 ~]# mkdir bin; cd bin
[root@ns1 bin]# install /dev/null firewall.sh
[root@ns1 bin]# vi firewall.sh
-- firewall.sh --
#!/bin/sh

#파일명: firewall.sh
#프로그램 설명: iptables 기반 방화벽 설정
#작성자: 리눅스마스터넷

systemctl stop firewalld
systemctl disable firewalld
yum -y install iptables-services
systemctl enable iptables
systemctl start iptables
iptables -F

adminIP="200.200.200.1"

#룰 설정

iptables -P INPUT DROP
iptables -A INPUT -m state --state INVALID -j LOG --log-prefix "DROP INVALID " --log-ip-options --log-tcp-options \
-m comment --comment "깨진 패킷 로그 기록"
iptables -A INPUT -m state --state INVALID -j DROP -m comment --comment "깨진 패킷 차단"
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -m comment --comment "이미 연결된 패킷 허용"
iptables -A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT -m comment --comment "WEB: http"
iptables -A INPUT -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT -m comment --comment "WEB: https"
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT -m comment --comment "SSH" -s $adminIP
iptables -A INPUT -p tcp -m tcp --dport 53 -m state --state NEW -j ACCEPT -m comment --comment "DNS Zone Transfer"
iptables -A INPUT -p udp -m udp --dport 53 -m state --state NEW -j ACCEPT -m comment --comment "DNS Query"
iptables -A INPUT -i lo -j ACCEPT

#방화벽 룰 저장

#저장파일:/etc/sysconfig/iptables
service iptables save
-- firewall.sh --

ns1(200.200.200.3)에서 방화벽 스크립트를 실행하고 확인한다.
[root@ns1 bin]# firewall.sh
[root@ns1 bin]# iptables -nL
[root@ns1 bin]# cat /etc/sysconfig/iptables
[root@ns1 bin]# cd

ns2(200.200.200.4)에서 방화벽 스크립트를 생성한다.
[root@ns2 ~]# mkdir bin; cd bin
[root@ns2 bin]# install /dev/null firewall.sh
[root@ns2 bin]# vi firewall.sh
-- firewall.sh --
#!/bin/sh
#파일명: firewall.sh
#프로그램 설명: iptables 기반 방화벽 설정
#작성자: 리눅스마스터넷

systemctl stop firewalld
systemctl disable firewalld
yum -y install iptables-services
systemctl enable iptables
systemctl start iptables
iptables -F

adminIP="200.200.200.1"

#룰 설정

iptables -P INPUT DROP
iptables -A INPUT -m state --state INVALID -j LOG --log-prefix "DROP INVALID " --log-ip-options --log-tcp-options \
-m comment --comment "깨진 패킷 로그 기록"
iptables -A INPUT -m state --state INVALID -j DROP -m comment --comment "깨진 패킷 차단"
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -m comment --comment "이미 연결된 패킷 허용"
iptables -A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT -m comment --comment "WEB: http"
iptables -A INPUT -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT -m comment --comment "WEB: https"
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT -m comment --comment "SSH" -s $adminIP
iptables -A INPUT -p tcp -m tcp --dport 53 -m state --state NEW -j ACCEPT -m comment --comment "DNS Zone Transfer"
iptables -A INPUT -p udp -m udp --dport 53 -m state --state NEW -j ACCEPT -m comment --comment "DNS Query"
iptables -A INPUT -i lo -j ACCEPT

#방화벽 룰 저장
#저장파일: /etc/sysconfig/iptables
service iptables save
-- firewall.sh --

ns2(200.200.200.4)에서 방화벽 스크립트를 실행하고 확인한다.
[root@ns2 bin]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@ns2 bin]# firewall.sh
[root@ns2 bin]# iptables -nL
[root@ns2 bin]# cat /etc/sysconfig/iptables
[root@ns2 bin]# cd

실습> 입력/출력 리다이렉션 연습하기

<< : 입력 리다이렉션
>  : 출력 리다이렉션 (덮어쓰기)
>> : 출력 리다이렉션 (추가)

[root@ns1 ~]# echo 1111 > 1.txt
[root@ns1 ~]# echo 2222 >> 1.txt
[root@ns1 ~]# cat 1.txt
1111
2222
[root@ns1 ~]# cat << END

> 333
> 444
> 555
> END

333
444
555
[root@ns1 ~]# cat << END >> 1.txt

> 333
> 44
> 555
> END

[root@ns1 ~]# cat 1.txt
1111
2222
333
44
555

실습> vim 설치하기

[root@ns1 ~]# install /dev/null bin/vim.sh
[root@ns1 ~]# vi bin/vim.sh
-- bin/vim.sh --
#!/bin/sh
#파일명: vim.sh
#프로그램 설명: vim 설치/등록 스크립트
#작성자: 리눅스마스터넷

packageName="vim"
fileName="/etc/vimrc"

echo "vim 설치중..."
yum -y install $packageName > /dev/null 2>&1
echo "vim 설치 완료"

echo "vim 설정중..."
cat << END >> $fileName
set nu
set ai
set ci
set bg=dark
set sw=4
set ts=4
set cursorline
set expandtab
END
echo "vim 설정 완료"
echo "alias vi='vim'" >> ~/.bashrc
-- bin/vim.sh --

[root@ns1 ~]# vim.sh
vim 설치중...
vim 설치 완료
vim 설정중...
vim 설정 완료
[root@ns1 ~]# alias vi='vim'

[root@ns2 ~]# install /dev/null bin/vim.sh
[root@ns2 ~]# vi bin/vim.sh
-- bin/vim.sh --
#!/bin/sh
#파일명: vim.sh
#프로그램 설명: vim 설치/등록 스크립트
#작성자: 리눅스마스터넷

packageName="vim"
fileName="/etc/vimrc"

echo "vim 설치중..."
yum -y install $packageName > /dev/null 2>&1
echo "vim 설치 완료"

echo "vim 설정중..."
cat << END >> $fileName
set nu
set ai
set ci
set bg=dark
set sw=4
set ts=4
set cursorline
set expandtab
END
echo "vim 설정 완료"
echo "alias vi='vim'" >> ~/.bashrc
-- bin/vim.sh --

[root@ns2 ~]# vim.sh
vim 설치중...
vim 설치 완료
vim 설정중...
vim 설정 완료
[root@ns2 ~]# alias vi='vim'

실습> 도메인 질의

[root@ns1 ~]# yum -y install bind-utils
[root@ns1 ~]# nslookup
[root@ns1 ~]# nslookup

> server 45.120.69.38  

Default server: 45.120.69.38
Address: 45.120.69.38#53

> www.linuxmaster.net

Server: 45.120.69.38
Address: 45.120.69.38#53

Name: www.linuxmaster.net
Address: 45.120.69.175

> web.linuxmaster.net

Server: 45.120.69.38
Address: 45.120.69.38#53

Name: web.linuxmaster.net
Address: 200.200.200.103

> abc.linuxmaster.net

Server: 45.120.69.38
Address: 45.120.69.38#53

** server can't find abc.linuxmaster.net: NXDOMAIN

> programming.linuxmaster.net

Server: 45.120.69.38
Address: 45.120.69.38#53

Name: programming.linuxmaster.net
Address: 200.200.200.101

현재 네임서버가 외부 도메인을 요청하면 알려주게 설정했으므로
아래처럼 결과가 Non-authoritative answer 의 결과가 나온다.

> naver.com

Server: 45.120.69.38
Address: 45.120.69.38#53

Non-authoritative answer:
Name: naver.com
Address: 223.130.200.107
Name: naver.com
Address: 223.130.200.104
Name: naver.com
Address: 223.130.195.95
Name: naver.com
Address: 223.130.195.200

현재 네임서버가 외부 도메인을 요청하면 거부하게 설정했으므로
아래처럼 결과가 REFUSED 의 결과가 나온다.
[root@ns1 ~]# nslookup

> server 45.120.69.38

Default server: 45.120.69.38
Address: 45.120.69.38#53

> naver.com

Server: 45.120.69.38
Address: 45.120.69.38#53

** server can't find naver.com.server.com: REFUSED

> daum.net

Server: 45.120.69.38
Address: 45.120.69.38#53

** server can't find daum.net.server.com: REFUSED

> www.linuxmaster.net

Server: 45.120.69.38
Address: 45.120.69.38#53

Name: www.linuxmaster.net
Address: 45.120.69.175

> exit

실습> DNS 서버 설치하기

사용 포트: 53
질의: 53/udp, 53/tcp(UDP의 양이 많을 때 TCP로 변경)
존 동기화: 53/tcp

bind :
네임서버 패키지
Berkeley Internet Name Domain (BIND) DNS (Domain Name System) server

네임서버 1, 2 동시에 설정을 진행한다.

1. 네임서버 설치
1차 네임서버(1차 DNS서버)에서 스크립트를 생성해서 설치한다.
[root@ns1 ~]# install /dev/null ~/bin/bindInstall.sh
[root@ns1 ~]# vi ~/bin/bindInstall.sh
#!/bin/sh
#파일명: bindInstall.sh
#프로그램 설명: 네임서버 설치 스크립트
#작성자: 리눅스마스터넷

#1. 패키지 설치
#netstat 명령어가 저장된 패키지를 설치한다.
yum -y install net-tools

#DNS 관련 패키지를 설치한다.
yum -y install bind bind-chroot bind-utils

#서버 재부팅 시 다시 네임서버를 시작하기 위해서 named를 활성화시킨다.
systemctl enable named

#2. 네임 서버 시작
#네임서버를 시작한다.
systemctl start named
systemctl status named
netstat -nltup | grep named

2. 네임서버 설치
2차 네임서버(2차 DNS서버)에서 스크립트를 생성해서 설치한다.
[root@ns2 ~]# install /dev/null ~/bin/bindInstall.sh
[root@ns2 ~]# vi ~/bin/bindInstall.sh
#!/bin/sh
#파일명: bindInstall.sh
#프로그램 설명: 네임서버 설치 스크립트
#작성자: 리눅스마스터넷

#1. 패키지 설치
#netstat 명령어가 저장된 패키지를 설치한다.
yum -y install net-tools

#DNS 관련 패키지를 설치한다.
yum -y install bind bind-chroot bind-utils

#서버 재부팅 시 다시 네임서버를 시작하기 위해서 named를 활성화시킨다.
systemctl enable named

#2. 네임 서버 시작
#네임서버를 시작한다.
systemctl start named
systemctl status named
netstat -nltup | grep named

3. 설정 파일 수정
네임서버 전체 설정 파일: /etc/named.conf
도메인 설정 파일: /etc/named.rfc1912.zones
https://datatracker.ietf.org/doc/html/rfc1912

listen-on port :
any; 로 설정하면 서버에 설정된 모든 IP주소가 53번 포트가 바인딩(열리게) 된다.
IP주소가 1개만 있으면 상관이 없지만 any; 로 설정하면 모든 IP주소에 53번 포트가 열리게 되므로
특정 IP주소만 열릴 수 있도록 설정하는 것을 추천한다.

listen-on-v6 port 53 : IPv6 에 해당하므로 사용하지 않으므로 주석처리 한다.

allow-query :
도메인 질의를 허용하는 클라이언트를 적는다. any라고 하면 아무곳에서나 접속해서 도메인에 대한 질의를 허용하는 것이다.
그래서 일반적으로 allow-query는 any로 둔다.

recursion:
외부에서 도메인 질의 요청이 오면 자신이 관리는 도메인만 응답하도록 설정하는 옵션
yes: 자신이 설정한 도메인 이외에 . (root hint)에서 찾아서 알려준다. (Non-authoritative answer)
no : 자신이 설정한 도메인만 응답하고 다른 도메인은 알려주지 않는다. (REFUSED)

dnssec-enable, dnssec-validation:
DNS 보안에 관련된 내용이지만 연습서버이므로 모두 no 로 설정한다.

[root@ns1 ~]# vi /etc/named.conf
listen-on port 53 { any; };
// listen-on-v6 port 53 { ::1; };
allow-query { any; };
recursion yes;
dnssec-enable no;
dnssec-validation no;

[root@ns2 ~]# vi /etc/named.conf
listen-on port 53 { any; };
// listen-on-v6 port 53 { ::1; };
allow-query { any; };
recursion yes;
dnssec-enable no;
dnssec-validation no;

설정 파일을 수정 후 네임서버를 재시작하고 포트번호를 확인한다.
[root@ns1 ~]# systemctl reload named
[root@ns1 ~]# netstat -nltup

[root@ns2 ~]# systemctl reload named
[root@ns2 ~]# netstat -nltup

4. 도메인 질의

recursion yes로 설정된 경우
C:\Users\user>nslookup
기본 서버: ns.lgdacom.net
Address: 164.124.101.2

> server 200.200.200.3

기본 서버: [200.200.200.3]
Address: 200.200.200.3

> naver.com

서버: [200.200.200.3]
Address: 200.200.200.3

권한 없는 응답: <-- ns1이 naver.com 의 주소를 찾아서 알려준 것이다. (윈도우에서는 한글로 나온다.)
이름: naver.com
Addresses: 223.130.195.200
223.130.195.95
223.130.200.104
223.130.200.107

[root@ns2 ~]# nslookup

> server 200.200.200.3

Default server: 200.200.200.3
Address: 200.200.200.3#53

> naver.com

Server: 200.200.200.3
Address: 200.200.200.3#53

Non-authoritative answer: <-- ns1이 naver.com 의 주소를 찾아서 알려준 것이다. (리눅스에서는 영문으로 나온다.)
Name: naver.com
Address: 223.130.195.200
Name: naver.com
Address: 223.130.200.107
Name: naver.com
Address: 223.130.195.95
Name: naver.com
Address: 223.130.200.104

> server 200.200.200.4

기본 서버: [200.200.200.4]
Address: 200.200.200.4

> daum.net

서버: [200.200.200.4]
Address: 200.200.200.4

권한 없는 응답:
이름: daum.net
Addresses: 121.53.105.210
121.53.224.15

[root@ns1 ~]# nslookup

> server 200.200.200.4

Default server: 200.200.200.4
Address: 200.200.200.4#53

> daum.net

Server: 200.200.200.4
Address: 200.200.200.4#53

Non-authoritative answer:
Name: daum.net
Address: 121.53.224.15
Name: daum.net
Address: 121.53.105.210

> exit

recursion no로 설정된 경우

[root@ns1 ~]# vi /etc/named.conf
recursion no;
[root@ns1 ~]# systemctl reload named

> server 200.200.200.3

기본 서버: [200.200.200.3]
Address: 200.200.200.3

> naver.com

서버: [200.200.200.3]
Address: 200.200.200.3

*** [200.200.200.3]이(가) naver.com을(를) 찾을 수 없습니다. Query refused

[root@ns2 ~]# nslookup

> server 200.200.200.3      

Default server: 200.200.200.3
Address: 200.200.200.3#53

> naver.com

Server: 200.200.200.3
Address: 200.200.200.3#53

** server can't find naver.com.server.com: REFUSED

실습> vim 설정

확장자 zones가 vim에 등록을 해야 칼라가 나온다.
[root@ns1 ~]# vi /usr/share/vim/vim74/filetype.vim
287 " BIND configuration
288 au BufNewFile,BufRead named.conf,rndc.conf,named.rfc1912.zones setf named

실습> 네임서버에 도메인 등록하기


도메인을 설정하는 순서
1. /etc/named.rfc1912.zones 파일에 도메인을 등록한다.
2. /var/named/<정방향존파일>을 생성한다.
3. named-checkconf, named-checkzone 명령어로 설정파일과 존파일을 문법을 검사해서 문제가 없는지 확인한다.
4. systemctl restart named, systemctl reload named 명령어로 네임서버를 재시작하거나 리로드한다.
5. nslookup, dig, host 명령어로 도메인을 확인한다.

/etc/named.rfc1912.zones 파일에 도메인을 등록한다.
설정 형식:

zone "도메인명" IN {
type 네임서버종류; <-- master, slave, hint
file "포워드존파일";
allow-update { none; };
};

존파일: 도메인에 대한 정보를 가지고 있는 파일
포워드 존파일 (정방향 존파일): 도메인을 요청했을 때 IP주소 정보를 저장하고 있는 파일
리버스 존파일 (역방향 존파일): IP주소 정보를 요청했을 때 도메인 정보를 저장하고 있는 파일

등록할 도메인
server.com

리소스 레코드(RR)
리소스 레코드는 도메인을 가리키고 지원하는 구성요소이고 DNS에서 이런 정보들을 제공한다.
쉽게 얘기해서 리소스 레코드(Resource Record)는 도메인 네임에서 설정할 수 있는 데이터 타입

RR 종류
SOA : 도메인의 시작을 의미한다.
NS : 네임서버를 의미한다.
A : IPv4 주소를 의미한다. (정방향)
AAAA : IPv6 주소를 의미한다. (정방향)
PTR : 도메인 주소를 의미한다. (역방향)
MX : 메일서버를 의미한다.
TXT : 요즘은 스팸 메일을 확인할 때 사용한다.
CNAME : 별칭을 의미한다.

RR예)
된장찌게
재료(RR)
D: 된장을 의미한다.
H: 호박의 의미한다.
P: 감자를 의미한다.
:
:

SOA: https://wiki.kldp.org/KoreanDoc/html/PoweredByDNS-KLDP/config-nameserver.html#RR-SOA

SOA 레코드 (Start Of Authority) : server.com에 대해 네임서버가 인증(authoritative)된 자료를 갖고
있음을 의미한다. server.com 도메인의 자료가 최적의 상태로 유지, 관리될 수 있도록 한다.

형식:
도메인 IN SOA 1차네임서버 관리자이메일 (
serial
refresh
retry
expire
minimum)

도메인:
관리자가 구입해서 도메인명을 넣는다. 도메인명 끝에 . 이 반드시 들어간다.
도메인은 @로 대체할 수 있다.
IN: INTERNET 클래스명을 무조건 적는다.
SOA: server.com 에 대해 네임서버가 인증(authoritative)된 자료를 갖고 있음을 의미한다.
1차네임서버:
도메인명에 대한 1차 네임서버를 설정한다.
1차 네임서버는 관리자가 설정한다.
도메인명을 생략하면 도메인명. 이 자동으로 붙는다. (ns1 -> ns1.server.com.)
예전에는 1차 네임서버를 ns.server.com. 으로 많이 사용했지만 요즘은 1차 네임서버를 ns1로 많이 사용한다.

관리자이메일:
관리자가 설정한다.
이메일의 @는 사용하면 안된다. @는 도메인명이므로 사용할 수 없다.
root@server.com -> root.server.com.server.com. <== 잘못 설정된 경우의 예
root.server.com. == root 와 동일

( : 소괄호로 열고 시작한다.
serial: 존파일의 버전
2차 네임서버가 있을 때 필요 (YYYYMMDDNN)
2차 네임서버와 비교할 버전을 적는다. 형식은 YYYYMMDDNN 4294년까지 가능하다.
참고: 2023012001

refresh: 업데이트 시간
2차 네임서버가 있을 때 필요
2차 네임서버가 1차 네임서버의 변경을 확인하는 시간 (기본단위 초)
참고: 네이버 21600 (6시간 6H)

retry: 접속 실패시 재접속 시간
2차 네임서버가 있을 때 필요
2차 네임서버가 접속에 실패했을 때 다시 접속하는 시간
retry < refresh
참고: 네이버 1800 (30분 30M)

expire: 유통기간
2차 네임서버가 있을 때 필요
2차 네임서버가 접속에 계속 실패했을 때 폐기처분하는 시간
참고: 네이버 1209600 (14일 2W)

minimum : 캐쉬 시간
캐쉬 시간으로 상대방이 도메인을 요청해서 받아갔다면 메모리에 가지고 있을 TTL(Time To Live 타임투리브)값을 의미한다.
) : 끝날 때는 소괄호로 닫는다.

1. 도메인 등록
/etc/named.rfc1912.zones 파일에 도메인을 등록한다.
server.com 도메인에 대한 정보를 /etc/named.rfc1912.zones 맨 아래에 추가한다.
[root@ns1 ~]# vi /etc/named.rfc1912.zones
:
:(생략)
// server.com 지역(구역)을 설정한다.
// directory "/var/named";
zone "server.com" IN { // 지역의 시작
type master; // 원본이므로 master
file "server.com.zone"; // /var/named/server.com.zone
allow-update { none; }; // DDNS 사용 안함.
}; // 지역의 끝

2. 포워드 존파일 생성
/var/named/<정방향존파일>을 생성 후 설정한다.
포워드 존파일의 형식: directory 지시어의 설정값 + file 지시어의 설정값
/etc/named.conf: directory "/var/named";
/etc/named.rfc1912.zones: file "server.com.zone";
server.com 의 포워드 존파일: /var/named/server.com.zone

포워드 존파일을 생성하는 형식: 기본 제공되는 포워드 존 파일을 그대로 권한을 유지한 상태로(-a) 복사한 후 편집한다.
[root@ns1 ~]# cd /var/named
[root@ns1 named]# cp -a named.localhost server.com.zone

[root@ns1 named]# vi server.com.zone
$TTL 300
@ IN SOA ns1 root (
2023012001 ; serial
6H ; refresh
30M ; retry
2W ; expire
3H ) ; minimum

        IN  NS ns1
        IN  A  200.200.200.3

ns1 IN A 200.200.200.3
www IN A 200.200.200.3



3. 네임서버 시작
named-checkconf, named-checkzone 명령어로 설정파일과 존파일을 문법을 검사해서 문제가 없는지 확인한다.

설정파일에 문제가 있는지 확인하고 이상이 없을 경우 재시작 한다.
named-checkconf: 설정파일을 체크하는 명령어
-형식: usage: named-checkconf [-hjvz]-p [-x]] [-t directory][named.conf]
-설정 파일에 문제가 없으면 아무것도 출력되지 않고 문제가 있으면 에러를 출력한다.
-named-checkconf 명령어에 설정파일의 인수가 없으면 /etc/named.conf 파일을 체크한다.
named-checkzone: 존 파일을 체크하는 명령어
-설정 파일에 문제가 없으면 serial(버전)과 OK가 출력되고 문제가 있으면 에러를 출력한다.

/etc/named.conf 파일에 문제가 있으면 아래처럼 에러가 출력된다.
/etc/named.conf:15: missing ';' before 'directory'
/etc/named.rfc1912.zone 파일에 문제가 있으면 아래처럼 에러가 출력된다.
/etc/named.conf:60: missing ';' before 'include'
[root@ns1 named]# named-checkconf

각각 설정파일을 확인하고 싶다면 아래처럼 설정 파일명을 인수로 적어준다.
[root@ns1 named]# named-checkconf /etc/named.conf
[root@ns1 named]# named-checkconf /etc/named.rfc1912.zones

[root@ns1 named]# named-checkzone server.com server.com.zone
zone server.com/IN: loaded serial 2023012001
OK

4. 네임서버 재시작
systemctl restart named, systemctl reload named 명령어로 네임서버를 재시작하거나 리로드한다.

여기서는 설정파일에 문제가 없기 때문에 네임서버를 재시작한다.
[root@ns1 named]# systemctl restart named

5. 도메인 질의
nslookup, dig, host 명령어로 도메인을 확인한다.

/etc/resolv.conf: nameserver 정보를 저장하는 파일
/etc/resolv.conf에 설정된 168.126.63.1 서버에 질의를 하므로 실제 server.com의 IP주소가 나온다.

[root@ns1 named]# cat /etc/resolv.conf
#Generated by NetworkManager
search server.com
nameserver 168.126.63.1
nameserver 168.126.63.2

[root@ns1 named]# nslookup www.server.com
Server: 168.126.63.1
Address: 168.126.63.1#53

Non-authoritative answer:
www.server.com canonical name = server.com.
Name: server.com
Address: 52.8.126.80

아래처럼 자신의 네임서버(127.0.0.1)에 질의하면 포워드 존파일에서 설정한 200.200.200.3이 출력된다.
127.0.0.1이 되기 위해서는 아래 3가지가 조건에 만족해야 한다.
-방화벽에 127.0.0.1이 허용될 수 있도록 설정되어 있어야 한다.
-127.0.0.1의 포트를 오픈할 수 있도록 설정되어 있어야 한다. listen-on port 53 { any; };
-server.com이 설정되어 있어야 한다.
[root@ns1 named]# nslookup www.server.com 127.0.0.1
Server: 127.0.0.1
Address: 127.0.0.1#53

Name: www.server.com
Address: 200.200.200.3

[root@ns1 named]# nslookup www.server.com 200.200.200.3
Server: 200.200.200.3
Address: 200.200.200.3#53

Name: www.server.com
Address: 200.200.200.3

dig: nslookup 과 동일한 DNS 질의 명령어
[root@ns1 named]# dig www.server.com @200.200.200.3

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.10 <<>> www.server.com @200.200.200.3
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17650
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.server.com. IN A

;; ANSWER SECTION:
www.server.com. 300 IN A 200.200.200.3

;; AUTHORITY SECTION:
server.com. 300 IN NS ns1.server.com.

;; ADDITIONAL SECTION:
ns1.server.com. 300 IN A 200.200.200.3

;; Query time: 0 msec
;; SERVER: 200.200.200.3#53(200.200.200.3)
;; WHEN: 금 1월 20 02:40:28 KST 2023
;; MSG SIZE rcvd: 93

[root@ns1 named]# host server.com
server.com has address 52.8.126.80
[root@ns1 named]# host server.com 200.200.200.3
Using domain server:
Name: 200.200.200.3
Address: 200.200.200.3#53
Aliases:

server.com has address 200.200.200.3

>>> 참고 <<<

[root@ns1 named]# pwd
/var/named
[root@ns1 named]# netstat -nltp | grep named
tcp 0 0 200.200.200.3:53 0.0.0.0: LISTEN 12194/named
tcp 0 0 127.0.0.1:53 0.0.0.0:
LISTEN 12194/named
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 12194/named
[root@ns1 named]# ps aux | grep named
named 12194 0.0 10.4 232276 103824 ? Ssl 1월19 0:00 /usr/sbin/named -u named -c /etc/named.conf -4
root 12509 0.0 0.1 116972 1016 pts/0 S+ 00:26 0:00 grep --color=auto named
[root@ns1 named]# grep named /etc/passwd
named:x:25:25:Named:/var/named:/sbin/nologin
[root@ns1 named]# ls -ld
drwxrwx--T. 6 root named 164 1월 20 00:26 .
[root@ns1 named]# ll server.com.zone
-rw-r-----. 1 root named 152 6월 21 2007 server.com.zone
[root@ns1 named]# grep 25 /etc/group
named:x:25:

실습> root 도메인 .을 생략한 경우

SOA RR 쪽에 ns1.server.com 처럼 .(root 도메인)을 생략하고 저장한다.
[root@ns1 named]# vi server.com.zone
$TTL 300
@ IN SOA ns1.server.com root ( 2023012001 6H 30M 2W 3H )
IN NS ns1
IN A 200.200.200.3
ns1 IN A 200.200.200.3
www IN A 200.200.200.3

네임서버를 리로드하고 soa 를 확인하면 SOA RR 부분의 네임서버가 ns1.server.com.server.com. 나온다.
[root@ns1 named]# systemctl reload named
[root@ns1 named]# dig server.com soa @127.0.0.1

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.10 <<>> server.com soa @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6815
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;server.com. IN SOA

;; ANSWER SECTION:
server.com. 300 IN SOA ns1.server.com.server.com. root.server.com. 2023012001 21600 1800 1209600 10800

;; AUTHORITY SECTION:
server.com. 300 IN NS ns1.server.com.

;; ADDITIONAL SECTION:
ns1.server.com. 300 IN A 200.200.200.3

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: 금 1월 20 04:50:15 KST 2023
;; MSG SIZE rcvd: 129

설정을 확인한 후 다시 원래대로 복원한다.
[root@ns1 named]# vi server.com.zone
$TTL 300
@ IN SOA ns1 root ( 2023012001 6H 30M 2W 3H )
IN NS ns1
IN A 200.200.200.3
ns1 IN A 200.200.200.3
www IN A 200.200.200.3

dig에서 +short은 짧게 보여주는 옵션이다.
[root@ns1 named]# systemctl reload named
[root@ns1 named]# dig server.com soa @127.0.0.1 +short
ns1.server.com. root.server.com. 2023012001 21600 1800 1209600 10800

[root@ns1 named]# dig server.com soa @127.0.0.1

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.10 <<>> server.com soa @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33899
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;server.com. IN SOA

;; ANSWER SECTION:
server.com. 300 IN SOA ns1.server.com. root.server.com. 2023012001 21600 1800 1209600 10800

;; AUTHORITY SECTION:
server.com. 300 IN NS ns1.server.com.

;; ADDITIONAL SECTION:
ns1.server.com. 300 IN A 200.200.200.3

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: 금 1월 20 04:56:48 KST 2023
;; MSG SIZE rcvd: 114

실습> 아래 조건에 맞는 도메인 추가하기

-- 조건 --
1. 도메인명
1차 네임서버(200.200.200.3)에서 설정한다.

2. dig의 결과
[root@ns1 ~]# dig @200.200.200.3 kh.com soa +short
ns1.kh.com. root.kh.com. 2023012001 21600 1800 1209600 10800
[root@ns1 ~]# dig @200.200.200.3 kh.com ns +short
ns1.kh.com
[root@ns1 ~]# dig @200.200.200.3 ns1.kh.com +short
200.200.200.3
[root@ns1 ~]# dig @200.200.200.3 www.kh.com +short
200.200.200.3
[root@ns1 ~]# dig @200.200.200.3 kh.com +short
200.200.200.3
-- 조건 --

실습> 아래 조건에 맞는 도메인 추가하기

-- 조건 --
1. 도메인명
1차 네임서버(200.200.200.3)에서 설정한다.

도메인명 포워드 존 파일 IP주소 1차네임서버 관리자 emal주소 나머지
sbs.com sbs.com.zone 200.200.200.3 ns1 webmaster@sbs.com dig의 결과를 참고해서 작성

2. dig의 결과
[root@ns1 ~]# dig @200.200.200.3 sbs.com soa +short
ns1.sbs.com. webmaster.sbs.com. 2023012001 21600 1800 1209600 10800
[root@ns1 ~]# dig @200.200.200.3 sbs.com ns +short
ns1.sbs.com
[root@ns1 ~]# dig @200.200.200.3 ns1.sbs.com +short
200.200.200.3
[root@ns1 ~]# dig @200.200.200.3 www.sbs.com +short
200.200.200.3
[root@ns1 ~]# dig @200.200.200.3 sbs.com +short
200.200.200.3
-- 조건 --

실습 문제 풀이> 아래 조건에 맞는 도메인 추가하기

-- 조건 --
1. 도메인명
1차 네임서버(200.200.200.3)에서 설정한다.

도메인명 포워드 존 파일 IP주소 1차네임서버 관리자 emal주소 나머지
kh.com kh.com.zone 200.200.200.3 ns1 root@kh.com dig의 결과를 참고해서 작성

2. dig의 결과
[root@ns1 ~]# dig @200.200.200.3 kh.com soa +short
ns1.kh.com. root.kh.com. 2023012001 21600 1800 1209600 10800
[root@ns1 ~]# dig @200.200.200.3 kh.com ns +short
ns1.kh.com
[root@ns1 ~]# dig @200.200.200.3 ns1.kh.com +short
200.200.200.3
[root@ns1 ~]# dig @200.200.200.3 www.kh.com +short
200.200.200.3
[root@ns1 ~]# dig @200.200.200.3 kh.com +short
200.200.200.3
-- 조건 --

1. 도메인 등록
/etc/named.rfc1912.zones 파일에 server.com 밑에 kh.com에 대한 도메인 정보를 추가한다.
[root@ns1 named]# cd
[root@ns1 ~]# vi /etc/named.rfc1912.zones
:
:(생략)
// server.com 지역(구역)을 설정한다.
// directory "/var/named";
zone "server.com" IN { // 지역의 시작
type master; // 원본이므로 master
file "server.com.zone"; // /var/named/server.com.zone
allow-update { none; }; // DDNS 사용 안함.
}; // 지역의 끝

zone "kh.com" IN { type master; file "kh.com.zone"; allow-update { none; }; };

2. 포워드 존파일 생성
/var/named 디렉터리에 이동해서 이전에 생성한 server.com.zone 파일을 kh.com.zone 파일로 복사한다.
[root@ns1 ~]# cd /var/named
[root@ns1 named]# cp -a server.com.zone kh.com.zone
[root@ns1 named]# ll kh.com.zone
-rw-r-----. 1 root named 189 1월 20 04:54 kh.com.zone
[root@ns1 named]# vi kh.com.zone
$TTL 300
@ IN SOA ns1 root ( 2023012001 6H 30M 2W 3H )
IN NS ns1
IN A 200.200.200.3
ns1 IN A 200.200.200.3
www IN A 200.200.200.3

3. 네임서버 재시작
네임서버의 설정 파일과 포워드 존 파일의 문법을 검사하고 문제가 있는지 확인한다.
[root@ns1 named]# named-checkconf
[root@ns1 named]# named-checkzone kh.com kh.com.zone
zone kh.com/IN: loaded serial 2023012001
OK

4. 확인
네임서버의 설정 파일과 포워드 존 파일의 문법에 문제가 없다면 네임서버를 재시작한다.
[root@ns1 named]# systemctl restart named

dig 명령어를 이용해서 sbs.com에 대한 도메인 질의를 통해서 설정을 확인한다.
[root@ns1 named]# dig @200.200.200.3 kh.com soa +short
ns1.kh.com. root.kh.com. 2023012001 21600 1800 1209600 10800
[root@ns1 named]# dig @200.200.200.3 kh.com ns +short
ns1.kh.com.
[root@ns1 named]# dig @200.200.200.3 ns1.kh.com +short
200.200.200.3
[root@ns1 named]# dig @200.200.200.3 www.kh.com +short
200.200.200.3
[root@ns1 named]# dig @200.200.200.3 kh.com +short
200.200.200.3

실습 문제 풀이> 아래 조건에 맞는 도메인 추가하기

-- 조건 --
1. 도메인명
1차 네임서버(200.200.200.3)에서 설정한다.

2. dig의 결과
[root@ns1 ~]# dig @200.200.200.3 sbs.com soa +short
ns1.sbs.com. webmaster.sbs.com. 2023012001 21600 1800 1209600 10800
[root@ns1 ~]# dig @200.200.200.3 sbs.com ns +short
ns1.sbs.com
[root@ns1 ~]# dig @200.200.200.3 ns1.sbs.com +short
200.200.200.3
[root@ns1 ~]# dig @200.200.200.3 www.sbs.com +short
200.200.200.3
[root@ns1 ~]# dig @200.200.200.3 sbs.com +short
200.200.200.3
-- 조건 --

1. 도메인 등록
/etc/named.rfc1912.zones 파일에 kh.com 밑에 sbs.com에 대한 도메인 정보를 추가한다.
[root@ns1 named]# cd
[root@ns1 ~]# vi /etc/named.rfc1912.zones
:
:(생략)
// server.com 지역(구역)을 설정한다.
// directory "/var/named";
zone "server.com" IN { // 지역의 시작
type master; // 원본이므로 master
file "server.com.zone"; // /var/named/server.com.zone
allow-update { none; }; // DDNS 사용 안함.
}; // 지역의 끝

zone "kh.com" IN { type master; file "kh.com.zone"; allow-update { none; }; };
zone "sbs.com" IN { type master; file "sbs.com.zone"; allow-update { none; }; };

2. 포워드 존파일 생성
/var/named 디렉터리에 이동해서 이전에 생성한 server.com.zone 파일을 sbs.com.zone 파일로 복사한다.
[root@ns1 ~]# cd /var/named
[root@ns1 named]# cp -a server.com.zone sbs.com.zone
[root@ns1 named]# ll sbs.com.zone
-rw-r-----. 1 root named 189 1월 20 04:54 sbs.com.zone

sbs.com.zone 파일을 열어서 email 주소를 webmaster로 수정한다.
[root@ns1 named]# vi sbs.com.zone
$TTL 300
@ IN SOA ns1 webmaster ( 2023012001 6H 30M 2W 3H )
IN NS ns1
IN A 200.200.200.3
ns1 IN A 200.200.200.3
www IN A 200.200.200.3

3. 네임서버 재시작
네임서버의 설정 파일과 포워드 존 파일의 문법을 검사하고 문제가 있는지 확인한다.
[root@ns1 named]# named-checkconf
[root@ns1 named]# named-checkzone sbs.com sbs.com.zone
zone sbs.com/IN: loaded serial 2023012001
OK

4. 확인
네임서버의 설정 파일과 포워드 존 파일의 문법에 문제가 없다면 네임서버를 재시작한다.
[root@ns1 named]# systemctl restart named

dig 명령어를 이용해서 sbs.com에 대한 도메인 질의를 통해서 설정을 확인한다.
[root@ns1 named]# dig @200.200.200.3 sbs.com soa +short
ns1.sbs.com. webmaster.sbs.com. 2023012001 21600 1800 1209600 10800
[root@ns1 named]# dig @200.200.200.3 sbs.com ns +short
ns1.sbs.com.
[root@ns1 named]# dig @200.200.200.3 ns1.sbs.com +short
200.200.200.3
[root@ns1 named]# dig @200.200.200.3 www.sbs.com +short
200.200.200.3
[root@ns1 named]# dig @200.200.200.3 sbs.com +short
200.200.200.3

실습> 네임서버 동기화 하기

2차 네임서버에서 1차 네임서버의 도메인에 대한 정보를 그대로 복사한다.
1차 네임서버: server.com, kh.com, sbs.com
2차 네임서버: server.com

1. 도메인 등록
[root@ns2 ~]# vi /etc/named.rfc1912.zones
:
:(생략)
zone "server.com" IN {
type slave; // 복사본이므로 slave
file "server.com.zone"; // /var/named/server.com.zone
masters { 200.200.200.3; }; // 1차 네임서버 주소
};

2. 네임 서버 재시작
[root@ns2 ~]# ls -F /var/named/
chroot/ data/ dynamic/ named.ca named.empty named.localhost named.loopback slaves/

[root@ns2 ~]# named-checkconf

[root@ns2 ~]# systemctl restart named

확인1 체크. 포워드 존파일이 생겼다.
[root@ns2 ~]# ls -F /var/named/
chroot/ data/ dynamic/ named.ca named.empty named.localhost named.loopback server.com.zone slaves/

[root@ns2 ~]# file /var/named/server.com.zone
/var/named/server.com.zone: data

3. 확인
[root@ns2 ~]# dig @200.200.200.4 server.com soa +short
ns1.server.com. root.server.com. 2023012001 21600 1800 1209600 10800
[root@ns2 ~]# dig @200.200.200.4 server.com ns +short
ns1.server.com.
[root@ns2 ~]# dig @200.200.200.4 ns1.server.com +short
200.200.200.3
[root@ns2 ~]# dig @200.200.200.4 www.server.com +short
200.200.200.3
[root@ns2 ~]# dig @200.200.200.4 server.com +short
200.200.200.3

실습> zone 파일 텍스트 형태로 전송하기

2차 네임서버를 재시작하면 1차 네임서버로 접속해서 server.com의 존파일을 가져온다.
존파일 형식: text, binary 형식이 있다.
-bind 9.9 이후 부터는 text 형태가 아닌 binary 형태로 변경되었다.
-옵션을 사용하면 binary에서 text 형태로 변경이 가능하다.
-장점: 속도, 수정금지
-단점: 눈으로 확인할 수 없다.

네임서버가 재시작하면 server.com에 대한 포워드 존파일을 1차 네임서버에서 가져와서 file에 명시한 파일 /var/named/server.com.zone 파일로 저장한다.
[root@ns1 ~]# file /var/named/server.com.zone
/var/named/server.com.zone: ASCII text
[root@ns2 ~]# file /var/named/server.com.zone
/var/named/server.com.zone: data

1. zone 파일 확인
네임서버가 재시작하면 server.com에 대한 포워드 존파일을 1차 네임서버에서 가져와서 file에 명시한 파일 /var/named/server.com.zone 파일로 저장한다.
[root@ns1 ~]# file /var/named/server.com.zone
/var/named/server.com.zone: ASCII text
[root@ns2 ~]# file /var/named/server.com.zone
/var/named/server.com.zone: data

2. 서버 설정
2차 네임서버에서 text 형태로 받아오기 위한 masterfile-format text; 설정을 한다.
[root@ns2 ~]# vi /etc/named.conf

recursion yes;

// 존파일을 text형태로 가져온다.
masterfile-format text;

3. 네임서버 재시작
TEXT로 새롭게 받아오기 위해서 기존 파일인 /var/named/server.com.zone 파일을 삭제한다.
[root@ns2 ~]# rm -f /var/named/server.com.zone

네임서버를 재시작한다.
[root@ns2 ~]# systemctl restart named

4. 확인
binary 형태가 아닌 text형태로 저장된 것을 확인할 수 있다.
[root@ns2 ~]# file /var/named/server.com.zone
/var/named/server.com.zone: ASCII text
[root@ns2 ~]# cat /var/named/server.com.zone
ORIGIN.ORIGIN .TTL 300 ; 5 minutes
server.com IN SOA ns1.server.com. root.server.com. (
2023012001 ; serial
21600 ; refresh (6 hours)
1800 ; retry (30 minutes)
1209600 ; expire (2 weeks)
10800 ; minimum (3 hours)
)
NS ns1.server.com.
A 200.200.200.3
$ORIGIN server.com.
ns1 A 200.200.200.3
www A 200.200.200.3

[root@ns2 ~]# dig @200.200.200.4 server.com +short
200.200.200.3

profile
정보보안 전문가

0개의 댓글