Linux

[Linux] DNS : 서버 구성, 정방향·역방향 조회

nayoungs 2022. 3. 9. 21:33
728x90

📌INDEX




✔️ DNS란?

 

  • DNS(Domain Name Server)란 IP주소를 Domain 형식(문자열)으로 변환해주는 서비스이다
  • Domain Name이란?
    • 네트워크에 연결되어있는 모든 시스템에는 숫자의 조합으로 구성되는 주소를 가짐
    • 이러한 주소를 다 외우기는 불가능하므로, 알파벳으로 이루어지는 도메인 이름을 사용
    • ex) naver.com = 222.122.84.250
    • 도메인 등록 원칙
      • 도메인 이름은 영문자(a-z), 숫자(0-9) 10개, 특수기호(-) 1개를 합쳐 총 37개의 글자 조합으로 나타낼 수 있음
        • 영문자의 경우 대문자 소문자의 구별 X
        • 특수 기호인 '-' 은 도메인의 처음과 끝에 올 수 없음
      • 도메인 이름의 체계는 피라미드 구조를 하고 있으며, 각 단계별로 독자적으로 관리
      • 도메인 이름은 전 세계적으로 겹치지 않게 하나만 부여됨

 

  • Domain Name 구조(피라미드 구조)

 

 

  1. 클라이언트가 www.sungshin.ac.kr 조회
  2. "." 최상위 서버에게 "kr" DNS 서버를 알아낸다
  3. "kr" 를 관리하는 서버에게 "ac.kr" DNS 서버를 알아낸다
  4. "ac.kr" 를 관리하는 서버에게 "sungshin.ac.kr" DNS 서버를 알아낸다
  5. "www.sungshin.ac.kr"을 알아낸다
  6. 클라이언트에게 질의에 대해 응답해준다

 

  • DNS 주소 확인
    • 1단계 : 직접 설정해둔 DNS 주소에서 확인
      • client => DNS 서버 ( 내 컴퓨터에 설정된 DNS 주소)
      • 해당 DNS 서버에서 관리하는 주소인 경우
        • 바로 서비스 제공 => 신뢰도 높음, 속도도 빠름
      • 그렇지 않은 경우(클라이언트 DNS서버에서 관리하는 주소가 아닌 경우)
        • 이전에 요청이 있었던 경우
          • 요청 했던 정보를 캐시로 저장 => 속도는 빠름, 신뢰도는 떨어짐
        • 그렇지 않은 경우(이전에 요청이 한번도 없었던 경우)
          • 재귀적인 쿼리를 통해 직접 확인 => 속도도 느리고, 신뢰도도 떨어짐

 

  • 네임 서버의 유형
    • 도메인에 대한 DNS 네임 처리를 해주기 위해서는 반드시 한 대의 네임서버가 필요하다.
      • 통상 한 대의 DNS 서버로 운영은 가능하나, 이 네임서버가 다운될 경우 DNS로 하는 모든 작업이 중단되기 때문에 이를 대체할 수 있는 네임서버를 함께 구축해야한다.
    • 주 네임서버(Primary Name Server)
      • 1차 네임서버라고도 부르며, 이 네임서버는 영역에 대한 모든 데이터를 가지고 있기 때문에 한명에 대한 모든 권한을 가지고 있는 가장 중요한 서버이다.
    • 보조 네임서버(Secondary Name Server) (slave)
      • 2차 네임서버라고도 부르며, 이름에서 알 수 있듯이 1차 네임서버가 다운되었을 경우 동작하게 된다.
      • 주 네임서버와 같은 내용(data)를 갖고있다 = 같은 값을 공유하고 있다
    • 캐쉬 서버(Cache Server)
      • 직접 입력이 불가능하고, 주 서버에서 정보를 가져와서 서비스하는 서버이다
      • 일정 시간이 지나면 데이터가 없어진다
      • 이전에 물어보지 않았던 것은 알 수 없다



✔️DNS 관련 파일

 

🔹 /etc/hosts

  • 인터넷 주소와 호스트 이름의 관계를 설정
  • 매운 간단하게 설정할 수 있다는 장점이 있으나, 이 파일의 내용은 로컬 시스템에서만 유용하게 사용할 수 있다.
    • 일반적으로 127.0.0.1 이 로컬 호스트 주소이다
[root@server ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
  • vi 에디터를 통해 설정 및 수정이 가능
    • 설정 후 ping을 통해 확인해볼 수 있다다
    • DNS 서버가 없던 시절에는, 이와 같이 /etc/host 파일에 일일이 등록했었다
[root@server ~]# vi /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.200 client client.encore.class4

:wq
[root@server ~]# ping client
PING client (192.168.56.200) 56(84) bytes of data.
...
[root@server ~]# ping client.encore.class4
PING client (192.168.56.200) 56(84) bytes of data.
...

 

 

🔹 /etc/resolv.conf

  • 호스트가 사용할 DNS 서버의 주소를 설정한다.
  • 자신의 호스트가 DNS 서버라면 자신의 IP주소를 적어줘야한다.
[root@server ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search encore.class4
nameserver [IP주소]
nameserver [IP주소]

 

 

🔹 /etc/named.conf

  • DNS 서버의 환경을 설정하는 파일
  • listen-on port 53 { any; }; : 어떠한 주소에서 질문이 들어오든지 들을 준비가 되었다
  • listen-on port 53 { none; }; : 어떠한 질문에도 답하지 않겠다(비활성화)
  • listen-on port 53 { 127.0.0.1; }; : 루프백에 대해서만 반응하겠다
  • listen-on port 53 { [IP주소]; }; : 해당 IP주소를 지정하고, 이 주소에 대해서만 질문을 들을 준비가 되었다
[root@server ~]# cat /etc/named.conf
...
options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { none; };
        directory       "/var/named"; //네임서버 DB파일 위치 지정
        //chroot 설치 시 / var/named/chroot/var/named로 위치 변경
        dump-file       "/var/named/data/cache_dump.db"; //네임서버 정보 변경시 dump 파일로 지정
        statistics-file "/var/named/data/named_stats.txt"; //네임서버 통계자료 저장
        memstatistics-file "/var/named/data/named_mem_stats.txt"; //메모리 상태 정보 저장
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { any; };

...

zone "." IN {
        type hint;
        file "named.ca";
};

zone "encore.class4" IN {
        type master;
        file "encore.class4.zone";
};

zone "2.0.10.in-addr.arpa" IN {
        type master;
        file "10.0.2.0.zone";
};


include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
  • 일반적인 정방향 조회 zone 설정
//linux.edu.kr.zone 설정
zone “linux.edu.kr" IN {
type master; //master 1차 DNS server 로 구성
file “linux.edu.kr.zone"; //zone 파일 이름지정
allow-update { any; }; //동적 업데이트 모두 허용
allow-transfer { any; }; //zone transfer 모두 허용
};
  • 일반적인 역방향 조회 zone 설정
    • 역방향 도메인 형식
      • 최소 단위는 C 클래스
        • 마지막 자리를 제외하고, 나머지 세자리 순서를 뒤집어서 기록
        • 그 다음, in-addr.arpa를 postfix로 붙여준다.
    • ex) 192.168.8.xx
      • 마지막 자리를 제외 : 192.168.8
      • 세자리 뒤집기 : 8.168.192
      • postfix 붙이기 : 8.168.192.in-addr.arpa
//reverse mapping 설정
zone “8.168.192.in-addr.arpa" IN {
type master;
file “192.168.8.zone";
allow-update { any; }; //동적 업데이트 모두 허용
allow-transfer { any; }; //zone transfer 모두 허용
};

 

 

🔹 zone 파일

  • /etc/named.conf 파일에 추가한 zone영역의 내용을 보면, zone 파일의 이름 및 경로가 표시되어있고, option 영역의 Dictionary를 보면, /var/named가 기본값으로 설정되어있다.
  • 즉, 우리가 만들 zone 파일은 /var/named/ 하위에 위치해야한다.
    • cd 명령어로 /var/named/로 이동한 뒤, touch 또는 vi 명령을 통해 zone 파일 생성
  • zone 파일 구성
    • 도메인 주소를 적을 때에는 마지막에 마침표(.) 찍는 것을 잊지 말 것

 

 

  • NS : 네임 서버 지정
  • A : ipv4 주소
  • AAAA : ipv6 주소

 

예시 : 역방향 조회

$TTL 86400 ; 1 day //time to live 데이터의 수명
@      IN SOA ns.linux.edu.kr. root (
                        42 ; serial (d. adams)
                        3H ; refresh
                        15M ; retry
                        1W ; expire
                        1D ; minimum
                        )
       IN NS            ns.linux.edu.kr
       IN A             192.168.8.10
       
10 IN PTR         www.linux.edu.kr.
//PTR 레코드는 IP 주소에 대해 도메인 명을 매핑하여 주며, Reverse Zone 파일에서 사용



 

✔️ 도메인 확인 명령어

 

🔹 nslookup

  • DNS 서버에 질의를 하는 명령어
  • DNS 서버와 대화식으로 질의하고 응답을 받는다

 

사용 예

[root@localhost ~]# nslookup
> www.linux.edu.kr
Server: 192.168.8.10
Address: 192.168.8.10#53

Name: www.linux.edu.kr
Address: 192.168.8.10

> 192.168.8.10
Server: 192.168.8.10
Address: 192.168.8.10#53

10.8.168.192.in-addr.arpa name = www.linux.edu.kr

 

 

🔹host

  • 도메인 이름을 통해 IP주소를 알아거나 IP주소를 통해 도메인 이름을 알아내는 명령어
  • 사용법 : host [option] [도메인|ip 주소] [DNS 서버]
  • 옵션
    • -t type : type을 지정하여 정보를 얻음
      • A : 호스트ip주소
      • NS : 검색한 호스트의 네임 서버 호스트명
      • PTR : 도메인 네임 포인터
      • ANY : 타입의 모든 정보
    • -v : 자세한 정보 출력
    • -a : -t ANY와 같은 기능 (all)

사용 예

[root@server named]# host -t A 10.0.2.10
10.2.0.10.in-addr.arpa domain name pointer server.encore.class4.
[root@server named]# host -v -t A 10.0.2.10
Trying "10.2.0.10.in-addr.arpa"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51680
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;10.2.0.10.in-addr.arpa.                IN      PTR

;; ANSWER SECTION:
10.2.0.10.in-addr.arpa. 10800   IN      PTR     server.encore.class4.

;; AUTHORITY SECTION:
2.0.10.in-addr.arpa.    10800   IN      NS      server.encore.class4.

;; ADDITIONAL SECTION:
server.encore.class4.   10800   IN      A       10.0.2.10

Received 104 bytes from 10.0.2.10#53 in 0 ms

 

 

🔹 dig

  • dig(Domain Information Groper)는 네임서버로 부터 정보를 가져올 수 있는 툴
  • dig명령은 DNS 네임서버 구성과 도메인 설정이 완료된 후, 도메인 네임에 대한 DNS질의 응답이 정상적으로 이루어지는지를 확인 점검하는 경우에 많이 사용

 

사용 예

[root@server named]# dig 10.0.2.10

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 <<>> 10.0.2.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 32279
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

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

;; Query time: 4994 msec
;; SERVER: 10.0.2.10#53(10.0.2.10)
;; WHEN: 수  3월 09 02:19:19 KST 2022
;; MSG SIZE  rcvd: 38



 

✔️ DNS 서버

 

🔹 DNS 서버 구성 과정

  1. 패키지 설치 (bind, bind-utils)
  2. 서비스 설정
    • 고정 ip 설정
    • DNS 서버 주소 설정
    • hostname 설정
    • /etc/named.conf 설정
    • /var/named => zone 설정
  3. 서비스 활성화
    • systemctl start named
    • systemctl enable named
  4. 방화벽 설정
    • firewall-cmd --add-service=dns --permanent
    • firewall-cmd --reload

 

 

🔹 정방향 조회

  • 정방향 조회 : 이름 -> 주소

 

1. 패키지 설치 (bind, bind-utils)

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

 

2. 서비스 설정

  • 고정 ip 설정
[root@server ~]# nmcli con add con-name static ifname enp0s3 type ethernet ip4 10.0.2.10/24 gw4 10.0.2.2
Warning: There is another connection with the name 'static'. Reference the connection by its uuid 'f480458d-cc92-4442-8885-ea67bfa2c480'
연결 'static' (f480458d-cc92-4442-8885-ea67bfa2c480)이 성공적으로 추가되었습니다.
  • DNS 서버 주소 설정(설정 파일 3개, 호스트명)
    • /etc/resolv.conf 파일에서 확인 가능
[root@server ~]# nmcli con mod static ipv4.dns 10.0.2.10
[root@server ~]# nmcli con reload
[root@server ~]# nmcli con up static
연결이 성공적으로 활성화되었습니다 (D-Bus 활성 경로: /org/freedesktop/NetworkManager/ActiveConnection/6)
[root@server ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search encore.class4
nameserver 10.0.2.10
  • hostname 설정
    • 여기서는 호스트명은 server.encore.class4로 지정
[root@server ~]# hostnamectl set-hostname [host명]
  • /etc/named.conf 설정
    • listen-on-port 53 {any;} ;로 설정
    • allow-query {any; }; 로 설정
    • zone 추가
      • zone 마지막에 세미콜론(;) 잊지 말것
[root@server ~]# vi /etc/named.conf
...
options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { none; };
        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"; 
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { any; };
...
zone "." IN {
        type hint;
        file "named.ca";
};

//zone 추가
zone "encore.class4" IN {
        type master; //master 1차 DNS server로 구성
        file "encore.class4.zone"; //zone 파일 이름 지정
};
  • /var/named => zone 설정
    • 기존 형식 이용을 위해 named.empty를 활용할 수 있다.
[root@server named]# cd /var/named
[root@server named]# cp named.empty encore.class4.zone
[root@server named]# vi encore.class4.zone
[root@server named]# cat encore.class4.zone
$TTL 3H
@       IN SOA  encore.class4.  root.encore.class4. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      server.encore.class4. //네임 서버 지정
        A       10.0.2.10
server  A       10.0.2.10
www     A       10.0.2.20
ftp     A       10.0.2.30
mail    A       10.0.2.40

 

 

3. 서비스 활성화 (named)

[root@server named]# systemctl start named.service
[root@server named]# systemctl enable named.service

 

 

4. 권한 설정

  • 기존 상태
[root@server named]# ls -l encore.class4.zone
-rw-r-----. 1 root  root   236  3월  7 16:08 encore.class4.zone
  • 권한 변경
    • chmod 660 : 접속할 수 있도록
    • 그룹 named로 변경
[root@server named]# chmod 660 encore.class4.zone
[root@server named]# chown :named encore.class4.zone
[root@server named]# ls -l encore.class4.zone
-rw-rw----. 1 root named 236  3월  7 16:08 encore.class4.zone
[root@server named]# systemctl restart named.service

 

 

5. 방화벽 설정(dns)

[root@server named]# firewall-cmd --add-service=dns --permanent
success
[root@server named]# firewall-cmd --reload

 

확인

[root@server named]# host server.encore.class4
server.encore.class4 has address 10.0.2.10
[root@server named]# host www.encore.class4
www.encore.class4 has address 10.0.2.20
[root@server named]# host ftp.encore.class4
ftp.encore.class4 has address 10.0.2.30
[root@server named]# host mail.encore.class4
mail.encore.class4 has address 10.0.2.40
[root@server named]# host -t A www.encore.class4
www.encore.class4 has address 10.0.2.20
[root@server named]# host -v -t A www.encore.class4
Trying "www.encore.class4"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37692
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;www.encore.class4.             IN      A

;; ANSWER SECTION:
www.encore.class4.      10800   IN      A       10.0.2.20

;; AUTHORITY SECTION:
encore.class4.          10800   IN      NS      server.encore.class4.

;; ADDITIONAL SECTION:
server.encore.class4.   10800   IN      A       10.0.2.10

Received 88 bytes from 10.0.2.10#53 in 0 ms

 

 

🔹 역방향 조회

  • 역방향 조회 : 주소 -> 이름
  • hostname 설정까지 정방향 조회와 동일
  • /etc/named.conf 설정
    • 변경 사항 : zone 추가
    • 역방향 도메인 형식
      • 최소 단위는 C 클래스
        • 마지막 자리를 제외하고, 나머지 세자리 순서를 뒤집어서 기록
        • 그 다음, in-addr.arpa를 postfix로 붙여준다.
    • 10.0.2.0
      • 마지막 자리 제외: 10.0.2
      • 나머지 세자리 순서 뒤집기: 2.0.10
      • postfix 추가 : 2.0.10.in-addr.arpa
[root@server named]# cat /etc/named.conf
...
zone "2.0.10.in-addr.arpa" IN {
        type master;
        file "10.0.2.0.zone";
};


include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
  • /var/named => zone 설정
    • 10.0.2.0.zone 파일 작성
    • 정방향 조회 시 작성했던, encore.class4.zone 파일 활용
    • 역방향은 PTR (PTR 리코드: 리버스 도메인) 작성
[root@server named]# cp encore.class4.zone 10.0.2.0.zone
[root@server named]# cat 10.0.2.0.zone
$TTL 3H
@       IN SOA  encore.class4.  root.encore.class4. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      server.encore.class4.
        A       10.0.2.10

10      PTR     server.encore.class4.
20      PTR     www.encore.class4.
30      PTR     ftp.encore.class4.
40      PTR     mail.encore.class4.
  • 이후부터(서비스활성화, 권한설정, 방화벽설정) 정방향 조회와 동일

 

 

 

 

참조

 

 

 

728x90