Ubuntu에서 dnsmasq를 사용하여 DNS 캐싱을 설정하는 방법
DNSmasq는 리눅스 배포판에서 DNS 요청을 캐시하는 데 유용한 도구입니다. 하지만 설정 과정이 다소 복잡할 수 있습니다.
DNS 캐싱은 웹사이트의 도메인 이름을 해당 IP 주소로 변환하는 DNS 조회 과정을 가속화하는 기술입니다. 여러 사용자가 동일한 웹사이트 주소에 접속할 때 로컬 DNS 캐시 서버를 활용하면 웹페이지 로딩 시간을 단축할 수 있습니다.
먼저 DNS 캐싱이 무엇인지 자세히 알아보겠습니다.
DNS 캐싱이란?
DNS는 인터넷상의 모든 웹사이트와 그에 연결된 IP 주소를 기록하는 데 사용됩니다. 마치 전화번호부와 비슷하다고 할 수 있습니다. DNS 덕분에 네트워크 인프라는 인터넷 사이트와 상호 작용하는 데 필요한 각 사이트의 IP 주소를 일일이 기억할 필요가 없습니다.
검색 엔진을 통해 웹 페이지를 요청할 때, 이러한 과정이 실제로 배후에서 이루어집니다.
시스템은 여러 외부 DNS 서버에 접근할 수 있지만, DNS 중앙 복제본이 있으면 전송 및 확인 속도가 더욱 빨라집니다. 이때 DNS 캐싱이 핵심적인 역할을 합니다.
DNS 캐시는 웹 요청이 전송되기 전에 최근에 자주 접속한 도메인의 ID 확인을 처리하여 절차를 훨씬 빠르게 만듭니다.
DNS 서버는 IP 주소를 도메인 이름으로 변환해야 할 때마다 접속해야 합니다. 이는 특히 웹사이트에 동시 요청이 몰릴 경우 DNS 서버에 추가 부담을 줄 수 있습니다.
DNS 캐시는 DNS 요청 및 응답 시간을 단축하는 데 활용됩니다. 확인된 IP 주소는 호스트 정보와 함께 로컬에 저장됩니다. 따라서 다음번에 IP 주소나 도메인 이름을 확인해야 할 때, 새로운 DNS 쿼리를 시작하는 대신 DNS 캐시 메모리에서 결과가 검색됩니다.
DNS 캐싱은 Amazon EC2 인스턴스에서 간헐적인 DNS 해결 문제를 어떻게 해결할 수 있을까요?
대부분의 리눅스 시스템은 로컬 DNS 캐시를 사용하지 않습니다. 이는 모든 DNS 요청이 아마존에서 제공하는 권한 있는 DNS 리졸버로 직접 전송됨을 의미하며, 이는 한 번에 처리할 수 있는 요청 수에 제한이 있다는 뜻입니다. DNS 확인 문제는 요청이 몰릴 때 발생하기 쉽습니다.
시스템에 로컬 DNS 캐시를 구축하면 DNS 확인 오류를 방지하는 동시에 CPU 및 네트워크 사용률을 줄이는 데 도움이 됩니다. 로컬 DNS 캐시는 Amazon RDS 및 S3와 같은 외부 DNS 리소스에 대한 쿼리에 빠르게 응답할 수 있습니다.
DHCP 프로토콜은 Amazon VPC에 연결된 Amazon EC2 인스턴스가 시작되는 동안 DNS 서버 주소를 요청하는 데 사용됩니다.

Amazon VPC를 사용하여 가상 사설 클라우드를 구성할 때, Route 53 DNS Resolver는 VPC의 리졸버를 효율적으로 활용하여 로컬 Amazon VPC 웹 주소 및 개인 관리 영역의 항목에서 실행되는 EC2 인스턴스에 대한 DNS 요청에 응답합니다. 리졸버는 추가 웹 주소에 대해 공용 DNS 서버에서 반복적으로 조회를 수행합니다.
DNS 캐시는 시스템이 웹사이트에 접속을 시도하는 동안 빠르게 검사할 수 있는 이전 DNS 쿼리의 임시 기록 역할을 합니다. 모든 기존 및 후속 세션의 로그를 관리하며, 이를 통해 도메인 확인을 간소화하고 Amazon EC2 리눅스 인스턴스에서 발생하는 오류를 줄일 수 있습니다.
많은 사용자가 AWS에 접속할 때 DNS 용도로 Amazon의 Route 53 서비스를 이용합니다. 이는 사용이 간편하고 거의 무료이기 때문입니다. 하지만 로컬 DNS 서버를 사용하고자 하는 사용자에게는 다른 이유들이 존재할 수 있습니다.
bind9도 여전히 로컬 DNS 캐시 서버를 설정하는 데 좋은 옵션이지만, dnsmasq는 EC2 인스턴스 및 로컬 머신 모두에 설치하고 구성하는 것이 훨씬 간단합니다.
dnsmasq란 무엇인가요?
DNSmasq는 DNS, DHCP, TFTP 및 DNS 캐싱 기능을 제공하는 리눅스 기반 유틸리티입니다. 크기가 작고 가벼워서 리소스가 제한된 네트워크 및 방화벽 환경에 이상적입니다.
설치 및 구성이 매우 간단하며, 서브넷에 DNS와 DHCP를 설정하기 위한 유연하고 실용적인 솔루션을 제공합니다.
각 서버 또는 기본 컨트롤러에 대한 DHCP 할당 식별자 및 관련 지침을 설정할 수 있습니다. 동적 및 정적 DHCP 옵션 모두 dnsmasq에서 지원됩니다. 또한 이식성이 뛰어나며 최소 1,000개의 클라이언트에 대한 DNS 및 DHCP를 관리할 수 있습니다.
DNS 쿼리가 수신되면 dnsmasq는 로컬 캐시에서 응답하거나, 해당 쿼리를 권한 있는 DNS 서버로 전달합니다. DHCP 구성에 따라 주소에 대한 DNS 요청에 응답하는 것 외에도 /etc/hosts 파일의 내용을 참조하여 공용 DNS에 나열되지 않은 로컬 호스트 이름을 식별합니다.
브라우저에 내장된 DNS 캐시 대신 dnsmasq 도구를 사용하면 인터넷 검색 성능을 크게 향상시킬 수 있습니다. 설정이 간편하고 디스크 공간을 거의 차지하지 않아 리소스가 제한된 환경에 적합합니다.
dnsmasq의 특징
- 특정 도메인 이름 확인 쿼리를 지정된 권한 있는 서버로 전송하도록 구성하여 dnsmasq를 통해 내부 DNS 서버를 통합하는 것이 간단합니다.
- 구성된 로컬 DNS 서버를 사용하여 서버의 작업량을 줄이고 안정성을 향상시킬 수 있습니다.
- 방화벽이 활성화된 엔드포인트에 대한 DNS 구성은 ISP에서 사용하는 DNS와 독립적으로 비교적 쉽게 설정할 수 있습니다.
- 컴퓨터에서 DNS 확인을 수행하는 동안 인터넷 연결 포트에 접속할 수 없는 경우, 조회 작업이 즉시 중단됩니다.
- PPP(지점간 프로토콜) 또는 DHCP 쿼리를 통해 dnsmasq를 설정하여 기본 도메인 확인 서버에서 직접 데이터를 정기적으로 수집하도록 할 수 있습니다.
설치
dnsmasq 유틸리티를 설치하고 구성하기 전에 systemd-resolved 서비스를 비활성화해야 합니다.
systemctl stop systemd-resolved
재부팅 시 자동으로 시작되지 않도록 마스크 속성을 사용하여 숨길 수도 있습니다.
systemctl mask systemd-resolved
systemd-resolved를 비활성화한 후 dnsmasq 설치를 진행해야 합니다. DNSmasq는 대부분의 리눅스 배포판에 기본적으로 포함되어 제공되지만, 없는 경우 수동으로 설치할 수 있습니다. 터미널을 실행하고 다음 명령을 입력하여 설치를 진행합니다.
sudo apt-get install dnsmasq
yum을 사용하는 경우 다음 명령을 사용하십시오.
sudo yum install -y dnsmasq
이 명령은 도구를 자동으로 설치하고 백그라운드에서 dnsmasq를 시작합니다.

설치가 성공적으로 완료되면 다음 명령어를 통해 dnsmasq의 상태를 확인할 수 있습니다.
systemctl status dnsmasq
상태가 "활성(실행 중)"으로 표시되면 설치가 완료되고 포트 53으로 구성되었음을 의미합니다. 만약 상태가 "비활성(죽음)"으로 표시되면 Ubuntu 시스템과 dnsmasq를 재시작해야 합니다. 이렇게 하면 문제가 해결될 수 있습니다.

구성
이제 Dnsmasq를 로컬 캐싱 DNS 서버로 컴퓨터에 설정할 준비가 되었습니다. 기본 구성 파일은 /etc/dnsmasq.conf에 있습니다. 시스템에서 dnsmasq를 설정하려면 이 구성 파일을 수정해야 합니다.
다음 명령을 사용하여 구성 파일을 열고 편집합니다.
nano /etc/dnsmasq.conf
구성 파일은 루트 권한으로만 편집해야 합니다. 주석을 포함하여 파일의 모든 내용을 삭제하고 다음 구성 설정을 복사하여 붙여넣고 저장하면 됩니다.
port=53 domain-needed bogus-priv listen-address=127.0.0.1 expand-hosts domain=geek-demo.com cache-size=1000
각 매개변수가 의미하는 바를 간략하게 설명하겠습니다.
- 포트 – Dnsmasq가 DNS 요청을 수신하는 데 사용할 포트를 지정하거나 바인딩합니다.
- domain-needed – 도메인 이름만 업스트림 DNS 서버로 전달합니다.
- bogus-priv – 도메인 및 포트 전달을 방지합니다.
- listen-address – 네임서버 주소를 정의합니다. 일반적으로 로컬 DNS 서버를 설정하기 위해 기본적으로 localhost가 사용됩니다.
- 도메인 – dnsmasq가 짧은 식별자에 추가하는 도메인을 구성합니다.
- cache-size – 스토리지에서 허용되는 최대 DNS 캐싱 크기를 설정합니다.

필요한 모든 변경을 마친 후 구성 파일을 저장하고 닫습니다. 다음 단계는 /etc/resolv.conf 파일을 편집하여 로컬 호스트 확인 주소를 추가하는 것입니다. 다음 명령을 사용하여 nano 편집기로 파일을 엽니다.
nano /etc/resolv.conf
여기에서 시스템이 주소 확인에 사용하는 모든 네임서버를 확인할 수 있습니다. 해당 목록에 루프백 주소도 추가해야 합니다. "nameserver 127.0.0.1"을 추가하고 첫 번째 줄에 위치하도록 합니다.

구성 파일을 저장하고 종료합니다. 업데이트된 설정을 적용하기 위해 dnsmasq 유틸리티를 다시 시작합니다.
systemctl restart dnsmasq
로컬 DNS 캐싱 서버 테스트
로컬 DNS 서버를 테스트하는 것은 매우 간단합니다. 명령줄을 열고 dig 명령을 사용하여 DNS 캐싱을 확인할 수 있습니다. 처음 dig 명령을 실행할 때 결과는 일반적이어야 합니다.
┌──(root💀kali)-[/home/writer] └─# dig koreantech.org.com 1 ⚙ ; <<>> DiG 9.18.0-2-Debian <<>> koreantech.org.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 623 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;koreantech.org.com. IN A ;; ANSWER SECTION: koreantech.org.com. 227 IN A 172.66.43.163 koreantech.org.com. 227 IN A 172.66.40.93 ;; Query time: 31 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP) ;; WHEN: Sat Oct 15 07:52:49 EDT 2022 ;; MSG SIZE rcvd: 74
여기에서 업스트림 네임서버에서 세부 정보를 조회하는 데 약 31msec의 시간이 걸린다는 것을 알 수 있습니다. 동일한 dig 명령을 다시 한번 실행하면 쿼리 시간이 크게 단축되는 것을 확인할 수 있습니다.
┌──(root💀kali)-[/home/writer] └─# dig koreantech.org.com 1 ⚙ ; <<>> DiG 9.18.0-2-Debian <<>> koreantech.org.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21942 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;koreantech.org.com. IN A ;; ANSWER SECTION: koreantech.org.com. 281 IN A 172.66.40.93 koreantech.org.com. 281 IN A 172.66.43.163 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP) ;; WHEN: Sat Oct 15 07:58:10 EDT 2022 ;; MSG SIZE rcvd: 74
여기서는 쿼리 시간이 0msec입니다. 이는 첫 번째 검색 후 dnsmasq가 데이터를 저장했고, 이후에 수행된 모든 조회는 저장된 캐시 덕분에 즉각적으로 이루어졌다는 것을 의미합니다. 저장된 DNS 캐시를 삭제하려면 dnsmasq를 재시작해야 합니다.
마무리
본 글에서는 dnsmasq를 로컬 DNS 서버로 설정하고 구성하는 방법을 살펴보았습니다. 또한 다른 운영 체제에서 더 빠른 브라우징을 위해 DNS 서버를 변경하는 방법에 대해서도 관심을 가질 수 있습니다.