본문 바로가기

DNS 서버 구축 및 관리 완벽 가이드

액트 2025. 5. 16.
반응형

1. DNS 서버란 무엇인가요?

DNS 서버는 도메인 이름(Domain Name)IP 주소로 변환하는 역할을 합니다.
예를 들어, www.google.com 같은 도메인 이름을 142.250.207.110 같은 숫자 IP로 바꿔줍니다.
DNS 덕분에 우리는 복잡한 IP 대신 도메인 이름으로 웹사이트에 접속할 수 있습니다.

DNS의 주요 역할

  • 도메인 이름을 IP 주소로 변환
  • 역방향 조회(PTR 레코드): IP 주소를 도메인 이름으로 변환
  • 도메인 관리 및 서비스 제공: 웹 서버, 메일 서버 등의 IP 매핑

DNS의 주요 작동 원리

DNS는 계층 구조를 가지며, 도메인 이름을 IP 주소로 변환하기 위해 여러 서버를 거쳐 질의를 처리합니다.

1-1. 도메인 이름 구조

도메인 이름은 점(.)으로 구분되는 계층 구조를 가집니다. 예를 들어:

www.example.com
  • Root (.): 최상위 도메인 구분자
  • Top-Level Domain (TLD): com, org, net 등
  • Second-Level Domain (SLD): example
  • Subdomain: www

1-2. DNS 작동 과정

DNS의 작동 과정은 다음과 같습니다:

  1. 사용자 요청 (DNS Query)
    • 사용자가 브라우저에 도메인 입력: www.example.com
  2. 로컬 DNS 서버 질의 (Recursive Resolver) - (기업에선 사내DNS서버)
    • 브라우저는 우선 로컬 DNS 캐시를 확인하고, 없다면 ISP의 DNS 서버로 질의합니다.
  3. 루트 네임서버 요청 (Root Name Server)
    • 로컬 DNS 서버는 먼저 루트 네임서버에 질의하여 com에 대한 TLD 네임서버 주소를 받습니다.
  4. TLD 네임서버 요청
    • 루트 네임서버가 알려준 com TLD 네임서버에 example.com에 대한 권한 네임서버 주소를 요청합니다.
  5. 권한 네임서버 요청 (Authoritative Name Server)
    • TLD 네임서버로부터 example.com의 권한 네임서버 주소를 받고, 해당 서버에 www 서브도메인의 IP 주소를 요청합니다.
  6. IP 주소 응답 및 캐싱
    • 권한 네임서버로부터 IP 주소를 받고, 로컬 DNS 서버는 해당 정보를 캐시에 저장하여 응답 속도를 향상시킵니다.
    • 브라우저는 받은 IP로 웹 서버에 접속하여 웹 페이지를 가져옵니다.

루트 네임서버란?

루트 네임서버(Root Name Server)는 인터넷 DNS 계층 구조의 최상위에 있는 서버로, 전 세계에 13개의 루트 네임서버 세트가 존재합니다(물리적 서버 수는 더 많음).
이들은 도메인의 최상위 수준인 루트 영역(.)을 관리하며, TLD 네임서버(.com, .net, .org 등)의 IP 주소를 반환하는 역할을 합니다.

루트 네임서버 목록

루트 네임서버는 다음과 같은 이름으로 구분됩니다:

  • a.root-servers.net부터 m.root-servers.net까지 13개
  • 각각 서로 다른 조직에서 관리하며, IP 주소가 고정되어 있습니다.

Linux에서 루트 네임서버 확인 방법

Linux 서버에서는 루트 네임서버를 설정 파일이나 명령어를 통해 확인할 수 있습니다.

루트 힌트 파일 확인

BIND 같은 DNS 서버 소프트웨어를 사용할 경우, 루트 힌트 파일에 루트 네임서버 목록이 있습니다.
BIND의 기본 루트 힌트 파일 위치:

/etc/named.root 또는 /var/named/named.ca

루트 네임서버 IP 확인

a.root-servers.net.     518400  IN      A       198.41.0.4
b.root-servers.net.     518400  IN      A       199.9.14.201
c.root-servers.net.     518400  IN      A       192.33.4.12
d.root-servers.net.     518400  IN      A       199.7.91.13
e.root-servers.net.     518400  IN      A       192.203.230.10
f.root-servers.net.     518400  IN      A       192.5.5.241
g.root-servers.net.     518400  IN      A       192.112.36.4
h.root-servers.net.     518400  IN      A       198.97.190.53
i.root-servers.net.     518400  IN      A       192.36.148.17
j.root-servers.net.     518400  IN      A       192.58.128.30
k.root-servers.net.     518400  IN      A       193.0.14.129
l.root-servers.net.     518400  IN      A       199.7.83.42
m.root-servers.net.     518400  IN      A       202.12.27.33
 
#dig @a.root-servers.net . NS

예시 출력:

;; ANSWER SECTION:
www.도메인이름.   86400   IN      A       IP주소

루트 힌트 파일 업데이트

루트 서버 정보가 갱신될 경우, 공식 파일을 다운로드하여 갱신할 수 있습니다:

wget -O /var/named/named.ca https://www.internic.net/domain/named.root

BIND를 사용하는 경우, 설정 파일에 해당 경로를 명시합니다:

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

추가 정보

루트 네임서버는 잘 변하지 않지만, 인터넷 인프라 변화로 인해 IP가 수정될 수 있으므로 최신 정보를 주기적으로 확인하는 것이 중요합니다.

DNS 캐싱의 역할

  • 로컬 DNS 서버나 브라우저에 최근 질의 결과를 저장하여, 동일한 요청이 있을 때 직접 응답합니다.
  • TTL(Time To Live)을 설정하여 캐시 갱신 주기를 관리합니다.

DNS 레코드 유형

  • A 레코드: 도메인 -> IPv4 주소
  • AAAA 레코드: 도메인 -> IPv6 주소
  • CNAME 레코드: 별칭 -> 실제 도메인
  • MX 레코드: 메일 서버 정보
  • TXT 레코드: SPF, DKIM 등 텍스트 정보
  • PTR 레코드: IP 주소 -> 도메인 (역 조회)

DNS 전파 지연

  • 도메인 정보를 수정하면 전 세계의 DNS 서버로 전파되는 데 시간이 걸립니다.
  • TTL 값이 클수록 캐시가 오래 남아 있으므로 전파가 느려질 수 있습니다.

2. Linux에서 DNS 서버 구축

1) BIND 설치 (Ubuntu 및 최신 Linux 배포판)

BIND는 가장 널리 쓰이는 DNS 서버 소프트웨어입니다.

sudo apt update
sudo apt install bind9 bind9utils bind9-doc -y

2) BIND 서비스 활성화

sudo systemctl enable bind9
sudo systemctl start bind9

서비스가 잘 실행되는지 확인합니다.

sudo systemctl status bind9

3. DNS 파일 설정

Zone 파일이란?

  • Zone 파일은 DNS 서버가 도메인 이름을 IP 주소로 변환하는 정보를 담고 있습니다.
  • 정방향 조회(Forward Lookup)를 위한 파일입니다.
  • 주로 도메인 이름을 A 레코드CNAME 레코드로 매핑합니다.
  • /var/named/, /etc/named/, 또는 /etc/bind/ 경로에 위치합니다.

Zone 파일 기본 구조

$TTL 86400       ; 기본 TTL 값 (24시간)
@   IN  SOA  ns1.example.com. admin.example.com. (
        2025051601 ; Serial 번호 (형식: YYYYMMDDnn)
        3600       ; Refresh (1시간)
        1800       ; Retry (30분)
        1209600    ; Expire (2주)
        86400      ; Minimum TTL (1일)
)
; 네임서버(NS) 레코드
@   IN  NS   ns1.example.com.
@   IN  NS   ns2.example.com.

; A 레코드 (도메인 -> IP 매핑)
ns1 IN  A    192.168.1.1
ns2 IN  A    192.168.1.2
www IN  A    192.168.1.100

; CNAME 레코드 (별칭)
mail IN  CNAME   www

주요 필드 설명

  • $TTL: 기본 TTL(Time To Live) 값
  • SOA(Start of Authority): 존의 권한을 가진 네임서버 정보
    • Serial: 존 파일 수정 시 증가시켜야 함
    • Refresh: 보조 네임서버의 갱신 주기
    • Retry: 갱신 실패 시 재시도 시간
    • Expire: 갱신하지 못한 경우 데이터 폐기 시간
    • Minimum TTL: 캐시 유효 기간
  • NS 레코드: 도메인의 네임서버 정보
  • A 레코드: 도메인을 IP 주소로 변환
  • MX 레코드: 메일 서버 정보

Reverse Zone 파일 (역방향 조회 파일) 이란?

역할:

  • IP 주소를 도메인 이름으로 변환하는 데 사용됩니다.
  • 일반적으로 db.192.168.1 또는 db.1.168.192와 같은 이름으로 저장됩니다.
  • 경로는 Zone 파일과 동일한 디렉토리입니다.

예시:

$TTL 86400
@   IN  SOA  ns1.example.com. admin.example.com. (
        2025051601 ; Serial 번호
        3600       ; Refresh (1시간)
        1800       ; Retry (30분)
        1209600    ; Expire (2주)
        86400      ; Minimum TTL (1일)
)
@   IN  NS   ns1.example.com.
@   IN  NS   ns2.example.com.

; PTR 레코드 (IP -> 도메인 매핑)
1   IN  PTR  ns1.example.com.
2   IN  PTR  ns2.example.com.
100 IN  PTR  www.example.com.

 

설명:

  • PTR (Pointer Record): IP 주소를 도메인 이름으로 변환합니다.
  • IP 주소의 순서를 거꾸로 표시합니다. 예: 192.168.1.100 → 100.1.168.192.in-addr.arpa

Named 설정 파일 (named.conf)

역할:

 

  • BIND DNS 서버의 메인 설정 파일입니다.
  • 일반적으로 /etc/named.conf 또는 /etc/bind/named.conf에 위치합니다.

예시:

options {
    directory "/var/named";
    listen-on port 53 { 127.0.0.1; 192.168.1.1; };
    allow-query { any; };
    recursion no;
};

zone "example.com" IN {
    type master;
    file "db.example.com";
};

zone "1.168.192.in-addr.arpa" IN {
    type master;
    file "db.192.168.1";
};

설명:

  • options 블록:
    • directory: Zone 파일이 저장된 디렉토리 지정
    • listen-on: DNS 서버가 응답할 IP 주소
    • allow-query: DNS 조회를 허용할 IP 범위
    • recursion: 재귀 질의 허용 여부
  • zone 블록:
    • type: 마스터/슬레이브 유형 지정
    • file: 관련 Zone 파일 경로 지정

named.rfc1912.zones 설정 파일

  • 표준 설정 파일로 지역 도메인 예제와 기본 역방향 조회 설정이 포함되어 있습니다.
  • 주로 포함되는 형식:
  •  
    include "/etc/named.rfc1912.zones";
  • 내부 네트워크에서 사용되는 로컬 호스트루프백 주소와 관련된 기본 설정이 들어 있습니다.

Tip: 설정 파일 구조 요약

  1. named.conf: 전체 DNS 설정을 관리하며 Zone 파일을 지정합니다.
  2. Zone 파일: 도메인 이름 → IP 주소 매핑 정보
  3. Reverse Zone 파일: IP 주소 → 도메인 이름 매핑 정보
  4. named.rfc1912.zones: 로컬 호스트 및 기본 역방향 조회 설정 포함

4. BIND 구문 오류 검사

DNS 설정 파일을 검증하여 오류를 확인합니다.

sudo named-checkconf
sudo named-checkzone 도메인이름 /etc/bind/db.도메인이름
sudo named-checkzone 역방향IP.in-addr.arpa /etc/bind/db.정방향IP

서비스 재시작

sudo systemctl restart bind9

5. DNS 서버 테스트

DNS 서버가 정상적으로 동작하는지 확인합니다.

정방향 조회 테스트

dig 도메인이름 @localhost

역방향 조회 테스트

dig -x IP주소 @localhost

6. 방화벽 설정 (UFW 사용)

DNS 포트(53번)를 허용해야 외부에서 접근할 수 있습니다.

sudo ufw allow 53/tcp
sudo ufw allow 53/udp
sudo ufw reload

설정 확인

sudo ufw status

7. AppArmor 설정 (Ubuntu의 경우)

AppArmor가 활성화되어 있을 경우 BIND가 존 파일을 읽지 못할 수 있습니다.

sudo apparmor_status
sudo aa-complain /etc/apparmor.d/usr.sbin.named
  • AppArmor를 비활성화하거나 허용 모드로 전환하여 DNS 설정을 적용합니다.

8. DNS 서버 관리 팁

캐시 삭제

DNS 캐시가 남아 있어 수정 사항이 반영되지 않을 때 사용합니다.

sudo rndc flush

로그 확인

DNS 오류는 대부분 로그 분석으로 파악할 수 있습니다.

sudo tail -f /var/log/syslog

서비스 상태 확인

BIND 서비스가 정상적으로 동작하는지 확인합니다.

sudo systemctl status bind9

9. DNS 서버 장애 시 대처 방법

  • DNS 응답 없음: 방화벽 또는 포트 설정 확인
  • SERVFAIL 오류: 존 파일 오류 확인
  • REFUSED 오류: 접근 제어 문제 또는 권한 문제 확인
  • FORMERR 오류: 구문 오류 또는 포맷 문제 확인

🧰 긴급 조치

  1. 캐시 삭제:
  2. sudo rndc flush
  3. BIND 재시작: sudo systemctl restart bind9
  4. 로그 분석: sudo tail -f /var/log/syslog

참고로

  • 재귀 조회는 네임서버가 루트 DNS 정보를 알아야 하는데, 일반적으로 /var/named/root.hints (또는 named.root) 파일을 통해 루트 네임서버 리스트를 가지고 있습니다.
  • 이 파일이 잘 있어야 직접 조회가 제대로 됩니다.

혹시 사내 DNS 서버가 직접 재귀 조회를 제대로 하고 있는지 확인하려면,

rndc status

로 상태를 확인하거나, /etc/named.conf의 options 부분에

recursion yes;

이 설정이 활성화돼 있는지도 확인해 보세요.

10. /etc/named.conf의 forwarders 설정

  • forwarders를 안 쓰면, 사내 DNS 서버(named는 기본적으로 재귀적 DNS 서버입니다)는
    클라이언트가 요청한 도메인 이름을 해석하기 위해 루트 네임서버(root DNS servers) 부터 시작해 직접 질의를 합니다.
  • 예를 들어, google.com 요청이 들어오면,
    1. 루트 네임서버에 .com 네임서버 정보를 묻고,
    2. .com 네임서버에 google.com 네임서버 정보를 묻고,
    3. google.com 네임서버에서 실제 IP 주소(A 레코드)를 받아와서 클라이언트에 전달합니다.
  • 이런 과정을 재귀 조회(recursive resolution)라고 하며,
    DNS 서버가 직접 계층적으로 여러 네임서버에 질의하는 동작입니다.

포워딩(forwarders) 설정이 있을 때

  • forwarders가 설정되어 있으면, 사내 DNS 서버는 위와 같은 직접 조회 대신 모든 질의를 지정한 포워딩 DNS 서버에게 위임합니다.
  • 포워더가 대신 루트부터 차근차근 조회하거나 캐시된 응답을 주는 역할을 하죠.

요약하면

상황 동작 방식 결과
포워더 미설정 (기본) 루트부터 직접 재귀 조회 수행 외부 도메인도 잘 해석 가능
포워더 설정 (forward first) 포워더에 먼저 질의, 실패 시 직접 조회 빠르고 안정적, 포워더 장애 시 직접 조회 가능
포워더 설정 (forward only) 무조건 포워더에만 질의 포워더 장애 시 DNS 질의 실패 가능

DHCP 서버에서 1차로 내부 DNS 서버, 2차로 KT DNS 서버를 할당한 경우, Windows PC에서 DNS 이름을 해석하는 과정은 다음과 같습니다.

11. DNS 조회 순서 (Windows PC 기준)

  1. Windows Hosts 파일 확인
    • PC 내부의 C:\Windows\System32\drivers\etc\hosts 파일을 먼저 확인합니다.
    • 해당 파일에 매핑된 IP가 있으면 이를 사용하여 바로 연결합니다.
    • 예: 192.168.0.10 myserver.local
  2. DHCP로 할당된 1차 DNS 서버(내부 DNS 서버가 있다면 내부DNS 서버)에 질의
    • 내부 DNS 서버에 도메인 이름이 있는지 확인합니다.
  3. 내부 DNS 서버 응답
    • 존(zone) 파일에 기록된 도메인이 있다면 바로 응답합니다.
  4. 내부 DNS 서버에 해당 도메인이 없는 경우
    • 내부 DNS 서버 설정에 따라 달라집니다
      1. 포워더 설정이 있는 경우 (forward first)
        • 내부 DNS 서버는 포워더 IP로 질의합니다.
        • 예를 들어, 포워더가 구글 DNS(8.8.8.8)로 설정되어 있다면, 구글 DNS에 질의합니다.
        • 포워더도 응답하지 않으면, 루트 DNS로 직접 조회합니다.
        • 이는 BIND 설정에서 forward first;로 설정된 경우입니다.
      2. 포워더 설정이 없는 경우 (forward only)
        • 내부 DNS 서버는 바로 루트 DNS 서버에 질의합니다.
        • 루트 서버로부터 TLD 서버 → 권한 DNS 서버로 이어지는 체계적인 조회를 진행하여 IP를 찾습니다.
        • 1차 DNS 서버로부터 응답 없음 또는 NXDOMAIN
        • 내부 DNS 서버로부터도 응답을 받지 못하거나, NXDOMAIN(도메인 없음) 상태가 되면,
          NXDOMAIN은 명백한 부정 응답이므로 Windows는 2차 DNS로 넘어가지 않습니다.

중요 사항: 내부 DNS와 외부 DNS의 역할

  1. 내부 DNS 서버가 NXDOMAIN을 반환하면?
    • Windows 클라이언트는 2차 DNS 서버로 넘어가지 않습니다.
    • NXDOMAIN은 "도메인이 없다"라는 명확한 응답이므로, 2차 DNS 서버로 질의하지 않습니다.
    • 따라서 내부 DNS 서버에서 응답이 없을 때만 2차로 넘어가게 됩니다.
  2. 내부 DNS 서버가 Timeout 상태라면?
    • 내부 DNS 서버가 응답하지 않거나 서버 자체가 다운되었다면,
      Windows 클라이언트는 자동으로 2차 DNS 서버로 질의합니다.

올바른 DNS 설정 예시

내부 DNS 서버 설정:

  • 내부 도메인만 관리하고, 외부 도메인은 포워더 또는 직접 조회 사용
     
  • 내부에서 관리하지 않는 도메인은 구글 DNS(8.8.8.8) 또는 클라우드플레어(1.1.1.1)로 전달

DHCP 서버 설정:

  • 1차 DNS 서버: 내부 DNS 서버 IP (예: 192.168.0.1)
  • 2차 DNS 서버: KT DNS 서버 IP (예: 168.126.63.1)
  1.  

마무리

DNS 서버는 네트워크의 핵심 역할을 수행하므로, 안정적 운영이 필수입니다.

  • DNS 서버 문제 발생 시 로그를 가장 먼저 확인하여 원인을 파악합니다.
  • 설정이 복잡할 경우 정방향과 역방향 존 파일을 별도로 점검하세요.
  • 최신 Linux 환경에서는 BIND와 AppArmor, UFW 설정이 중요합니다.
반응형

댓글