[Server] 로컬 DNS 서버에서 wildcard 사용하기 - DNSmasq
맥에서 /etc/hosts 파일은 도메인과 IP 주소를 직접 매핑하는 데 사용되는 간단한 로컬 DNS 서비스이다. example.com 도메인의 IP 주소를 192.0.2.1로 매핑하는 항목을 /etc/hosts 파일에 추가하면 example.com 도메인에 대한 요청이 있을 때, 로컬 시스템은 /etc/hosts 파일에서 매핑 정보를 찾아 해당 IP 주소로 요청을 전달한다. 나는 로컬 개발환경에서 서브도메인을 사용해야 했는데 hosts 파일에서도 aaaa.example.com 처럼 서브도메인 설정이 가능하지만 wildcard(*.example.com) 형식은 지원하지 않는다. 다양한 서브도메인 테스트가 필요했는데 그때마다 하드코딩 할 수 없었기 때문에 dnsmasq를 사용해 로컬 개발환경에서 wildcard 서브 도메인을 사용하게 되었다.
DNSmasq
dnsmasq는 작은 규모의 네트워크에서 DNS, DHCP, PXE 부팅, TFTP 등을 제공하기 위해 사용하는 소프트웨어로, 대부분의 경우 dnsmasq는 다른 네트워크 서비스와 함께 사용되어 네트워크의 기능을 확장하는 데 사용된다. 다양한 경우에 사용이 가능한데 로컬 DNS 서버 dnsmasq는 로컬 DNS 서버로 사용될 수 있다. 예를 들어, 사용자가 "aaaa.example.com"이라는 서브 도메인을 사용하고 싶을 때, dnsmasq를 사용하여 해당 서브 도메인을 로컬 호스트로 매핑할 수 있다.
dnsmasq 설치
맥에서 brew를 사용해 설치 가능하다.
brew install dnsmasq
dnsmasq 구성
wildcard 형식 도메인과 로컬 호스트 주소를 dnsmasq 설정 파일에 추가해주어야 한다.
echo 'address=/.example.com/127.0.0.1' >> $(brew --prefix)/etc/dnsmasq.conf
👉🏻 echo 명령의 인수로 사용하여 address 지시어를 dnsmasq 구성 파일에 추가한다. $(...) 구문은 명령의 출력을 명령어 자체에 포함시키는 셸 확장으로, $(brew --prefix)는 Homebrew 설치 디렉토리의 경로를 자동으로 얻을 수 있다.
DNS 설정
/etc/resolv.conf 파일을 수정하여 dnsmasq 서버를 사용하도록 설정주어야 한다.
#/etc/resolv.conf 파일을 생성
sudo touch /etc/resolv.conf
# 파일 수정
sudo vim /etc/resolv.conf
#해당 내용 작성
nameserver ::1
nameserver 127.0.0.1
dnsmasq 재시작
sudo brew services start dnsmasq
추가 단계 (선택 사항)
도메인 명이 localhost가 아닌 경우,운영체제에서는 이 도메인 이름을 인식하지 못하기 때문에 /etc/hosts 파일에 해당 도메인 명을 추가해주어야 한다.
sudo bash -c 'echo "127.0.0.1 example.com" >> /etc/hosts'
위에서 이야기 했던것 처럼 /etc/hosts 파일은 로컬 시스템의 네트워크 설정 파일로, IP 주소와 도메인명의 매핑 정보를 저장한다. 만약 /etc/hosts 파일에 localhost 이외에 사용하고싶은 도메인 명을 추가하지 않으면, 로컬 시스템에서 해당 도메인 명으로 접속 시도를 할 때 운영체제는 DNS 서버로 해당 도메인 명에 대한 조회 요청을 보내게 된다.
하지만, 우리가 설정한 dnsmasq 서비스는 로컬에서 동작하는 DNS 서비스이므로, 로컬에서 사용하는 서브도메인에 대한 DNS 요청은 우리가 설정한 dnsmasq 서비스로 보내야 한다. 따라서 /etc/hosts 파일에 해당 도메인 명을 추가하여, 로컬에서 해당 도메인 명으로 접속 시도 시 DNS 서버를 통하지 않고 바로 우리가 설정한 dnsmasq 서비스로 요청이 전달되도록 설정해야 해야 한다.
정상 동작 여부 확인
nslookup으로 확인 가능하다.
nslookup aaaa.example.com
이 과정까지 거치고 브라우저에 "aaaa.example.com"입력하면 로컬 호스트의 IP 주소로 전환된다.