도메인 이름 시스템(DNS) 개요
사용자가 웹사이트를 방문할 때 도메인 이름을 사용하지만, 컴퓨터는 IP 주소를 통해 통신합니다. DNS는 이 도메인 이름과 IP 주소 간의 변환(매핑)을 담당하는 분산 데이터베이스 시스템입니다. 이 변환 과정을 도메인 이름 해석(Domain Name Resolution)이라고 합니다. DNS 서비스는 일반적으로 TCP 및 UDP 포트 53을 사용하며, TCP 53은 DNS 서버 간의 존 전송(Zone Transfer) 등에, UDP 53은 일반적인 질의 응답에 사용됩니다.
DNS의 역할
- 정방향 해석(Forward Resolution): 도메인 이름(예:
www.example.com)을 사용하여 해당하는 IP 주소를 찾는 과정입니다. - 역방향 해석(Reverse Resolution): IP 주소(예:
192.168.1.100)를 사용하여 해당하는 도메인 이름을 찾는 과정입니다.
도메인 이름 구조
도메인 이름은 계층적인 구조를 가지며, 가장 상위에는 루트 도메인(.)이 있습니다. 그 아래로는 최상위 도메인(TLD)(예: .com, .org, .net, .kr), 2차 도메인(예: example.com), 그리고 하위 도메인(예: www.example.com, mail.example.com)으로 구성됩니다. 이 전체 경로를 FQDN (Fully Qualified Domain Name)이라고 합니다.
DNS 서버의 종류
- 주 DNS 서버 (Primary DNS Server): 특정 도메인 존(Zone)의 모든 도메인 정보를 관리하고, 해당 존에 대한 권한 있는 정보(Authoritative Information)를 제공합니다. 데이터 변경이 가능합니다.
- 보조 DNS 서버 (Secondary DNS Server): 주 DNS 서버의 백업 역할을 합니다. 주 DNS 서버에 문제가 발생하거나 과부하 시 서비스를 제공하며, 주 서버로부터 존 데이터를 동기화하여 유지합니다.
- 캐싱 전용 DNS 서버 (Caching-only DNS Server): 도메인 데이터베이스를 직접 관리하지 않고, 다른 DNS 서버로부터 얻은 질의 결과를 캐시하여 다음 요청 시 빠르게 응답합니다. 질의 속도 향상에 기여하지만, 권한 있는 서버는 아닙니다.
- 전달 DNS 서버 (Forwarding DNS Server): 로컬 존에 속하지 않는 모든 질의 요청을 특정 DNS 서버(전달자, Forwarder)로 전달하여 해석을 의뢰합니다.
DNS 질의 과정
클라이언트가 DNS 질의를 시작하면, 두 가지 주요 질의 방식이 사용됩니다.
- 재귀 질의 (Recursive Query): 클라이언트가 DNS 서버에 질의하면, DNS 서버는 최종 응답(IP 주소 또는 오류)을 클라이언트에게 전달할 책임이 있습니다. 이를 위해 필요하다면 다른 DNS 서버에 추가 질의를 수행합니다.
- 반복 질의 (Iterative Query): DNS 서버가 클라이언트로부터 질의를 받으면, 직접 응답할 수 없는 경우 클라이언트에게 다음 단계의 질의를 수행해야 할 다른 DNS 서버의 주소를 알려줍니다. 클라이언트는 이 주소를 받아 직접 다음 DNS 서버에 질의를 반복하여 최종 응답을 얻습니다.
BIND를 이용한 DNS 서버 구축
BIND (Berkeley Internet Name Daemon)는 Linux 시스템에서 가장 널리 사용되는 DNS 서비스 프로그램입니다. BIND를 통해 도메인 이름 해석 서비스를 제공할 수 있습니다.
BIND 설치 및 주요 파일 확인
BIND 관련 패키지를 설치하고 주요 설정 파일 경로를 확인합니다.
# BIND 패키지 설치
yum install -y bind bind-utils
# BIND 주요 설정 파일 경로 확인
rpm -qc bind
주요 파일 경로는 다음과 같습니다:
/etc/named.conf: BIND의 메인 설정 파일입니다./etc/named.rfc1912.zones: 영역(zone) 설정을 정의하는 파일입니다./var/named/: 영역 데이터 파일(resource record)이 저장되는 기본 디렉토리입니다. (예:named.localhost)
정방향 해석 DNS 서버 구성
example.com 도메인에 대한 정방향 해석을 제공하는 DNS 서버를 구축하는 단계입니다. 서버 IP는 192.168.1.100을 사용합니다.
1. 메인 설정 파일 (/etc/named.conf) 수정
BIND 데몬이 특정 포트와 IP 주소를 수신하고, 질의를 허용할 네트워크 범위를 지정합니다.
vim /etc/named.conf
다음과 같이 options 블록을 수정합니다:
options {
listen-on port 53 { 192.168.1.100; }; # DNS 서버의 IP 주소로 변경 (any 가능)
# listen-on-v6 port 53 { ::1; }; # IPv6를 사용하지 않으면 주석 처리
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { 192.168.1.0/24; }; # DNS 질의를 허용할 네트워크 범위 지정 (any 가능)
recursion yes;
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
2. 영역 설정 파일 (/etc/named.rfc1912.zones) 수정
새로운 정방향 해석 영역을 추가합니다.
vim /etc/named.rfc1912.zones
파일 하단에 example.com 도메인에 대한 zone 블록을 추가합니다:
zone "example.com" IN {
type master; # 이 서버가 example.com 존의 주 서버임을 명시
file "example.com.zone"; # 이 영역의 데이터 파일 지정
allow-update { none; }; # 동적 업데이트 허용 안 함 (보안 권장)
};
3. 영역 데이터 파일 (/var/named/example.com.zone) 생성 및 수정
named.localhost 파일을 복사하여 새로운 영역 데이터 파일을 생성하고 내용을 수정합니다.
cd /var/named/
cp -p named.localhost example.com.zone
vim example.com.zone
example.com.zone 파일의 내용을 다음과 같이 수정합니다. (원문과 유사한 논리, 변수명 변경)
$TTL 1D
@ IN SOA ns1.example.com. hostmaster.example.com. (
2023102601 ; serial (YYYYMMDDNN)
1H ; refresh
5M ; retry
1W ; expire
1D ) ; minimum
NS ns1.example.com.
A 192.168.1.100
ns1 IN A 192.168.1.100
www IN A 192.168.1.100
mail IN A 192.168.1.101
ftp IN CNAME www
* IN A 192.168.1.102
ns1.example.com.: 이 존의 네임서버입니다.hostmaster.example.com.: 관리자 이메일 주소입니다. (@대신.사용)serial: 존 파일이 업데이트될 때마다 증가하는 번호입니다. 보조 DNS 서버가 업데이트를 감지하는 데 사용됩니다.MX 10 mail.example.com.(예시): 메일 교환 레코드입니다. 숫자는 우선순위를 나타내며, 숫자가 낮을수록 우선순위가 높습니다. (위 예시에서는 생략)
4. BIND 서비스 시작 및 방화벽 설정
BIND 서비스를 시작하고, 방화벽을 비활성화하거나 DNS 포트(53/udp, 53/tcp)를 허용합니다.
systemctl start named
systemctl enable named
systemctl stop firewalld # 방화벽 비활성화 (테스트용)
setenforce 0 # SELinux 비활성화 (테스트용)
서비스 시작에 문제가 발생하면 journalctl -xe 또는 tail -f /var/log/messages 명령으로 로그를 확인합니다.
5. 클라이언트 DNS 설정
클라이언트 시스템에서 DNS 서버 주소를 방금 구성한 DNS 서버의 IP 주소로 변경합니다.
# /etc/resolv.conf 수정 (임시 적용)
vim /etc/resolv.conf
nameserver 192.168.1.100
# 또는 네트워크 설정 파일 수정 (영구 적용)
# vim /etc/sysconfig/network-scripts/ifcfg-eth0 (또는 ifcfg-ens33 등)
# DNS1=192.168.1.100
# systemctl restart network
6. DNS 해석 테스트
클라이언트에서 dig 또는 nslookup 명령어를 사용하여 정방향 해석을 테스트합니다.
dig www.example.com
dig mail.example.com
dig ftp.example.com
dig anyhost.example.com
역방향 해석 DNS 서버 구성
IP 주소 192.168.1.x에 대한 역방향 해석을 구성합니다.
1. 영역 설정 파일 (/etc/named.rfc1912.zones) 수정
역방향 해석 영역을 추가합니다. 네트워크 주소를 역순으로 작성하고 .in-addr.arpa를 붙입니다.
vim /etc/named.rfc1912.zones
파일 하단에 192.168.1.x 네트워크에 대한 zone 블록을 추가합니다:
zone "1.168.192.in-addr.arpa" IN { # IP 네트워크 ID를 역순으로 작성 (1.168.192)
type master;
file "1.168.192.zone"; # 역방향 해석 데이터 파일 지정
allow-update { none; };
};
2. 영역 데이터 파일 (/var/named/1.168.192.zone) 생성 및 수정
named.localhost 파일을 복사하여 새로운 역방향 영역 데이터 파일을 생성하고 내용을 수정합니다.
cd /var/named/
cp -p named.localhost 1.168.192.zone
vim 1.168.192.zone
1.168.192.zone 파일의 내용을 다음과 같이 수정합니다:
$TTL 1D
@ IN SOA ns1.example.com. hostmaster.example.com. (
2023102602 ; serial
1H ; refresh
5M ; retry
1W ; expire
1D ) ; minimum
NS ns1.example.com.
A 192.168.1.100
100 IN PTR www.example.com.
101 IN PTR mail.example.com.
PTR: 포인터 레코드를 의미하며, IP 주소에 대한 도메인 이름을 매핑합니다.
3. BIND 서비스 재시작 및 테스트
BIND 서비스를 재시작하고, 역방향 해석을 테스트합니다.
systemctl restart named
dig -x 192.168.1.100
dig -x 192.168.1.101
주-보조 DNS 서버 구성
안정적인 DNS 서비스를 위해 주(Master) 및 보조(Slave) DNS 서버를 구성합니다.
- 주 DNS 서버 (Master DNS Server): IP
192.168.1.100 - 보조 DNS 서버 (Slave DNS Server): IP
192.168.1.101
주 DNS 서버 설정 (192.168.1.100)
1. 영역 설정 파일 (/etc/named.rfc1912.zones) 수정
주 DNS 서버의 각 zone 블록에 보조 서버의 존 전송을 허용하도록 allow-transfer 옵션을 추가합니다.
vim /etc/named.rfc1912.zones
example.com 및 1.168.192.in-addr.arpa 존에 allow-transfer를 추가합니다:
zone "example.com" IN {
type master;
file "example.com.zone";
allow-update { none; };
allow-transfer { 192.168.1.101; }; # 보조 DNS 서버 IP 추가
};
zone "1.168.192.in-addr.arpa" IN {
type master;
file "1.168.192.zone";
allow-update { none; };
allow-transfer { 192.168.1.101; }; # 보조 DNS 서버 IP 추가
};
2. 주 DNS 서버 재시작
systemctl restart named
보조 DNS 서버 설정 (192.168.1.101)
1. BIND 설치 및 메인 설정 파일 (/etc/named.conf) 수정
보조 서버에도 BIND를 설치하고, named.conf에서 listen-on 및 allow-query를 보조 서버의 IP와 네트워크에 맞게 설정합니다.
# BIND 패키지 설치
yum install -y bind bind-utils
# /etc/named.conf 수정
vim /etc/named.conf
options 블록을 다음과 같이 수정합니다:
options {
listen-on port 53 { 192.168.1.101; }; # 보조 DNS 서버 IP
directory "/var/named";
allow-query { any; };
recursion yes;
};
include "/etc/named.rfc1912.zones";
2. 영역 설정 파일 (/etc/named.rfc1912.zones) 수정
보조 서버는 각 존의 type을 slave로 지정하고, 주 서버의 IP 주소를 masters에 명시합니다. 또한, 다운로드된 존 파일이 저장될 경로를 지정합니다 (일반적으로 slaves/ 디렉토리 아래).
vim /etc/named.rfc1912.zones
파일 하단에 example.com 및 1.168.192.in-addr.arpa 존에 대한 slave 설정을 추가합니다:
zone "example.com" IN {
type slave;
masters { 192.168.1.100; }; # 주 DNS 서버 IP 주소
file "slaves/example.com.zone"; # 존 파일 저장 경로
};
zone "1.168.192.in-addr.arpa" IN {
type slave;
masters { 192.168.1.100; };
file "slaves/1.168.192.zone";
};
3. 방화벽 설정 및 보조 DNS 서버 시작
보조 서버에서도 방화벽을 비활성화하고 BIND 서비스를 시작합니다.
systemctl stop firewalld
setenforce 0
systemctl start named
systemctl enable named
4. 존 파일 동기화 확인
보조 서버에서 BIND 서비스가 시작된 후, /var/named/slaves/ 디렉토리에 존 파일이 자동으로 생성되었는지 확인합니다.
ls -l /var/named/slaves/
5. 클라이언트 DNS 설정 및 테스트
클라이언트의 /etc/resolv.conf 파일에 주 DNS 서버와 보조 DNS 서버의 IP 주소를 모두 추가하여 이중화를 구성합니다.
vim /etc/resolv.conf
nameserver 192.168.1.100 # 주 DNS 서버
nameserver 192.168.1.101 # 보조 DNS 서버
해석 테스트를 수행합니다. 주 서버를 중지시켜 보조 서버가 정상적으로 작동하는지 시뮬레이션할 수 있습니다.
# 클라이언트에서 테스트
dig www.example.com
dig -x 192.168.1.100
# 주 DNS 서버 (192.168.1.100)에서 named 서비스 중지
systemctl stop named
# 클라이언트에서 다시 테스트
dig www.example.com # 보조 서버가 응답해야 함
dig -x 192.168.1.100