ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • LINUX DNS(캐싱전용)서버 구축하기
    System of Infra/Linux System 2022. 6. 20. 23:57
    반응형

    LINUX 로고이미지

    LINUX DNS(캐싱전용)서버 구축하기

    [root@localhost /]# cat /etc/nsswitch.conf | grep -i hosts
    #     hosts: files dns
    #     hosts: files dns  # from user file
    hosts:      files dns myhostname
    /etc/hosts.conf order hosts, bind(nameserver) - hosts  파일에서 우선순위
    1. files
    2. dns
    3. hostname

    /etc/resolv.conf(nameserver) - DNS Name 서버 주소 등록
    192.168.111.100  - DNS 서버
    192.168.111.130  - DNS를 테스트할 Client서버
    192.168.111.200  - DNS를 테스트할 CLI기반 Client서버
    [root@localhost /]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 00:0c:29:e7:47:fb brd ff:ff:ff:ff:ff:ff
        inet 192.168.111.100/24 brd 192.168.111.255 scope global noprefixroute ens160
           valid_lft forever preferred_lft forever
        inet6 fe80::4beb:7287:7a69:cde2/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
    ▶ DNS Named 서버로 사용할 서버를 준비하도록 합니다. IP: 192.168.111.100/24
    [root@localhost /]# dnf -y install bind-chroot
    CentOS-8 - AppStream                                                    2.5 kB/s | 4.3 kB     00:01    
    CentOS-8 - Base                                                         2.4 kB/s | 3.9 kB     00:01    
    CentOS-8 - PowerTools                                                   2.6 kB/s | 4.3 kB     00:01    
    CentOS-8 - Plus                                                         1.8 kB/s | 3.0 kB     00:01    
    CentOS-8 - Extras                                                       934  B/s | 1.5 kB     00:01    
    Extra Packages for Enterprise Linux 8 - x86_64                          5.9 kB/s | 8.0 kB     00:01    
    Extra Packages for Enterprise Linux 8 - x86_64                           45 kB/s |  11 MB     04:14    
    종속성이 해결되었습니다.
    ========================================================================================================
     꾸러미                   아키텍처         버전                               리포지토리           크기
    ========================================================================================================
    Installing:
     bind-chroot              x86_64           32:9.11.4-17.P2.el8_0.1            AppStream           100 k
    Upgrading:
     bind-libs                x86_64           32:9.11.4-17.P2.el8_0.1            AppStream           169 k
     bind-libs-lite           x86_64           32:9.11.4-17.P2.el8_0.1            AppStream           1.1 M
     bind-license             noarch           32:9.11.4-17.P2.el8_0.1            AppStream            98 k
     bind-utils               x86_64           32:9.11.4-17.P2.el8_0.1            AppStream           433 k
     python3-bind             noarch           32:9.11.4-17.P2.el8_0.1            AppStream           145 k
    종속성 설치:
     bind                     x86_64           32:9.11.4-17.P2.el8_0.1            AppStream           2.1 M
    
    거래 요약
    ========================================================================================================
    설치        2 꾸러미
    업그레이드  5 꾸러미
    
    총 다운로드 크기 : 4.2 M
    패키지 다운로드중:
    (1/7): bind-chroot-9.11.4-17.P2.el8_0.1.x86_64.rpm                       50 kB/s | 100 kB     00:02    
    (2/7): bind-libs-9.11.4-17.P2.el8_0.1.x86_64.rpm                         78 kB/s | 169 kB     00:02    
    (3/7): bind-license-9.11.4-17.P2.el8_0.1.noarch.rpm                     293 kB/s |  98 kB     00:00    
    (4/7): bind-utils-9.11.4-17.P2.el8_0.1.x86_64.rpm                       863 kB/s | 433 kB     00:00    
    (5/7): python3-bind-9.11.4-17.P2.el8_0.1.noarch.rpm                     468 kB/s | 145 kB     00:00    
    (6/7): bind-libs-lite-9.11.4-17.P2.el8_0.1.x86_64.rpm                    87 kB/s | 1.1 MB     00:13    
    (7/7): bind-9.11.4-17.P2.el8_0.1.x86_64.rpm                              62 kB/s | 2.1 MB     00:35    
    --------------------------------------------------------------------------------------------------------
    ...(생략)
    
    업그레이드 됨:
      bind-libs-32:9.11.4-17.P2.el8_0.1.x86_64          bind-libs-lite-32:9.11.4-17.P2.el8_0.1.x86_64      
      bind-license-32:9.11.4-17.P2.el8_0.1.noarch       bind-utils-32:9.11.4-17.P2.el8_0.1.x86_64          
      python3-bind-32:9.11.4-17.P2.el8_0.1.noarch      
    
    설치됨:
      bind-chroot-32:9.11.4-17.P2.el8_0.1.x86_64             bind-32:9.11.4-17.P2.el8_0.1.x86_64            
    
    완료되었습니다!
    ▶ 캐싱 전용 Named 서버 구성을 위해서 패키지를 설치하도록 합니다. 패키지명:  bind-chroot
    [root@localhost /]# vi /etc/named.conf
     1 //
          2 // named.conf
          3 //
          4 // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
          5 // server as a caching only nameserver (as a localhost DNS resolver only).
          6 //
          7 // See /usr/share/doc/bind*/sample/ for example named configuration files.
          8 //
          9 
         10 options {
         11         listen-on port 53 { any; };
         12         listen-on-v6 port 53 { none; };
         13         directory       "/var/named";
         14         dump-file       "/var/named/data/cache_dump.db";
         15         statistics-file "/var/named/data/named_stats.txt";
         16         memstatistics-file "/var/named/data/named_mem_stats.txt";
         17         secroots-file   "/var/named/data/named.secroots";
         18         recursing-file  "/var/named/data/named.recursing";
         19         allow-query     { any; };
         20 
         21         /*
         22          - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         23          - If you are building a RECURSIVE (caching) DNS server, you need to enable
         24            recursion.
         25          - If your recursive DNS server has a public IP address, you MUST enable access
         26            control to limit queries to your legitimate users. Failing to do so will
         27            cause your server to become part of large scale DNS amplification
         28            attacks. Implementing BCP38 within your network would greatly
         29            reduce such attack surface
         30         */
         31         recursion yes;
         32 
         33         dnssec-enable yes;
         34         dnssec-validation no;
         35 
         36         managed-keys-directory "/var/named/dynamic";
         37 
         38         pid-file "/run/named/named.pid";
         39         session-keyfile "/run/named/session.key";
         40 
         41         /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
         42         include "/etc/crypto-policies/back-ends/bind.config";
    ▶ /etc/named.conf 파일에서 해당 라인의 설정 파일을 변경해주도록 합니다.

    ★/etc/named.conf 수정 파일
    11번행 listen-on port 53 { 127.0.0.1; }; -> any(변경)
    12번행 listen-on-v6 port 53 { ::1; }; -> none(변경)
    19번행 allow-query { localhost; }; -> any(변경)
    34번행 dnssec-validation yes; -> no(변경)
    [root@localhost /]# systemctl restart named
    
    [root@localhost /]# systemctl enable named
    Created symlink /etc/systemd/system/multi-user.target.wants/named.service → /usr/lib/systemd/system/named.service.
    
    [root@localhost /]# systemctl status named
    ● named.service - Berkeley Internet Name Domain (DNS)
       Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor preset: disabled)
       Active: active (running) since Sat 2022-05-21 19:33:19 KST; 13s ago
     Main PID: 49196 (named)
        Tasks: 4 (limit: 11376)
       Memory: 55.6M
       CGroup: /system.slice/named.service
               └─49196 /usr/sbin/named -u named -c /etc/named.conf
     ...(생략)          
     5월 21 19:33:19 localhost.localdomain named[49196]: network unreachable resolving './DNSKEY/IN': 2001:>
     5월 21 19:33:19 localhost.localdomain named[49196]: network unreachable resolving './NS/IN': 2001:500:>
     5월 21 19:33:19 localhost.localdomain named[49196]: managed-keys-zone: Key 20326 for zone . acceptance>
     5월 21 19:33:19 localhost.localdomain named[49196]: resolver priming query complete
    ▶ /etc/named.conf 파일을 수정했으니 데몬을 재기동합니다. 추가적으로 서버 재기동 후에도 데몬이 재기동될 수 있도록 enable 설정을 하도록 합니다. 데몬을 재기동 완료하면 정상적으로 기동이 되어 있는지 확인하기 위해서 status 상태를 확인하도록 합니다.
    root@localhost /]# firewall-cmd --add-service=dns
    success
    
    [root@localhost /]# firewall-cmd --permanent --add-service=dns
    success
    
    [root@localhost /]# firewall-cmd --reload
    success
    
    [root@localhost /]# systemctl restart firewalld
    ▶ DNS 설정을 완료하였다면 해당 포트를 사용하기 위해서 방화벽에서 DNS 서비스를 활성화시켜주어야 합니다.  활성화가 완료되었다면 영구적으로 적용시키기 위해서 permanent 옵션을 사용하고 reload를 통해서 저장을 해주도록 합니다.
    마지막으로 방화벽의 데몬을 재기동합니다.
    [root@localhost /]# firewall-cmd --list-all
    public (active)
      target: default
      icmp-block-inversion: no
      interfaces: ens160
      sources: 
      services: cockpit dhcpv6-client dns ssh telnet
      ports: 3389/tcp
      protocols: 
      masquerade: no
      forward-ports: 
      source-ports: 
      icmp-blocks: 
      rich rules: 
    	
    [root@localhost /]# systemctl status firewalld
    ● firewalld.service - firewalld - dynamic firewall daemon
       Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
       Active: active (running) since Sat 2022-05-21 19:38:15 KST; 25s ago
         Docs: man:firewalld(1)
     Main PID: 49783 (firewalld)
        Tasks: 2 (limit: 11376)
       Memory: 24.0M
       CGroup: /system.slice/firewalld.service
               └─49783 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid
    ▶ 위에서 언급한 내용들이 올바르게 설정되어 있는지 확인하기 위해서 firewall-cmd --list-all을 통해서 현재 services 리스트에 dns가 추가된 것을 확인할 수 있고 방화벽의 데몬 상태로 active 상태로 설정이 올바르게 된 것을 확인할 수 있습니다.
    [root@localhost /]# dig @192.168.111.100 www.naver.com
    
    ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-17.P2.el8_0.1 <<>> @192.168.111.100 www.naver.com
    ; (1 server found)
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54276
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 3, ADDITIONAL: 4
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ; COOKIE: 0f42e43ce68ecae3459920c86288c18742fb6cf2dc8c6ab4 (good)
    ;; QUESTION SECTION:
    ;www.naver.com.			IN	A
    
    ;; ANSWER SECTION:
    www.naver.com.		21600	IN	CNAME	www.naver.com.nheos.com.
    www.naver.com.nheos.com. 180	IN	A	223.130.195.95
    www.naver.com.nheos.com. 180	IN	A	223.130.195.200
    
    ;; AUTHORITY SECTION:
    nheos.com.		172800	IN	NS	gns2.nheos.com.
    nheos.com.		172800	IN	NS	gns3.nheos.com.
    nheos.com.		172800	IN	NS	gns1.nheos.com.
    
    ;; ADDITIONAL SECTION:
    gns1.nheos.com.		172800	IN	A	103.6.174.86
    gns2.nheos.com.		172800	IN	A	210.89.165.22
    gns3.nheos.com.		172800	IN	A	125.209.246.230
    
    ;; Query time: 580 msec
    ;; SERVER: 192.168.111.100#53(192.168.111.100)
    ;; WHEN: 토  5월 21 19:40:07 KST 2022
    ;; MSG SIZE  rcvd: 241
    ▶ DNS 서버 구축 시 일반적으로 내부 DNS 서버와 외부 DNS 서버를 구축하게 되는데 /etc/named 파일과 방화벽 설정이 완료가 됐다면 DNS 서버가 정상적으로 도메인 주소를 외부와 통신하여 가져올 수 있는지 확인을 할 수 있습니다.
    dig @[로컬 IP] [도메인 주소] = dig @192.168.111.100 www.naver.com 수행 시 위와 같이 IN 허용 정책에 대한 정보를 확인할 수 있습니다.
    [root@localhost /]# nslookup
    > server 
    Default server: 192.168.111.2
    Address: 192.168.111.2#53
    > server 192.168.111.100
    Default server: 192.168.111.100
    Address: 192.168.111.100#53
    > www.naver.com
    Server:		192.168.111.100
    Address:	192.168.111.100#53
    
    Non-authoritative answer:
    www.naver.com	canonical name = www.naver.com.nheos.com.
    Name:	www.naver.com.nheos.com
    Address: 223.130.195.200
    Name:	www.naver.com.nheos.com
    Address: 223.130.195.95
    ▶ 현재 Named 서버로 지정되어 있는 아이피는 nslookup 수행 시 192.168.111.100으로 지정되어 있고 해당 dns서버가 www.naver.com 네이버 주소의 아이피를 확인할 수 있습니다.
    [root@localhost /]#vi /etc/resolv.conf
    # Generated by NetworkManager
    nameserver 192.168.111.100
    ▶ /etc/resolv.conf 파일에 네임서버로 사용할 아이피를 지정합니다. 현재 서버 자기 자신이 네임서버가 되기 때문에 nameserver 192.168.111.100으로 지정합니다.
    [root@localhost /]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 00:0c:29:20:71:88 brd ff:ff:ff:ff:ff:ff
        inet 192.168.111.130/24 brd 192.168.111.255 scope global dynamic noprefixroute ens160
           valid_lft 1698sec preferred_lft 1698sec
        inet6 fe80::ec0a:3af4:3a46:1197/64 scope link noprefixroute 
           valid_lft forever preferred_lft forever
    ▶ DNS 서버가 구축이 되었다면 DNS를 통해서 주소를 확인할 수 있는 Client서버를 구축하기 위해서 192.168.111.130 아이피의 리눅스 서버 한대를 준비합니다.
    [root@localhost /]# vi /etc/resolv.conf
    # Generated by NetworkManager
    search localdomain
    nameserver 192.168.111.100
    ▶ Client서버에서 도메인의 주소를 알려줘야 할 DNS 서버를 등록하기 위해서 192.168.111.100 DNS 서버를 지정합니다.
    [root@localhost /]# nslookup
    > server
    Default server: 192.168.111.100
    Address: 192.168.111.100#53
    > www.naver.com
    Server:		192.168.111.100
    Address:	192.168.111.100#53
    
    Non-authoritative answer:
    www.naver.com	canonical name = www.naver.com.nheos.com.
    Name:	www.naver.com.nheos.com
    Address: 223.130.195.95
    Name:	www.naver.com.nheos.com
    Address: 223.130.195.200
    ▶ Client서버에서 DNS서버를 지정했다면 올바르게 192.168.111.100번을 통해서 작동하는지 확인을 합니다. nslookup을 통해서 Default로 지정되어 있는 아이피가 192.168.111.100번으로 작동되는지 확인을 하게 되면  해당 DNS 서버가 네이버 주소를 Client에게 알려주게 됩니다.

     네이버주소: 223.130.195.95, 223.130.165.200 두 개의 서버 아이피를 사용하고 있음. 

     

    LINUX 이미지1

    ▶ Client서버에서 네이버 주소를 통해 네이버 웹페이지가 작동되는 것을 확인할 수 있습니다.

     

    LINUX 이미지2

    ▶ CLI기반의 Client서버를 통해서도 DNS를 참조할 수 있도록 확인합니다. 위의 설정과 동일하게 설정 테스트

     

    LINUX 이미지3

    ▶ CLI기반의 Client 리눅스 서버에서는 GUI를 제공하지 않기 때문에 elinks라는 패키지를 통해서 텍스트 기반의 웹페이지를 확인할 수 있습니다. dnf -y install elinks 명령어를 통해서 해당 패키지를 설치해주도록 합니다.

     

    LINUX 이미지4

    ▶ elinks의 패키지 설치가 완료되었다면 elink 명령어를 수행하게 되면 위와 같이 웹 URL를 확인할 수 있는 검색 창이 출력되게 됩니다. 간단하게 레드햇 홈페이지를 DNS 서버에 요청하여 정상적으로 불러오는지 확인합니다.

     

    LINUX 이미지5

    ▶ 텍스트 기반의 WEB 페이지 형태라서 그런지 깔끔한 형태는 아니지만 정상적으로 레드햇 웹페이지를 가져올 수 있는 것을 확인할 수 있습니다.

     

     

    PS. 포스팅의 내용은 제 기준으로 작성한 것이기 때문에 참고해서 보시면 감사하겠습니다.

    포스팅 과정의 오류 및 오타 그리고 궁금한 점에 대해서는 댓글 남겨주세요.

    반응형

    댓글

Designed by Tistory.