[Centos 7] DNS ( Domain Name System )

2022. 11. 29. 17:23리눅스(Linux)

DNS : Domain Name System

   - Domain Name → IP주소로 변환(정방향 조회) / 일반적인 클라이언트가 조회하는 방식

   - IP주소를 Domain Name으로 변환(역방향 조회) / 특수한 상황에서만 사용이 된다

   - DNS 사용 Port : TCP/53(영역전송), UDP/53(영역전송, DNS Query 전송)

   - Internet 통신은 (TCP/IP) 프로토콜을 이용하여 통신을 진행하므로, 클라이언트에게 IP주소 체계를 쉽게 사용 할 수 있도록 도움을 주기위해 반드시 필요하다.

   - 회사에서 관리해야할 도메인은 서브도메인이다. 

   - bind, named 패키지를 사용

 

$ Domain Name 구조

www.(Host Name) . Google .com(Domain Name) . (Root Domain)

 

호스트네임

WEB    : www

MAIL    : mail

FTP      : ftp

 

$ DNS Record 종류

 

SOA Record (Start of Authority)

   - Domain을 관리할 수 있는 권한을 정의, Slave DNS서버(보조네임서버)와의 연결에 관한 값을 정의

   - 모든 DNS의 첫 번째 레코드로 설정.

 

NS Record (Name Server)

   - 해당 Domain에 대한 영역 파일을 보유하고 있는 Server를 지칭하는 Record, SOA와 마찬가지로 필수적인 Record가 된다.

 

* SOA, NS Record는 필수 레코드 

 

A(AAAA) Record 

   - 실질적으로 가장 많이 사용되는 Record로써, Host Name에 대한 IP주소를 Mapping하는 Record이다.

   - Host Name은 Service를 구분하는 이름이므로 A Record를 이용하여 각 Service가 실행되고 있는, Server의 IP 주소와 Host Name을 Mapping한다.

   - A Record- www 192.168.1.129 (Web Server IP) www + kgitbank.com = FQDN : www.kgitbank.com

   - A Record- ftp 192.168.1.130 (FTP Server IP) ftp + kgitbank.com = FQDN : ftp.kgitbank.com

   - A Record (IPv4), AAAA Record (IPv6) 

 

FQDN : 모든 리소스가 정의된 도메인 (www 라는 호스트 네임 안적어도 접속이 가능하게 만듬)

 

CNAME Record 

   - A Record에서 Mapping 된 Host Name의 별칭을 지칭하는 Record

 

MX Record

   - MX Record는 메일 서버를 지칭하는 Record로써 메일서버의 IP주소를 Mapping하는 용도로 사용된다.

 

SPF Record (Sender Policy Framework) : 메일서버등록제 Record

   - 메일서버 정보를 사전에 DNS에 공개 등록함으로써 수신자료 하여금 E-Mail에 표시된 발신지 정보가 실제 메일서버의 정보와 일치하는지를 확인할 수 있도록 하는 인증기술

   - 발신자 : 자신의 메일서버 정보와 정책을 나타내는 SPF Record를 해당 DNS에 등록

   - 수신자 : E-Mail 수신 시 발송자의 DNS에 등록된 SPF Record 를 확인하여 해당 E-Mail에 표시된 발송 IP와 대조하고 그결과값에 따라 수신여부를 결정

 

 

$ dns 설정 파일

# /etc/hosts
IP주소   문자주소   [문자주소] ... [문자주소]
   - 컴퓨터에 입력되는 FQDN을 특정 IP로만 고정적으로 연결시키기 위해 사용
   - 리눅스에서 dns보다 먼저 호스트명을 ip로 풀어주는 파일

# /etc/resolv.conf
nameserver <DNS IP>

* DNS server 주소 예시
168.126.63.1  (KT DNS)
8.8.8.8       (google DNS)
  - 요청할 dns서버를 지정할 때 사용
  - IP 설정에 입력된 DNS server 주소가 저장, 실제 DNS server 연결 시 참조하는 파일
  - network 데몬이 실행될 때 마다 DNS server 주소 정보가 다시 로드

/etc/named.conf

# vi /etc/named.conf
12 options {
13         listen-on port 53 { any; };
   - 127.0.0.0.1 (IPv4 루프백 주소), any로 바꿔줘야 클라이언트 측이 DNS 검색 가능해짐
   - DNS는 내부에서 사용하기 위해 쓰는 것이 아니라 외부에서 공개로 사용하기 때문에 any로 풀어줘야 한다.

14         listen-on-v6 port 53 { ::1; };
   - ::1 (IPv6 루프백 주소)
   
15         directory       "/var/named";
   - 실제 작업 디렉토리
   
16         dump-file       "/var/named/data/cache_dump.db";
   - 캐시 정보가 저장되는 위치
   
17         statistics-file "/var/named/data/named_stats.txt";
   - 상태정보 관련 파일 저장 위치
   
18         memstatistics-file "/var/named/data/named_mem_stats.txt";
19         recursing-file  "/var/named/data/named.recursing";
20         secroots-file   "/var/named/data/named.secroots";
21         allow-query     { any; }; 
   - 13번 줄과 비슷한 역할, 쿼리에 대한 허용
   
22         recursion yes;
   - no로 바꿔서 운영해야함
   - yes: 캐시서버의 역할을 허용, no:캐시서버의 역할을 수행하지 않음,
   - 특정 클라이언트가 내가 관리하는 도메인이 아닌 다른 도메인을 질의 했을 때 무시한다.
   - 등록해놓은 질의만 받아들이고 그거에 대한 응답만 수행한다.
   
43 zone "." IN {
44         type hint;
45         file "named.ca";
46 };
   - type hint (cache server)
   - ‘.’에대한 정보를 named.ca에서 가지고 있다.

48 include "/etc/named.rfc1912.zones";
49 include "/etc/named.root.key";
   - 원래는 named.conf에 모두 넣어둬야 하는데 그러게하기엔 너무 파일이 커져서 나눠서 관리
   - include 함수를 사용하여 지정 파일을 참조하도록 설정

$ Recursion 정책 설정

# vi /etc/named.conf
12 acl AllowRecursion { 
   - options 위에 새로 정의
   
13         192.168.1.150; 
   - 대역대로도 설정가능(192.168.1.0/24)
   
14 };
26         recursion yes; 
   - 리큐전 허용으로 변경
   
27         allow-recursion { AllowRecursion; }; 
   - 밑에 새로 정의, 내가 설정한 리큐전 규칙만 허용하는 정책

/etc/named.rfc1912.zones 

vi /etc/named.rfc1912.zones 
43  zone"itbank.com" IN {  
   - 정방향 조회영역, 내가 사온 도메인네임 기입
   
44         type master; 
   - 직접 도메인을 운영한다는 정의 , (master / hint / slave)
   - master : 실제 내가 이 도메인을 운영한다. 
   - hint : cache Server 역할을 한다. 
   - slave : 이중화 구성할 때 사용한다.(backup Server), 
   특정 도메인에대한 정의를 하지 못함. 변경사항을 부여 못함.
   
45         file "itbank.zone"; 
   - .zone (정방향 영역파일)
   - 레코드를 정의하고 있는 영역 파일 명시 , 작업파일 위치 /var/named/ 
   
46         allow-transfer { 192.168.1.150; }; 
   - 영역파일을 전송할 곳, Slave DNS Server IP 
   
47 };
48
49  zone "1.168.192.in-addr.arpa" IN { 
   - 역방향 조회영역, 보통 Mail 서버 설정
   
50         type master;
51         file "itbank.rev";
   - .rev (역방향 영역파일)
52         allow-transfer { 192.168.1.150; };
53 };

DDNS : DHCP 같은 동적인 IP 주소를 동적으로 매핑시켜주는 서비스 ex)공유기
allow-update 
   - ddns를 구축할 때 웹서버에서 dhcp를 사용한다면 ip가 바뀔 때 자동으로 업데이트 해준다.

 

$ 작업 파일 설정

# cd /var/named 
   - 작업 파일 위치

# cp named.localhost itbank.zone 
# cp named.localhost itbank.rev
   - 기존 작업파일의 형식을 쓰기 위해 복사후 작업한다.

# ls -ld ./itbank* 
-rw-r----- 1 root root 152  7월  6 10:57 ./itbank.rev 
-rw-r----- 1 root root 152  7월  6 10:57 ./itbank.zone
   - 소유권이 named가 아니면 인식을 못할 수 가 있음

# chown .named ./itbank.*
-rw-r----- 1 root  named  152  7월  6 10:57 itbank.rev
-rw-r----- 1 root  named  152  7월  6 10:57 itbank.zone
   - named.conf 소유권이 root named 라서 연동이 잘되고 인식되게하려면 똑같이 소유권 맞춰줘야 함

# vi ./itbank.zone
$TTL 1D 
   - 영역파일 유효기간 1day라는 뜻  
@       IN SOA ns1.itbank.com.          root (  
   - @ 오리진, 도메인네임 의미
                                        0       ; serial          
                                        1D      ; refresh          
                                        1H      ; retry              
                                        1W      ; expire            
                                        3H )    ; minimum
        IN      NS      ns1.itbank.com.
   - 두개 이상 선언 시 마스터, 슬레이브 운용 가능 
   - NS 선언 한 수 만큼 FQDN 추가 선언    
ns1     IN      A       192.168.1.100 
   - www(호스트 네임) + 도메인 네임 = FQDN(IP)  
www     IN      A       192.168.1.100
aaa     IN      CNAME   www.itbank.com. 
   - 별칭 지정, aaa.itbank.com → www.itbank.com 으로 접속, alias기능
   - 도메인 네임은 /etc/named.rfc1912.zones 여기에 명시되어 있음

root (  
   - SOA 레코드값, 권한 정의, Master-Slave 연결 구조 정의
   - root 부분에 E-Mail address 작성(문제가 발생시 알려줄 주소)
   - root라고 작성하면 각 계정 내부에 있는 메일함에 보냄

 0       ; serial  
   - 변경사항 횟수, master에서 변경사항을 수정한 후 수동으로 serial번호를 바꿔주면 slave에서도 변경사항이 변경된다. 
   - 보통 변경한 날짜로 기입
   
1D      ; refresh 
   - master-slave 변경사항이 맞는지 새로고침으로 업데이트
   
1H      ; retry 
   - 새로고침을 시도했는데 연결이 안되었을 경우, 1시간단위로 재시도
   
1W      ; expire 
   - 일주일동안 master-slave 연결이 안되면 폐기


3H )    ; minimum 
   - 누군가 정보를 가져갈 때 남는 캐시를 가지고 있는 시간 설정

 

# vi ./itbank.rev
$TTL 1D
@       IN SOA  ns1.itbank.com.         root (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        IN      NS      ns1.itbank.com.
100     IN      PTR     ns1.itbank.com. 
   - rfc 파일에서 역방향을 명시했을 때 1.168.192라고 정의해줬기 때문에 
100     IN      PTR     www.itbank.com.  
   - 100을 적고 시작

#  systemctl start named
# firewall-cmd --permanent --add-service = dns
# firewall-cmd --reload
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens32
  sources:
  services: dhcpv6-client dns http ssh
  ports: 5044/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

 

$ Cient 환경에서 테스트 

[ win에서 DNS 주소를 192.168.1.100으로 변경 ]
C:\Users\ITBANK_TAEHEI>nslookup 
기본 서버:  www.itbank.com
Address:  192.168.1.100

> www.itbank.com
서버:    www.itbank.com
Address:  192.168.1.100

이름:    www.itbank.com
Address:  192.168.1.100

> www.google.com
서버:    www.itbank.com
Address:  192.168.1.100

*** www.itbank.com이(가) www.google.com을(를) 찾을 수 없습니다. Query refused
   - win환경 cmd 창
   - 리큐전 acl로 192.168.1.150만 허용했기때문에 다른주소는 검색할수가 없음

[ Linux 192.168.1.150 ] 
#vi /etc/resolv.conf 
# Generated by NetworkManager
nameserver 192.168.1.100 
   - 재부팅시 원상 복구
   - 일시적인 테스트를 위해 변경, 원래 우선순위로 위에다가 적어두면됨

# nslookup
> google.com
Server:         192.168.1.100
Address:        192.168.1.100#53
Non-authoritative answer:
Name:   google.com  
Address: 172.217.27.46
Name:   google.com
Address: 2404:6800:4005:808::200e
   - 검색이 가능해짐

$ DNS 이중화 구성

   - master  :192.168.1.100

   - slave     :192.168.1.150

[ Master 서버 ]
# cd /var/named

# vi itbank.zone
$TTL 1D
@       IN SOA ns1.itbank.com.          root (
                                        0       ; serial
                                        60      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        IN      NS      ns1.itbank.com.
        IN      NS      ns2.itbank.com.
ns1     IN      A       192.168.1.100
ns2     IN      A       192.168.1.150
www     IN      A       192.168.1.100
aaa     IN      CNAME   www.itbank.com.


# vi itbank.rev
$TTL 1D
@       IN SOA  ns1.itbank.com.         root (
                                        0       ; serial
                                        60      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        IN      NS      ns1.itbank.com.
        IN      NS      ns2.itbank.com.
100     IN      PTR     ns1.itbank.com.
150     IN      PTR     ns2.itbank.com.
100     IN      PTR     www.itbank.com.

# vi /etc/named.rfc1912.zones
     43  zone"itbank.com" IN {
     44         type master;
     45         file "itbank.zone";
     46         allow-transfer { 192.168.1.150; };
        - slave 서버 ip / 작업파일 전송
     47         also-notify { 192.168.1.150; }; 
        - slave 서버 ip / 변경사항을 전송
     48 };
     49
     50  zone "1.168.192.in-addr.arpa" IN {
     51         type master;
     52         file "itbank.rev";
     53         allow-transfer { 192.168.1.150; };
     54         also-notify { 192.168.1.150; }; 
     55 };
     
[ Slave 서버 ]
# yum -y install bind-* 
# firewall-cmd --permanent --add-service=dns
# firewall-cmd --reload

# vi /etc/named.conf
     12 options {
     13         listen-on port 53 { any; };
     14         listen-on-v6 port 53 { ::1; };
     15         directory       "/var/named";
     16         dump-file       "/var/named/data/cache_dump.db";
     17         statistics-file "/var/named/data/named_stats.txt";
     18         memstatistics-file "/var/named/data/named_mem_stats.txt";
     19         recursing-file  "/var/named/data/named.recursing";
     20         secroots-file   "/var/named/data/named.secroots";
     21         allow-query     { any; };
     22
     23         recursion no;

# vi /etc/named.rfc1912.zones
     43 zone "itbank.com" IN {
     44         type slave;
     45         file "slaves/itbank.zone.slave";
     46         masters { 192.168.1.100; };
        - master 서버 ip / 작업 파일 로드
     47         masterfile-format text;  
        - 바이너리 형식의 문자를 우리가 알아볼수 있는 아스키형태 문자로 포맷시키는 명령문, 
        실무에선 안 씀	
     48         notify yes; 
        - 변경정보를 로드하겠다는 의미
     49 };
     50
     51 zone "1.168.192.in-addr.arpa" IN {
     52         type slave;
     53         file "slaves/itbank.rev.slave";
     54         masters { 192.168.1.100; };
     55         masterfile-format text;
     56         notify yes;
     57 };


# systemctl restart named
# systemctl restart named
# cd /var/named/slaves
   - 이 디렉터리에 master 서버로부터 로드된 작업 파일이 있는지 확인