DNS 서버란?
DNS(Domain Name System) 서버는 도메인 이름을 해당하는 IP 주소로 바꿔주는 역할을 하는 서버다.
인터넷을 구성하는 모든 네트워크 기기들은 주소 값으로 숫자로 구성된 IP를 가지고 있고 우리가 이를 기억하고 사용하는 데는 다소 어려움이 존재한다. 이를 해결하기 위해 불편한 IP 주소 대신 익숙한 문자열로 구성된 이름(도메인)을 대신 사용하는데, 도메인 이름과 IP 주소를 연결하여 관리하는 체계를 도메인 네임 시스템이라 한다.
예를 들어 웹사이트 티스토리에 접근하기 위해서 아이피 주소(211.183.222.4) 대신 도메인 주소 'www.tistory.com'를 사용할 수 있다.
이를 해결하기 위해 우리는 도메인 네임 시스템을 사용하여 식별하기 불편한 IP 주소를 익숙한 이름 문자열로 연결하는 체계를 사용한다.
로컬 DNS 서버 구축하기 - Docker와 dnsmasq 기반
Docker로 내부 DNS 서버를 구축하면 로컬 네트워크 또는 Docker 내부 네트워크에서 도메인/서브도메인을 자유롭게 구성하고 사용할 수 있어서 도메인을 활용한 테스트에 아주 유용하다.
(본 글에서 테스트 진행을 위해 사용한 서버 구성으로 'jpillora/dnsmasq' 이미지를 사용)
1. dnsmasq 설정
address=/.test.local/172.31.0.54
#listen-address=0.0.0.0
# resolv.conf 무시
no-resolv
# 업스트림 DNS 서버
server=1.0.0.1
#server=8.8.8.8
server=1.1.1.1
log-queries
log-facility=/var/log/dnsmasq.log
- address : 연결할 호스트 이름과 IP 주소를 표기 (ex. 도메인 banana.com과 IP 192.168.1.10을 연결한다면 address=/banana.com/192.168.1.10으로 표기하며 만약 도메인 앞에 점(.)을 붙이면 와일드카드처럼 사용하여 어떤 서브도메인이 와도 상관없다.)
- server : 구성할 DNS 서버가 요청받은 도메인 매핑 IP를 찾지 못하면 요청할 DNS 서버 주소를 표기
2. docker compose 구성
services:
dns:
image: jpillora/dnsmasq:latest
container_name: dns
ports:
- "53:53/udp"
- "8080:8080"
environment:
- HTTP_USER=admin
- HTTP_PASS=qwe123
volumes:
- ./dnsmasq/dnsmasq.conf:/etc/dnsmasq.conf
- ./dnsmasq/logs:/var/log/
restart: unless-stopped
위 docker compose 설정에서 유의해야하는 사항은 1단계에서 작성한 설정정보를 volumes 속성을 통해 정확하게 연결하는 것이다. (dnsmasq.conf 파일을 /etc/dnsmasq.conf 에 연결)
3. DNS 서버 실행
docker compose up [-d]
* -d 옵션은 detached mode(백그라운드 모드)로 컨테이너를 실행하는 옵션으로 compose의 컨테이너들이 백그라운드에서 실행
위 명령어를 사용해 Docker 컨테이너를 구동한다.
(이때, 이전에 작성한 설정에 문제가 없다면 DNS 서버 컨테이너는 정상적으로 실행된다.)
* 컨테이너 구성 옵션 작성 시 두번째 입력한 포트(8080)에 연결된 웹페이지로 실시간으로 로그를 확인하고 설정값을 변경 후 서버를 재시작할 수 있다.
4. 운영체제 DNS 변경 (클라이언트 설정) 및 테스트
구성된 DNS서버가 정상적으로 동작하는지 확인하기 위해 DNS 서버를 이용할 클라이언트의 네임서버를 변경한다. (테스트를 진행할 PC의 운영체제 DNS를 변경)
macOS / Linux
sudo networksetup -setdnsservers Wi-Fi 127.0.0.1
Windows
네트워크 설정 → IPv4 → DNS 서버 수동 입력 → 127.0.0.1 입력
( 제어판 > 모든 제어판 항목 > 네트워크 및 공유 센터 > 어댑터 설정 변경 > 사용 중인 인터넷 어댑터 우클릭 > 속성 > ‘인터넷 프로토콜 버전 4’에서 DNS 서버를 설정)
이제 명령프롬프트창(혹은 CLI)에서 nslookup 명령어를 통해 아래 이미지처럼 원하는 도메인에 IP가 설정된 것을 확인할 수 있다.
(localhost 서버를 통해 a.test.local의 Address 값을 확인)
Q. 클라이언트의 DNS 서버를 변경한 이유는?
nslookup 명령어를 실행하면 운영체제에 등록된 네임서버에 쿼리를 날리기 때문이다. 명령어 'nslookup <도메인> '뒤에 별도의 네임서버 주소를 파라미터로 입력해도 테스트에 문제는 없으나, 네임서버를 별도로 지정하지 않고 추후 활용을 위해서는 로컬서버(127.0.0.1)를 네임서버로 등록해야 한다.
Summary
Docker 기반 로컬 DNS 서버 구축 방법을 통해 개발 및 테스트 환경의 효율성을 크게 향상시킬 수 있다.
로컬 DNS 서버를 구성하면 개발 과정에서 자유로운 도메인 사용이 가능하며, 실제 도메인을 구매하지 않고도 도메인 기반 테스트를 수행할 수 있다는 실용적인 이점을 얻을 수 있다.
References
jpillora-dnsmasq overviews - https://hub.docker.com/r/jpillora/dnsmasq
https://hub.docker.com/r/jpillora/dnsmasq
hub.docker.com
github - https://github.com/JaewookMun/programming-exercise/tree/main/sockets/dns
programming-exercise/sockets/dns at main · JaewookMun/programming-exercise
practice framework or skill such as spring, jpa, and so on - JaewookMun/programming-exercise
github.com
'Server' 카테고리의 다른 글
대규모 서비스와 서비스의 규모 확장 전략 (2) | 2025.01.31 |
---|---|
Tomcat 환경설정 (server.xml) - 컨텍스트 경로 설정 (0) | 2023.04.09 |