리눅스 (5) - DNS
리눅스 DNS 기초, BIND9 네임서버 구축
인터넷을 이용할 때 숫자로 된 IP 주소 대신 google.com 같은 문자 주소를 입력해도 원하는 서버에 접속할 수 있는 이유는 DNS(Domain Name System) 덕분이다.
이번 글에서는 DNS의 기본 개념부터 로컬 매핑 파일인 hosts, DNS 동작 구조, 그리고 Linux에서 BIND9을 이용해 직접 네임서버를 구축하는 방법을 정리한다.
1. DNS (Domain Name System) 개요
- 개념: 사람이 읽을 수 있는 문자 주소(도메인)를 컴퓨터가 이해할 수 있는 IP 주소로 변환해 주는 시스템이다.
- Name Server / DNS Server: 주소 변환을 담당하는 서버를 의미하며, 이 변환 과정을 Resolution(해상/조회)이라고 한다.
- IP 직접 접속: 도메인 대신 IP 주소를 직접 입력하면 DNS 변환 과정이 생략되므로 미세하게 접속 속도가 빨라질 수 있다.
2. hosts 파일과 운영 환경에서의 주의점
hosts 파일은 도메인 이름을 IP 주소로 로컬에서 직접 강제 매핑하는 로컬 DNS 역할을 한다.
📍 파일 위치 및 기본 설정
- Linux / macOS:
/etc/hosts - Windows:
C:\Windows\System32\drivers\etc\hosts
1
2
3
4
5
6
# 예시: localhost를 127.0.0.1로 매핑 (외부 DNS 조회를 하지 않음)
127.0.0.1 localhost
# 특정 사이트 차단 (0.0.0.0으로 지정하면 접속이 즉시 차단됨)
0.0.0.0 bad-website.com
🔄 hosts 수정 후 DNS 캐시 삭제
hosts 파일을 변경한 후 설정이 즉시 반영되도록 캐시를 비워주는 것이 권장된다.
- Linux:
sudo systemctl restart systemd-resolved - Windows:
ipconfig /flushdns
🔍 주소 조회 우선순위
hosts 파일 $\rightarrow$ DNS Cache $\rightarrow$ DNS Server
⚠️ 운영 서버(Production)에서 hosts 사용을 피해야 하는 이유
운영 환경에서 /etc/hosts에 IP를 하드코딩하면 다음과 같은 심각한 문제가 발생할 수 있다.
- DNS 변경 불일치: 실제 DNS 레코드가 변경되어도 로컬
hosts설정에 가려져 신규 IP가 반영되지 않는다. - 서버 간 일관성 붕괴: 동일한 애플리케이션을 여러 대 배포했을 때 특정 서버에만
hosts설정이 들어가 있으면 일관성이 깨진다. - 디버깅 난항: SSH/API/DB 접속 오류 발생 시 원인이 네트워크나 방화벽 문제처럼 보여 장애 추적이 극도로 어려워진다.
- 클라우드 & 배포 환경 충돌: Auto Scaling, Blue/Green 배포, Immutable Infrastructure 적용 시 신규 생성 서버에는
hosts설정이 없어 일부 서버에서만 장애가 발생한다. - 보안 및 자동화 도구 충돌: 내부자 공격에 의해 가짜 인증 서버로 유도될 위험이 있으며, Ansible, Terraform, Kubernetes, CI/CD 등 DNS 기반 운영 자동화 도구와 충돌을 야기한다.
- IPv4/IPv6 우선순위 이슈: SSH 등이 IPv6를 먼저 시도할 때 서버가 IPv4만 리슨하도록
hosts설정이 잘못되어 있으면 Timeout/Hang 상태가 발생한다.
💡 hosts 사용이 허용되는 예외: 로컬 개발 PC, 개인 테스트 환경, 혹은 단기 장애 우회용(장애 해결 후 즉시 원복 필수).
3. DNS 주요 구성 요소 및 동작 흐름
DNS는 트리 형태의 계층 구조로 동작하며, 크게 4가지 컴포넌트로 나뉜다.
- DNS Recursive Resolver: 사용자의 요청을 가장 먼저 받는 지점으로, 최종 IP를 찾을 때까지 다른 네임서버들에 질의를 대행한다.
- Root Name Server: 도메인 변환의 최상위 단계로,
.com,.net,.kr등 TLD 서버의 위치를 안내한다. - TLD Name Server (최상위 네임서버):
.com,.org등 확장자를 관리하며, 구체적인 2단계 도메인 정보가 있는 네임서버로 안내한다. - Authoritative Name Server: 실제 도메인의 정확한 IP 주소가 저장되어 있는 최종 목적지 서버이다.
4. 주요 DNS 레코드 종류
| 레코드 유형 | 설명 |
|---|---|
| A Record | 도메인을 IPv4 주소와 연결 (가장 기본) |
| AAAA Record | 도메인을 IPv6 주소와 연결 |
| CNAME | 도메인을 다른 도메인 타겟 별칭(Alias)으로 연결 |
| MX Record | 해당 도메인의 이메일을 수신할 메일 서버(Mail Exchange) 지정 |
5. DNS Caching 및 TTL
- DNS Caching: 매번 전체 질의 과정을 거치면 속도가 느려지므로, 한 번 조회한 주소는 브라우저 및 OS 레벨에 저장하여 재사용한다.
- TTL (Time to Live): DNS 레코드가 캐시에 저장되어 유지되는 유효 기간을 의미한다.
6. Linux의 DNS 설정 및 IP 조회 흐름
⚙️ 설정 파일
/etc/netplan/*.yaml: 우분투 등 최신 시스템의 네트워크 설정 파일이다./etc/resolv.conf: 시스템이 사용할 네임서버 IP가 명시된 파일이다.
🔄 IP 주소 탐색 프로세스
1
2
3
4
5
6
URL 입력
└─► /etc/host.conf 조회
└─► /etc/hosts 확인 (존재하면 즉시 접속)
└─► (없을 시) /etc/resolv.conf 의 nameserver에 질의
└─► 네임서버 미설정 시 "Host name not found" 에러 발생
7. Linux (Ubuntu) BIND9 네임서버 구축
우분투 환경에서 가장 대중적인 DNS 서버 패키지인 BIND9을 설치하고 설정하는 방법이다.
1) 패키지 설치 및 상태 확인
1
2
3
4
sudo apt update
sudo apt install bind9 bind9-utils bind9-doc -y
sudo systemctl status bind9
2) BIND9 옵션 설정
/etc/bind/named.conf.options 파일을 열고 다음과 같이 수정한다.
1
2
sudo vim /etc/bind/named.conf.options
1
2
3
4
5
6
7
8
options {
directory "/var/cache/bind";
dnssec-validation no;
recursion yes;
allow-query { any; };
listen-on-v6 { any; };
};
3) 서비스 재시작 및 자동 등록
1
2
3
4
5
6
7
8
9
# 서비스 재시작
sudo systemctl restart named
# 부팅 시 자동 시작 설정
sudo systemctl enable named
# 서비스 상태 확인
sudo systemctl status named
4) 방화벽 설정 및 테스트
DNS 서비스는 53번 포트(UDP/TCP)를 사용하므로 방화벽을 해제해야 한다.
1
2
3
4
5
6
# DNS 포트 허용
sudo ufw allow 53
# dig 명령어로 네임서버 동작 테스트
dig @<네임서버IP> google.com
5) 클라이언트 PC 적용 (/etc/resolv.conf)
다른 클라이언트 컴퓨터에서 구축한 네임서버를 바라보도록 /etc/resolv.conf를 수정한다.
1
2
3
4
nameserver 192.168.64.16
options edns0 trust-ad
search .
8. 마치며
이번 글에서는 DNS의 핵심 개념부터 운영 환경에서 hosts 파일 사용 시 주의해야 할 점, 그리고 Linux(Ubuntu) 환경에서 BIND9을 통해 직접 네임서버를 구축하고 테스트하는 과정까지 살펴보았다.
단순히 도메인을 IP로 변환해 주는 기능으로만 치부하기보다는, 계층적 동작 구조와 캐싱(TTL), 레코드 종류 등을 정확히 이해하고 상황에 맞는 네트워크 설정을 적용하는 것이 안정적인 인프라 운영에 도움이 될 것이다.