ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DNS 구현 및 개념 정리
    CS 지식/리눅스 2023. 3. 29. 14:25

    DNS (Domain Name System) 란?


    https://gentlysallim.com/dns%EB%9E%80-%EB%AD%90%EA%B3%A0-%EB%84%A4%EC%9E%84%EC%84%9C%EB%B2%84%EB%9E%80-%EB%AD%94%EC%A7%80-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC/
    출처: https://kinsta.com/knowledgebase/what-is-dns/

    DNS 서버 도메인 네임 시스템이다.

    DNS는 보유한 도메인을 관리해주는 역할을 수행하지만, 클라이언트에서 도메인명에 대한 IP 주소의 조회를 요청했을 경우에 반환해주는 역할도 수행한다. 즉, 도메인 네임 시스템은 호스트 도메인 이름을 IP 주소로 바꾸거나 그 반대의 변환을 위해서 개발되었다. IP 주소 기반의 인터넷 체계에서 도메인명 기반으로 이용하려면 필수적으로 구성해야 하는 것이 DNS 서버이다. 이렇게 설명해서 DNS가 무엇인지 확실히 와닿지 않을 수도있다. 

     

    DNS 서버 설정의 핵심은 /etc/named.conf 파일과 zone파일이다. /etc/named.conf 파일에서 DNS서버의 환경에 대해 설정을 하고, 운영하는 도메인에 대한 존 파일 및 리버스존 (reverse zone) 파일을 지정한다.zone파일은 지정된 경로에 정해진 포맷으로 생성하는데 호스트명 지정, 2차 도메인 부여등 도메인에 대한 정보를 담고 있는 파일이다. 

     

    DNS는 쉽게 말해 '전화번호부'이다. 우리는 지인들과 연락을 하기 위해 모든 전화번호를 외우고 있지 않는다.

    전화번호부에 들어가서 연락하고 싶은 사람의 이름을 검색해 통화 버튼만 눌러주면 전화번호가 알아서 해당이름과 매칭되는 번호를 찾아 전화 연결을 할 수 있다.

    우리는 무수히 많은 컴퓨터 기기가 연결된 인터넷을 매일 사용하고 있다. 그리고 컴퓨터끼리 아무렇지 않게 통신을 하고 도메인을 통해 원하는 사이트에 접속을 한다. 여기서 이 도메인은 우리 같은 사람이 읽기 쉬운 문자로 되어 있다. 하지만 컴퓨터는 이러한 문자들이 뭘 뜻하는 건지 전혀 알지 못한다.

    실제로는 각 컴퓨터 호스트 간에 통신을 하기 위해서는 IP주소를 알아야 하고, 이러한 IP주소를 우리가 읽기 쉽게 문자로 표현한 것이 도메인이다. 이렇게 도메인을 IP주소로, IP주소를 도메인으로 바꾸어 주는 역할을 하는 녀석이 DNS이다.

     

    전화번호부라고 비유한 이유가 이것이다. 숫자로 된 외우기 힘든 IP주소를 쉬운 문자로 매핑해주는 역할을 하기 때문이다. 

     

     

     

     

    DNS 서버의 종류 


    Primary Name Server : 사용하는 도메인을 관리하기 위해 필수적으로 구성하는 서버로 보통 Master DNS Primary Name Server 라고 부른다. 도메인이 등록할 때 이 서버의 IP 주소를 등록하고, 자체 도메인에 대한 정보를 관리하게 된다. 

     

    Secondary Name Server : Primary Name Server의 zone 파일을 백업하는 역할을 수행하여 Slave DNS라고도 부른다 . 외부 클라이언트에서 이 서버를 2차 DNS서버로 설정하면 Master DNS가 다운된 상태라도 정상적으로 해당 도메인에 대해 리졸빙(resolving) 정보를 제공한다. 

     

    Caching Name Server : 관리하는 도메인 없이 리졸빙만을 제공하기 위해 구성하는 서버. 도메인에 대한 리졸빙 결과를 저장하고 기록된 정보에 대한 요청이 들어올 경우에 직접 조회하지 않고 바로 응답해주는 역할을 수행한다. 인터넷 사용 속도를 높이기 위해서 사용되기도 한다. 

     

     

     

     

    DNS 서버 프로그램 : BIND ( Berkeley Internet Name Domain )


    bind 는 가장 널리 쓰이는 DNS 서버 프로그램으로 named 라는 이름의 데몬을 사용한다.

    레드햇 계열 리눅스는 bind, bind-utils, bind-libs 등의 패키지로 배포되고 있으며, CentOS 7 버전에서는 'yum install bind' 명령으로 모든 패키지를 쉽게 설치할 수 있다. 

     

     

    bind 관련 파일 및 디렉터리 

     

    /etc/named.conf 

    ➡️ DNS 서버의 전반적인 환경 설정을 담당 파일 서버에서 사용하는 zone 파일을 지정한다. 

     

    /var/named 

    ➡️ 루트 도메인 서버에 대한 정보를 담고 있는 named.ca 를 비롯하여 사용자가 선언하는 zone 파일 등이 위치하는 디렉터리이다. 

     

     

    DNS 서버 설정의 개요

     

    ➡️ DNS 서버 설정의 핵심은 /etc/named.conf 파일 zone 파일이다. 

    /etc/named.conf 파일에서 DNS 서버의 환경에 대한 설정을 하고, 운영하는 도메인에 대한 존 파일 및 리버스 존(reverse zone) 파일을 지정한다. 존 파일은 지정된 경로에 정해진 포맷으로 생성하는데 호스트명 지정, 2차 도메인 부여 등 도메인에 대한 정보를 담고 있는 파일이다. 

     

     

     

     


     

     

    DNS 구축 과정 정리 


    # yum -y install bind bind-chroot bind-utils 

    - bind : 리눅스의 대표적인 DNS Berkeley Unternet Name Domain

    • bind-chroot : 악의적인 사용자로부터 bind를 보호하기 위한 방법
    • bind-utils : 도메인 관련 작업시 dig 커맨드를 이용할 때가 많은데 이거 설치해주면 dig 커맨드도 같이 설치됨

     

     

    # hostnamectl set-hostname ns

    // 이름 바꾸기
    # cp /etc/named.conf /etc/named.conf.bak

    -> named.conf파일 미리 백업해두기!!

     

     

    [ ZONE 파일 지정하기 ]

     

    # vi /etc/named.conf 

     

     

       *    #vi /et/named.conf 란?

    네임 서버 데이터 베이스, root 존파일 위치, root 파일, 키파일, 접근제어 등 가장 핵심적인 설정 파일. 

    DNS 서버의 전반적인 환경 설정을 담당 파일로 서버에서 사용하는 ZONE파일을 지정함. 

     

     

    zone파일 내에 있는 127.0.0.1 은 무엇일까? 

    127.0.0.1 = localhost 

    127.0.0.1; 192.168.0/21; 10.31.0/24; 

    내 포트로 들어올 수 있는 대역대를 설정해주기.

    여기서 오는 요청만 받겠다고 설정해주기.

    내 pc, 교실 ip대역대, 내 내부 pc 대역대이다

     

     

     

    # vi /etc/named.conf 치고 들어가서,

    " ggdG " 명령어로 기존 내용 한번에 다 지워주고, 새로 아래 내용을 복붙해주기.

     

     

    options {
            listen-on port 53 { 127.0.0.1; 192.168.0/21; 10.31.0/24; }; // 실습 중 비트가 변해서 21로
            listen-on-v6 port 53 { ::1; };
            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     { localhost; 192.168.0/21; 10.31.0/24; }; // 실제로 서비스를 제공하려는 아이피 대역들
            forwarders { 8.8.8.8; 8.8.4.4; };  // 외부의 dns정보 (구글)

            recursion yes;

            dnssec-enable yes;
            dnssec-validation yes;

            /* Path to ISC DLV key */
            bindkeys-file "/etc/named.iscdlv.key";

            managed-keys-directory "/var/named/dynamic";

            pid-file "/run/named/named.pid";
            session-keyfile "/run/named/session.key";
    };

    logging {
            channel default_debug {
                    file "data/named.run";
                    severity dynamic;
            };
    };
    view "internal" {
            zone "." IN {
                    type hint;
                    file "named.ca";
            };

            include "/etc/named.rfc1912.zones";
            include "/var/named/ssoontory.shop.zones"; # 호스팅 영역 생성
    };

     


    [ DNS zone 파일을 등록하는 설정 파일 ]


    # vi /var/named/ssoontory.shop.zones

    // [New File] 을 만들어주는 과정


    zone "ssontory.shop" IN {
            type master;
            file "ssoontory.shop.db";
            allow-update { none; };
    };

    zone "0.31.10.in-addr.arpa" IN {
            type master;
            file "0.31.10.in-addr.arpa.db";
            allow-update { none; };
    };

     

     

     

    [ 도메인 네임을 받으면 >> 아이피로 바꿔주는 과정 ]

     

    # vi /var/named/ssoontory.shop.db [각 도메인에 해당하는 내용을 적어주기]

     

    $TTL    86400
    @       IN      SOA     ssoontory.shop.   root.ssoontory.shop.(
                            2022041401 ; Serial
                            3h         ; Refresh
                            1h         ; Retry
                            1w         ; Expire
                            1h )       ; Minimum

            IN      NS      ns.ssoontory.shop.
            IN      MX 10   ns.ssoontory.shop.
    ns      IN      A       10.31.0.102
    web01   IN      A       10.31.0.100
    web02   IN      A       10.31.0.101

     IP LIST (넣는거아님)
    WEB01_SAMBA   10.31.0.101
    WEB02_NFS     10.31.0.100
    DNS_DATABASE  10.31.0.102

       *   대표적인 레코드
    SOA  : 다루는 도메인 버전ㄴㄴㄴ과 업데이트 시간 간격 등의 정보를 저장하는 레코드
    A    : 호스트 이름으로 IPv4 주소를 조회할 때 사용하는 레코드
           예: 호스트 ns.ssoontory.shop의 IPv4 주소는 172.31.0.130
    AAAA : 호스트 이름으로 IPv6 주소를 조회할 때 사용하는 레코드
           예: jprs.jp의 IPv6 주소는 2001:218:3001:7::80
    PTR  : IP 주소로 호스트 이름을 조회할 때 사용하는 레코드
           예: 172.31.0.130의 호스트 이름은 ns.ssoontory.shop
    NS   : DNS 서버의 호스트 이름 혹은 IP 주소를 저장하는 레코드
           예: ssoontory.shop의 DNS 서버는 ns.ssoontory.shop
    MX   : 메일 서버 호스트 이름 혹은 IP 주소를 저장하는 레코드
           예: ssoontory.shop의 메일 서버는 mail.ssoontory.shop
    CNAME: 호스트 이름의 별칭을 저장하는 레코드
           예: www.ssoontory.shop은 ns.ssoontory.shop의 별칭(alias)

     

     

     

    [ ip를 받으면 도메인으로 바꿔주는 파일 ]


    # vi /var/named/0.31.10.in-addr.arpa.db // (0.31.10 : 내부 아이피의 역순)

    $TTL 86400
    @ IN SOA ssoontory.shop. root.ssoontory.shop.(
    2022041401 ; Serial
    3h         ; Refresh
    1h         ; Retry
    1w         ; Expire
                            1h )       ; Minimum
    
    IN NS ns.ssoontory.shop.
    102 IN PTR ns.ssoontory.shop.
    100 IN PTR web01.ssoontory.shop.
    101 IN PTR web02.ssoontory.shop.
    // 전과 달리 web01, web02의 리버스도 넣어줌

     

     

    [ 방화벽 및 IP 설정 ] 


    # systemctl enable --now named
    # firewall-cmd --permanent --add-service=dns
    # firewall-cmd --reload
    # ss -ant (dns = 53번 포트)
    # ip a // ens32 아이피 확인

     


    (NAT 가서)
    # vi /etc/dhcp/dhcpd.conf

    option domain-name-servers 에 10.31.0.102 추가
    // option domain-name-servers 10.31.0.102, 8.8.8.8, 8.8.4.4;


    # systemctl restart dhcpd
    # systemctl status dhcpd


    (각 서버로 도메인 추가되었는지 확인및 설정해주기)


    # cat /etc/resolv.conf // 아직 도메인이 추가안됨
    # systemctl restart NetworkManager
    # cat /etc/resolv.conf // 추가됨

     

    # ping web01.ssoontory.shop // 통신확인

     

     

     

    (NAT 가서)
    # systemctl restart NetworkManager
    # cat /etc/resolv.conf

    NAT는 모든게 스태틱이기 때문에 영향을 안받음(수동으로 해줘야함)
    # vi /etc/sysconfig/network-scripts/ifcfg-ens32

    DNS1=10.31.0.102
    DNS2=8.8.8.8
    DNS3=8.8.4.4



    꼭 내가 만든 DNS가 첫번째야한다. 아니면 구글에서 도메인 검색하게 됨


    # systemctl restart NetworkManager
    # cat /etc/resolv.conf // ㄴㄴ추가됨
    # ping web02.ssoontory.shop // 통신확인


    (그대로 NAT)

    # yum install -y bind-utils
    # dig A web01.ssoontory.shop // 통신 확인
    # dig -x 10.31.0.100 // 통신 역방향 확인


    # dig A web02.ssoontory.shop // 통신 확인
    # dig -x 10.31.0.101 // 통신 역방향 확인

     

     

     

       *    dig - Domain Information Groper

    - dig 명령은 DNS 네임서버 구성과 도메인 설정이 완료된후 일반 사용자의 입장에서 설정한 도메인네임에 대한 DNS 질의응답이 정상적으로 이루어지는지 확인 점검시 사용한다

     

     

    댓글

SSOONTORY Blog.