Contents
(Linux)DNS 서버 설치와 구성
   2022년07월22일     7분정도면 다 읽어요     - Comments

[카카오 클라우드 스쿨] 로컬 DNS 서버를 만들어 보자!

네임 서버 종류!

  • DNS 서비스를 제공하는 서버
    • 캐시 네임 서버
      • 자신이 직접 도메인을 관리하지 않음
      • 루트 도메인 서버(.com 서버 등)에게 질의한 최종 결과를 자신에 캐시에 저장한다
      • 최종 결과를 사용자에게 전달해 준다
      • 이후 동일 주소에 대한 쿼리가 또 있을 경우, 캐시 정보를 확인해서 전달해 줌
    • 마스터 네임 서버
      • test.com, test.co.kr과 같은 도메인을 직접 관리하는 서버임
      • zone 파일이라는 곳에 서브도메인 등을 작성
      • 외부에서 shopping.test.com과 같은 주소로 접속을 희망했을 경우, 서브도메인에 대한 주소를 알려주는 역할을 수행


  • DNS 작동 과정
    • img_39
    • 내부 DNS 서버?
      • shop.test.com, news.test.com 등 요청시 내부 도메인 주소를 알려줌
      • ex) maple.nexon.com, sa.nexon.com 등..
      • img_30


프록시와 비슷하지만 다름

  • img_40



도메인 서버 구성하기 (캐시 네임 서버로 작동)

  • centOS7
    • DNS로 사용할 예정
    • 192.168.1.105
  • centOS8
    • 일반 PC로 사용할 에정
    • 211.183.3.111
  • 즉, centOS7은 캐시 네임 서버로 작동하고, 8.8.8.8로부터 도메인 네임을 전달받아서 건네주게 된다


1 . centOS 8 측의 DNS 서버를 내 주소로 지정한다

  • img_25


  • 내 네임서버 확인해 보기
[root@srv8 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.1.105


  • 이제 네임 서버 주소를 통해서는 접속할 수 없게 됨
[root@srv8 ~]# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=45.8 ms

[root@srv8 ~]# ping www.google.com
ping: www.google.com: Name or service not known


2 . bind-chroot 설치

  • 네임 서버를 구성하기 위해 다음 모듈을 설치한다
    • BIND: DNS를 구현한 소프트웨어
    • chroot: BIND가 작동되는 동안 /var/named/chroot 경로를 ‘/’(최상위 경로)로 지정 가능
yum -y install bind bind-chroot


3 . DNS 서버 config

  • DNS 서버의 config 설정을 진행한다
    • vmware 네트워크 주소 안에 있는 모든 컴퓨터가 네임 서버를 사용할 수 있게 설정했다
[root@srv7 etc]# vi /etc/named.conf
---
        listen-on port 53 { any; };
        listen-on-v6 port 53 { none; };
        allow-query     { any; };

        dnssec-validation no;
---
systemctl restart named
  • Listen-on
    • 해당 포트로 서비스를 제공할 수 있는 상태
    • 3 handshake 이후 세션이 성립(Established) 되면 데이터 요청시 언제든지 줄 수 있는 상태!
    • 이때의 포트, 접속 가능 범위를 지정한다
  • allow-query
    • DNS에 대한 요청, 허용 범위
    • 서버 (test.com)에 대한 주소 요청시 주소를 알려줄 범위
    • 사설 구간에만 쓸 경우 IP를 써도 된다(192.168.1.0/24)
  • 위 두개만 써져 있으면 Cache name server임
  • 하단에 zone을 구성한다면 마스터 네임 서버로 작동시킬 수 있음(내부 DNS)


4 . 구성 완료 후 클라이언트측에서 도메인 이름으로 접속해 보기

  • 성공적으로 접속되는 것을 확인할 수 있음
nslookup www.rapa.or.kr
dig www.rapa.or.kr


5 . nslookup 사용해 보기

  • nslookup
    • 도메인 이름과 IP 주소를 확인할수 있는 툴
    • A타입: 도메인을 바로 알려 줌 (이 경우 .com 서버에서 해당 도메인을 등록해 둔 것)
  • 참고
    • nslookup naver.com => 도메인 서버
    • nslookup www.naver.com => 홈페이지 서버
    • 둘의 주소는 다르다!
[root@srv7 etc]# nslookup nexon.com
Server:		8.8.8.8
Address:	8.8.8.8#53

Non-authoritative answer:
Name:	nexon.com
Address: 52.78.145.30
Name:	nexon.com
Address: 52.78.153.209

[root@srv7 etc]# nslookup www.nexon.com
Server:		8.8.8.8
Address:	8.8.8.8#53

Non-authoritative answer:
Name:	www.nexon.com
Address: 18.64.8.73
Name:	www.nexon.com
Address: 18.64.8.24
Name:	www.nexon.com
Address: 18.64.8.70
Name:	www.nexon.com
Address: 18.64.8.63



로컬 DNS 서버에 내부 도메인 등록하기 (마스터 네임 서버로 작동)

  • 실습 가정상황
    • 우리 회사에 있는 캐시네임 서버 192.168.1.105를 마스터 네임서버로 활용할 계획이다
    • 도메인 주소는 kkikki.com 이다.
    • 내부에 있는 211.183.3.111이 주소창에 www.kkikki.com 이라고 했을 때, 마스터네임서버에서 서비스하고 있는 웹 서비스를 동시에 제공할 수 있어야 한다


1 . zone 파일 등록하기(내부 도메인 등록)

[root@srv7 etc]# vi /etc/named.conf
---맨 하단--
zone "kkikki.com" IN {
        type master;
        file "kkikki.com.db";
        allow-update { none; };
        };
  • img_31
  • ZONE: 자체적으로 도메인을 사용하고 있는 경우 구성해야 하는 부분임(의무)
    • 이 파일을 구성하기 전 DNS 서버의 공인 IP를 도메인 서버 (가비아 등 .com 서버)에 등록해야 함
    • gildong.com: 도메인 이름
    • IN: internet-class (인 아웃이 아님)
    • type:master: 마스터 서버이다
    • file: kikki.com에 DB에 저장되어 있다
    • update: 슬레이브 DNS 서버에 업데이터(동기화) 해 주겠다
  • 여러 개의 Zone을 구성할 수 있다
  • zone-file은 “/var/named” 에 구성되어 있다


  • 오타가 없는지 확인(무반응이면 오타 없는 것)
[root@srv7 etc]# named-checkconf

  • Master의 존 파일 업데이트 완료


2 . 일반적인 Zone 파일 작성하기

  • 마스터에 존 파일을 업데이트 했다면, 슬레이브에 업데이트를 실행여부를 지정 가능
    • (마스터: 주 서버. 슬레이브: 동기화되는 부 서버)
    • www.kkikki.com -> 내 아이피(105)의 httpd로 접속되게끔 함
    • hr.kkikki.com -> 다른 학우(101)의 httpd로 접속되게끔 함
    • shop.kkikki.com -> 강사님(199)의 httpd로 접속되게끔 함
[root@srv7 named]# cd /var/named
[root@srv7 named]# touch kkikki.com.db
[root@srv7 named]# vi kkikki.com.db
---
$TTL            3H
@       SOA     @       root.   ( 2 1D 1H 1W 1H )
        IN      NS      @
        IN      A       192.168.1.105


www     IN      A       192.168.1.105

shop    IN      A       192.168.1.199
hr      IN      A       192.168.1.101
  • TTL 3H: IP를 캐시에 세 시간동안만 저장한다 (캐시 - hosts 파일 - DNS 서버)
  • @: 도메인 이름 자체를 의미(kkikki.com)
  • root: kkikki.com을 관리하는 최상위 서버
  • SOA: 권한 시작
    • 2: Serial
      • 자신이 slave 인 경우, master의 serial 보다 높다면, master에게 업데이트된 정보를 요청한다
      • 일반적으로 날짜, 시간 등을 이용해서 작성한다
    • 1D: 2차 네임서버가 1차 네임서버에 접속하는 시간
      • slave가 실시간으로 mater에게 접속할 필요는 없음
      • 하루에 한번만 master에 접속해 serial을 비교하겠다는 의미
    • 1H: 접속 실패 시, 재접속하는 간격
      • 1D 접속 실패시, 1H 간격으로 다시 시도한다
    • 1W: 마스터가 죽었을 때의 처리
      • 1차 네임 서버에 데이터가 없다면, 1주일 뒤 삭제한다
      • 마스터가 죽어도 1주일 동안은 계속 서비스를 하겠다고 설정
    • 1H: TTL
      • 만약 마스터로부터 정보를 쿼리한 뒤 받았다면 1시간 동안 보관한다
      • 상단에 @ TTL 3H가 우선시되며, 없을 경우 이 시간이 TTL임
      • 따라서 캐시에 저장하는 시간은 3H


  • www, shop, hr 등 서브 도메인
    • IN: 인터넷
    • NS: name server
    • A: 도메인에 대한 IP 정보
    • CNAME: 도메인에 대한 별칭, 주로 한 개의 도메인에 여러 정보를 연결해서 사용할 때 사용
      • ex) IN NS @ : 내가 kkikki.com의 네임 서버이다(kkikki.com)
      • ex) www IN A 192.169.1.199: kkikki.com의 네임 서버 주소는 이와 같다
      • ex) shop IN A 192.169.1.200: kkikki.com의 하위 네임 서버 주소는 이와 같다


3 . 로드밸런서를 구성할 경우의 zone 파일 구성하기

www     IN      CNAME     websrv.kkikki.com
websrv  100     IN        A                 1.1.1.1 (사실상
websrv  200     IN        A                 1.1.1.3  로드밸런서의
websrv  300     IN        A                 1.1.1.4  주소)
  • 사용자가 서버에 대해 요청을 했을 때, 처음 들어오는 사용자에 대해 각각 다르게 (1.1.1.1, 1.1.1.3.. )보내겠다
    • 100, 200, 300은 그냥 순서 정도에 불과함
  • 여담
    • anycast 라는 방법을 사용하면, 동일 주소에 대하여 물리 서버를 두대 이상 구성하고, 가까운 거리에 있는 사람들은 자신과 가까운 서버로 접속하게 된다
    • 제주도민들은 가까운 사람은 제주 데이터 센터로 우선 연결되게 할 수 있는 것
    • IPv6에서는 broadcast라는 개념이 사라졌다. 이를 해결하기 위한 용도로 anycast를 사용하기도 함


4 . ifconfig DNS 설정

  • 서버측에서, 자신의 도메인 (kkikki.com)에 접속하기 위함
    • DNS1=127.0.0.1 (로컬) 을 추가한다
    • 로컬에 없는 경우 DNS2(8.8.8.8)에서 쿼리한다
[root@srv7 named]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
---
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
DNS1=127.0.0.1
DNS2=8.8.8.8
IPADDR=192.168.1.105
PREFIX=24
GATEWAY=192.168.1.1


5 . 서비스 재시작

[root@srv7 named]# systemctl restart named
[root@srv7 named]# systemctl restart network
[root@srv7 named]# systemctl restart httpd


6 . 결과

  • 이제 클라이언트측에서 접속해 보자
    • var/named/kkikki.com.db 파일에 다른 서버를 클라이언트에 알려 주었으므로, 다음을 확인할 수 있음
      • 강사님 페이지(shop.kkikki.com)
      • img_26
      • 내 페이지(www.kkikki.com)
      • img_27
      • 다른 학우의 페이지(hr.kkikki.com)
      • img_28



DNS + Proxy를 같이 구성한다면?

  • 프록시?
    • Web proxy는 웹 서버의 내용을 캐시에 담고, 이를 클라이언트에 전달한다
    • 이후 동일 사이트 접속 시도시 캐시에 있는 내용을 LAN에서 전달하므로, 속도가 빠르다


  • 다음과 같이 구성해 볼 수 있겠다(DNS + 프록시)
    • img_41
    • 서버 내부의 DNS는 내부에서 밖으로 나갈 때 캐시 네임 서버로 작동하고
    • 외부에서 내부로 접속할 떄에는 마스터 네임 서버로 작동하낟
    • proxy를 두어 외부로 접속할 때 속도를 올릴 수 있다(DNS와 별개)



DNS 총 정리 노트

  • 이제 이 그림이 이해가 될 것이다
  • img_43