www.example.com.의 맨 끝에는 보이지 않는 점(.)이 있고, 그것이 바로 루트(root)다.
. ← 루트 (전 세계 13개 루트 서버 그룹)
└── com. ← TLD (Top-Level Domain)
└── example.com. ← 2차 도메인 (등록·관리 단위)
└── www.example.com. ← 호스트(서브도메인)
계층
이름
담당
루트
.
루트 네임서버 (a~m.root-servers.net)
TLD
com, net, org, kr
레지스트리 (com은 Verisign)
2차
example.com
도메인 소유자(권한 네임서버)
호스트
www, mail
개별 서비스
각 계층은 자신의 바로 아래 계층만 위임한다.
루트는 "com을 관리하는 서버가 누구인지"만, com TLD 서버는 "example.com을 관리하는 서버가 누구인지"만 알려 준다.
실제 IP는 맨 아래 권한 서버가 쥐고 있다.
FQDN(Fully Qualified Domain Name, 정규화된 도메인 이름)은 맨 끝의 루트 점까지 포함한 완전한 이름이다. www.example.com.처럼 끝에 점이 있으면 "여기서 더 붙일 게 없는 절대 경로"라는 뜻이다. zone 파일에서 이 끝점(trailing dot) 하나가 있고 없고가 의미를 완전히 바꾸므로, 반드시 의식하고 써야 한다.
로컬 DNS는 한 번 알아낸 답을 캐시(cache)에 보관한다. 보관 기간은 각 레코드의 TTL(Time To Live, 초 단위) 값이 정한다. TTL이 3600이면 한 시간 동안 다시 묻지 않고 캐시로 답한다. 그래서 도메인의 IP를 바꿔도 전 세계에 퍼지는 데 TTL만큼 시간이 걸린다. 이전 서버가 캐시에 잡아 둔 오래된 답(stale)을 우리는 "DNS 전파(propagation) 지연"이라 부른다.
A는 IPv4, AAAA는 IPv6. 글자 수(A 1개 vs A 4개)가 비트 수 차이(32비트 vs 128비트)를 연상시킨다.
CNAME은 별칭.ftp가 사실은 www라고 가리킨다. 단, CNAME이 가리키는 대상에는 또 다른 레코드를 둘 수 없고, 특히 도메인 최상위(@)에는 CNAME을 쓸 수 없다.
MX에는 우선순위 숫자가 붙는다. 숫자가 작을수록 우선(먼저 시도). MX 10이 MX 20보다 먼저다.
PTR은 역방향 전용. IP를 주고 이름을 받는다. 스팸 차단·로그 분석에 쓰인다.
⚠️ 함정: CNAME 레코드의 대상에는 같은 이름의 다른 레코드(A, MX 등)를 함께 둘 수 없다. 또한 도메인 꼭대기(zone apex, @)에는 CNAME을 둘 수 없다 — 그 자리에는 반드시 SOA와 NS가 있어야 하기 때문이다. "메인 도메인 example.com을 CNAME으로"라는 보기는 틀린 함정이다.
SOA가 정하는 것: 이 영역의 권한 서버, 그리고 보조(secondary) 서버가 언제 갱신할지.
다섯 개의 타이머 필드를 외우는 것이 실기 핵심이다.
$TTL 86400@ IN SOA ns1.example.com. admin.example.com. ( 2026060501 ; Serial (일련번호: 변경 시마다 증가) 3600 ; Refresh (보조가 변경 확인 주기, 초) 900 ; Retry (확인 실패 시 재시도 간격, 초) 1209600 ; Expire (주 서버 불통 시 보조가 데이터 폐기까지, 초) 86400 ) ; Minimum (음수 캐시 TTL, 초)
Serial은 보통 날짜 기반 YYYYMMDDnn 형식을 쓴다(예: 2026060501 = 2026년 6월 5일 1번째 수정). 관리자가 zone을 고치고 Serial 증가를 깜빡하면 보조 서버가 변경을 영원히 모른 채 옛 데이터를 서비스한다. 실제 운영 사고의 흔한 원인이며, 그래서 "수정했으면 Serial부터 올려라"가 DNS 관리자의 제1수칙이다.
리눅스의 표준 DNS 서버는 BIND(Berkeley Internet Name Domain)이며, 데몬 이름은 named다.
# 설치 (RHEL/CentOS 계열)yum install bind bind-utils# 설정 파일 위치/etc/named.conf # 메인 설정 (전역 옵션 + zone 선언)/var/named/ # zone 파일들이 놓이는 디렉터리# 데몬 제어systemctl start namedsystemctl enable named# 설정 문법 검사 (저장 전 필수!)named-checkconf # named.conf 검사named-checkzone example.com /var/named/example.com.zone # zone 검사
named.conf는 전역 옵션 블록 + 영역(zone) 선언으로 이루어진다.
options { listen-on port 53 { any; }; # 수신 인터페이스 directory "/var/named"; # zone 파일 기준 디렉터리 allow-query { any; }; # 질의 허용 대상 recursion yes; # 재귀 질의 허용 여부};zone "example.com" IN { type master; # master(주) 또는 slave(보조) file "example.com.zone"; # 정방향 zone 파일명};zone "1.168.192.in-addr.arpa" IN { # 역방향 영역 type master; file "192.168.1.rev";};
지시어
역할
directory
zone 파일을 찾을 기준 경로(/var/named)
allow-query
질의를 허용할 클라이언트 범위
recursion
재귀 질의 허용 여부. 공개 서버는 보통 no
type master/slave
이 서버가 영역의 주인인지 사본인지
file
해당 영역의 zone 파일 이름
⚠️ 함정: type master는 주 서버, type slave는 보조 서버다. slave 영역에는 masters { 주서버IP; };를 함께 적어 어디서 데이터를 받아올지 알려야 한다. master/slave를 뒤바꾸거나, recursion을 외부 공개 서버에서 yes로 두는 것(오픈 리졸버 = DDoS 증폭에 악용됨)이 함정 보기로 나온다.
$TTL 86400@ IN SOA ns1.example.com. admin.example.com. ( 2026060501 3600 900 1209600 86400 ) IN NS ns1.example.com. IN MX 10 mail.example.com.ns1 IN A 192.168.1.10www IN A 192.168.1.20mail IN A 192.168.1.30ftp IN CNAME www.example.com.
@는 영역 이름(example.com.) 자체를 가리키는 약어다.
이름 칸이 비어 있으면 바로 위 줄의 이름을 이어받는다.
zone 파일에서 이름이 점으로 끝나지 않으면(www), BIND가 영역 이름을 자동으로 붙여 www.example.com.으로 해석한다(이를 origin 부착이라 한다). 반대로 www.example.com.처럼 점으로 끝내면 그대로 절대 이름이 된다. CNAME·NS·MX의 대상은 반드시 끝점을 붙여 FQDN으로 적는 것이 안전하다 — 끝점을 빠뜨리면 mail.example.com.example.com.처럼 영역이 두 번 붙는 전형적 사고가 난다.
192.168.1.0/24의 역방향 영역은 1.168.192.in-addr.arpa — IP 옥텟을 역순으로 적는다.
/var/named/192.168.1.rev:
$TTL 86400@ IN SOA ns1.example.com. admin.example.com. ( 2026060501 3600 900 1209600 86400 ) IN NS ns1.example.com.10 IN PTR ns1.example.com.20 IN PTR www.example.com.30 IN PTR mail.example.com.
여기서 20은 20.1.168.192.in-addr.arpa를 뜻하며, 이는 IP 192.168.1.20에 대응한다.
PTR 레코드의 대상(이름)은 항상 FQDN(끝점 포함)으로 적는다.
역방향 조회는 메일 서버 신뢰성 검증에 핵심이다. 받는 메일 서버는 보내는 IP의 PTR이 정상적인 이름으로 풀리는지 확인하고, PTR이 없거나 엉뚱하면 스팸으로 처리한다. IPv4는 in-addr.arpa, IPv6는 ip6.arpa를 쓴다는 차이도 있다.