본문 바로가기
IT/Linux

[Linux] DNS / DNS이중화

by Archiver Jun 2026. 1. 20.

1. DNS의 기본 개념

DNS의 역할

  • 정방향 조회(Forward Lookup): 도메인 이름을 IP 주소로 변환한다. (예: google.com  8.8.8.8)
  • 역방향 조회(Reverse Lookup): IP 주소를 도메인 이름으로 변환한다. (예: 8.8.8.8  google.com)

DNS 동작 원리

사용자가 웹 브라우저에 주소를 입력하면, PC는 먼저 설정된 DNS 서버에 물어보고, 서버는 자신의 Zone File을 확인하여 답을 줌.

 

2. DNS 서버 설치 및 기본 환경 설정 (BIND)

리눅스에서 가장 표준적으로 사용하는 DNS 패키지는 BIND(Berkeley Internet Name Domain)이다.

 

1) 패키지설치

# BIND 패키지 설치
dnf install -y bind bind-utils

 

2) 핵심 설정 파일 1: /etc/named.conf (DNS 서버의 전체적인 동작 방식을 결정하는 파일)

vi /etc/named.conf
 ----------------------------------------
 :se nu
11         listen-on port 53 { any; }; 	 → 서버의 모든 IP에서 53번 포트로 대기
19         allow-query     { any; };	 → 누구나 이 DNS 서버에 질의할 수 있도록 허용
#recursion	yes; 자신이 모르는 주소는 다른 상위 서버에 물어봄
:wq
-----------------------------------------

 

3. 존(Zone) 정의 및 레코드 설정

도메인에 대한 실제 정보를 담고 있는 구역(Zone)을 정의해야 한다.

 

핵심 설정 파일 2: /etc/named.rfc1912.zones

내가 관리할 도메인(jhlim.local)을 등록합니다

zone "jhlim.local" IN {
    type master;
    file "jhlim.local.zone";  # 실제 데이터가 담길 파일 이름
    allow-update { none; };
};

 

핵심 설정 파일 3: 존 파일 (/var/named/jhlim.local.zone)

실제 도메인과 IP를 매핑하는 파일. named.ca named.localhost 파일을 복사해서 사용하면 편리하다.

$TTL 3H
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        IN NS   ns.jhlim.local.         ; 네임 서버 지정
        IN A    10.0.0.21               ; 서버 본체 IP
ns      IN A    10.0.0.21               ; ns.jhlim.local의 IP
www     IN A    10.0.0.21               ; www.jhlim.local의 IP

 

 

4. 서비스 실행 및 검증

서비스 시작 및 권한 설정

DNS 설정 파일은 보안상 소유권이 중요하다.

# 파일 소유권을 named 그룹으로 변경 (중요!)
chown :named /var/named/jhlim.local.zone

# 설정 파일 문법 체크
named-checkconf /etc/named.conf
named-checkzone jhlim.local /var/named/jhlim.local.zone

# 서비스 시작
systemctl enable --now named
firewall-cmd --permanent --add-service=dns
firewall-cmd --reload

 

클라이언트 검증

Windows나 다른 Linux 클라이언트에서 DNS 주소를 방금 만든 서버 IP로 바꾼 뒤 확인한다.

# nslookup 명령어로 도메인 조회 확인
nslookup www.jhlim.local

 


 

Linux DNS 서버 이중화 구성 (Master & Slave)

1. 서비스 설치 및 공통 설정 (/etc/named.conf)

주 DNS와 보조 DNS 서버 모두 동일하게 패키지를 설치하고 외부 접속을 허용해야 한다.

# BIND 패키지 설치
dnf install -y bind bind-utils bind-libs

# 메인 설정 수정
vi /etc/named.conf
11  listen-on port 53 { any; };   # 모든 IP에서 DNS 서비스 대기
19  allow-query     { any; };   # 모든 클라이언트의 질의 허용

 

2. 주(Master) DNS 서버 설정

2.1 존(Zone) 정의 (/etc/named.rfc1912.zones)

정방향(jhlim.local)과 역방향(0.0.10.in-addr.arpa) 영역을 정의한다.

  • Tip: :23,27co$ 명령어로 기존 예제를 복사해 수정하면 오타를 줄일 수 있다.
zone "jhlim.local" IN {
    type master;
    file "1";                   # 정방향 데이터 파일명
    allow-update { none; };
};

zone "0.0.10.in-addr.arpa" IN {
    type master;
    file "2";                   # 역방향 데이터 파일명
    allow-update { none; };
};

 

2.2 레코드 설정 (Zone Files)

/var/named 디렉터리에 샘플 파일을 복사하여 실제 데이터를 입력한다.

  • cp /var/named/{named.localhost,1} / cp /var/named/{named.loopback,2}
 ls /var/named
 cp /var/named/{named.localhost,1}   →  정방향조회 영역 파일 복사
 cp /var/named/{named.loopback,2}    →  역방향조회 영역 파일 복사
 ls /var/named/

 

  • 정방향(file "1"): 도메인 → IP 매핑 (A 레코드, MX 레코드 등)
    • A: 도메인 이름 접속 / www A: 웹 서버 / ns1~3 A: 네임서버 주소 지정
vi /var/named/1                   → 정방향조회 설정
-----------------------------------------------------------
$TTL 1D
@       IN SOA  ns1.jhlim.local. web. (
                                        2       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      ns1.jhlim.local.
        NS      ns2.jhlim.local.
        NS      ns3.jhlim.local.
        MX 10   mx1.jhlim.local.        → 10은 우선순위 숫자
        A       10.0.0.11
        A       10.0.0.12                  → 앞의 공백은 도메인 이름으로만 접속
        A       10.0.0.13
www     A       10.0.0.11
www     A       10.0.0.12         → www로 시작하는 도메인 접속 
www     A       10.0.0.13
ftp     A       10.0.0.13
ns1     A       10.0.0.11        → ip를 지정할 힘이 없어 ns는 반드시 지정해줘야함
ns2     A       10.0.0.12
ns3     A       10.0.0.13
mx1     A       10.0.0.13
:wq
-----------------------------------------------------------

 

  • 역방향(file "2"): IP → 도메인 매핑 (PTR 레코드)
    • 11 PTR ns1.jhlim.local.: 끝자리 IP(11)를 도메인에 매핑
vi /var/named/2   → 역방향조회설정
-------------------------------------------------
$TTL 1D
@       IN SOA  ns1.jhlim.local. web. (
                                        2       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      ns1.jhlim.local.
        NS      ns2.jhlim.local.
        NS      ns3.jhlim.local.

11      PTR     ns1.jhlim.local.
12      PTR     ns2.jhlim.local.
13      PTR     ns3.jhlim.local.
:wq
-------------------------------------------------

 

3. 보조(Slave) DNS 서버 설정

주 서버에 문제가 생겼을 때 중단 없는 서비스를 제공하기 위한 이중화 단계이다.

  • 설정 파일 수정 (/etc/named.rfc1912.zones):
    • type slave;로 지정하여 데이터를 읽어오도록 설정한다.
    • masters { 주_DNS_IP; };: 주 서버의 IP를 지정하여 존 파일을 전송받는다.
dnf install -y bind bind-utils bind-libs

vi /etc/named.conf
-------------------------------------------
11         listen-on port 53 { any; }; 
19         allow-query     { any; };
--------------------------------------------

 

vi /etc/named.rfc1912.zones
------------------------------------------------------------------
:23,27co$
:41,45co$
     46 zone "jhlim.local" IN {
     47         type slave;
     48         file "1";
     49         masters { none; };         → 정방향 (none에 업데이트 받을 ip주소 입력)
     50 };
     51 zone "0.0.10.in-addr.arpa" IN {
     52         type slave;
     53         file "2";
     54         masters { none; };        → 역방향 (none에 업데이트 받을 ip주소 입력)
     55 }; ip마다 ;을 작성해야함
:wq
---------------------------------------------------------------

 

# 파일 권한 추가 (기타 사용자가 읽을 수 있도록)
chmod o+r /var/named/{1,2}

# 방화벽 허용 (DNS는 TCP/UDP 모두 사용)
firewall-cmd --permanent --add-port=53/{udp,tcp}
firewall-cmd --reload

# 서비스 실행
systemctl enable --now named



5. 최종 검증 (Windows 10 클라이언트)

  1. 네트워크 설정: 제어판에서 기본 DNS 주소를 주 서버 IP로, 보조 DNS 주소를 보조 서버 IP로 수동 설정한다.
  2. nslookup 확인:
    • nslookup www.jhlim.local -> 설정한 IP(예시10.0.0.11, 12, 13)가 나오는지 확인.
    • nslookup 10.0.0.11 -> 역방향 조회가 정상인지 확인.

 


DNS 심화: 동작 원리와 계층 구조

사용자가 http://www.bank.kr을 브라우저에 입력했을 때, 전 세계 DNS 시스템은 아래와 같은 순서로 IP 주소를 찾아낸다.

1. DNS 캐싱 (Cache)

  • 정의: 이전에 한 번이라도 서비스(조회)했던 도메인 정보를 메모리에 임시로 저장해 두는 기능.
  • 장점: 똑같은 주소를 다시 물어봤을 때, 전 세계 서버를 돌아다닐 필요 없이 즉시 응답하므로 속도가 비약적으로 빠릅니다.

2. /etc/hosts 파일 (가장 먼저 확인)

DNS 서버에 물어보기 전, 컴퓨터가 가장 먼저 들여다보는 로컬 전화번호부이다.

  • 리눅스 경로: /etc/hosts
  • 윈도우 경로: C:\Windows\System32\drivers\etc\hosts
  • 특징: 여기에 IP와 도메인을 적어두면 DNS 서버 설정보다 우선순위가 높다. (테스트나 개발 시 유용)

3. DNS 질의 흐름 (www.bank.kr 접속 시)

공공 DNS(Public DNS, 예: 8.8.8.8)가 주소를 찾는 과정은 계층적 구조를 따라 내려간다.

  1. Public DNS 캐시 확인: 이전에 누군가 bank.kr을 찾은 적이 있는지 확인합니다. 있으면 즉시 응답
  2. Root DNS 서버 (뿌리): 캐시에 없다면, 전 세계 DNS의 정점인 Root DNS에게 물어본 후 Root는 "나는 모르지만, .kr 담당자 주소는 알아"라며 kr DNS를 안내합니다.
  3. kr DNS 서버 (TLD): .kr 관리 서버에 물어봅니다. "나는 모르지만, bank.kr을 직접 관리하는 서버 IP는 알아"라며 해당 서버로 보낸다.
  4. bank.kr DNS 서버 (Authoritative): 드디어 주인을 만났습니다. 이 서버가 www.bank.kr의 실제 IP 주소를 알려줍니다.
  5. 응답 및 캐싱: Public DNS는 이 주소를 사용자에게 알려줌과 동시에, 다음 사용자를 위해 자신의 캐시(Cache)에 저장합니다.
반응형