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 클라이언트)
- 네트워크 설정: 제어판에서 기본 DNS 주소를 주 서버 IP로, 보조 DNS 주소를 보조 서버 IP로 수동 설정한다.
- 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)가 주소를 찾는 과정은 계층적 구조를 따라 내려간다.
- Public DNS 캐시 확인: 이전에 누군가 bank.kr을 찾은 적이 있는지 확인합니다. 있으면 즉시 응답
- Root DNS 서버 (뿌리): 캐시에 없다면, 전 세계 DNS의 정점인 Root DNS에게 물어본 후 Root는 "나는 모르지만, .kr 담당자 주소는 알아"라며 kr DNS를 안내합니다.
- kr DNS 서버 (TLD): .kr 관리 서버에 물어봅니다. "나는 모르지만, bank.kr을 직접 관리하는 서버 IP는 알아"라며 해당 서버로 보낸다.
- bank.kr DNS 서버 (Authoritative): 드디어 주인을 만났습니다. 이 서버가 www.bank.kr의 실제 IP 주소를 알려줍니다.
- 응답 및 캐싱: Public DNS는 이 주소를 사용자에게 알려줌과 동시에, 다음 사용자를 위해 자신의 캐시(Cache)에 저장합니다.
'IT > Linux' 카테고리의 다른 글
| [Ansible] 실전 모듈 활용 (blockinfile, user, dnf) (0) | 2026.02.10 |
|---|---|
| [Ansible] 앤서블 기초 및 구성 관리 실습 정리 (0) | 2026.02.09 |
| [Linux] Apache(HTTPD) 웹 서버 구축 (0) | 2026.01.21 |
| [Linux] DHCP-Server (1) | 2026.01.19 |
| [Linux] FTP Active vs Passive 모드 (1) | 2026.01.18 |