AWS VPC환경에서 dnsmasq를 이용한 local dns cache 구현

배경


AWS VPC환경의 ec2에서 실행되는 애플리케이션에서 DNS질의에 실패하는 사례가 발생함

원인


AWS VPC환경에서 제공하는 DNS에는 초당 1024개의 패킷만 허용하게 되어있음. 이 한도를 초과하는 트레픽은 거부하게 됨

Understanding Amazon DNS - Amazon Virtual Private Cloud
As an AWS architect or administrator, one of the foundational networking components you’ll encounter is the Amazon DNS server, also known as the Route 53 Resolver. This DNS resolver service is natively integrated into each Availability Zone within your AWS Region, providing a reliable and scalable solution for domain name resolution within your Virtual Private Cloud (VPC). In this section you’ll learn about the Amazon DNS server’s IP addresses, the private DNS hostnames it can resolve, and the rules that govern its usage.

개선방안


각 서버별 dns cache를 설치하여 local dns caching을 활성화 함

환경


  • RHEL 계열 리눅스
  • dnsmasq 패키지
  • Amazon Linux여기를 참고 하세요

구현


Install dnsmasq

dnf -y install dnsmasq bind-utils

configure dnsmsaq

    • ~~domain-needed : 도메인이 없는 쿼리(예: localhost, 단순 문자열)가 외부 DNS 서버로 전달되지 않도록 합니다.~~
      • 도메인 이름이 없는 요청을 거부하고, 로컬에서만 처리하도록 제한합니다.
      • 예를 들어, ping test와 같은 쿼리는 무시되고, test.com과 같은 완전한 도메인만 외부 DNS로 전달됩니다.
    • ~~interface=lo : dnsmasq가 로컬 루프백 인터페이스(lo)에서만 동작하도록 설정합니다.~~
      • ~~dnsmasq가 네트워크 인터페이스를 제한적으로 사용하도록 합니다.~~
      • 외부 네트워크로의 접근을 막고, 오직 로컬 시스템에서의 DNS 요청만 처리합니다.
    • ~~bind-interfaces : 지정된 인터페이스(interface=lo)에만 바인딩 하도록 설정합니다.~~
      • 다중 네트워크 인터페이스가 있는 시스템에서 특정 인터페이스만 dnsmasq가 처리하게 합니다.
      • 예를 들어, 다른 네트워크 카드에서 들어오는 요청을 무시합니다.
    • ~~listen-address=127.0.0.1 : dnsmasq가 지정된 IP주소(127.0.0.1)에서만 요청을 수신하도록 설정합니다.~~
      • 로컬 시스템에서만 DNS 요청을 허용하며 외부 요청은 차단됩니다.
    • ~~cache-size=1000 : DNS 캐시 크기를 1000개 항목으로 제한합니다.~~
      • 최대 1000개의 DNS 레코드를 캐싱하여 동일한 요청이 반복될 때 외부 DNS 서버로의 요청을 줄입니다.
      • 캐시 크기를 너무 작게 설정하면 성능 저하가 발생할 수 있습니다.
    • ~~resolv-file=/etc/resolv.dnsmasq : dnsmasq가 외부 DNS 서버를 참조할 때 사용하는 파일을 /etc/resolv.dnsmasq로 설정합니다.~~
      • 기본적으로 /etc/resolv.conf를 참조하지만, 이 설정으로 대체 파일을 지정할 수 있습니다.
      • 예를 들어, /etc/resolv.dnsmasq 파일에 특정 DNS 서버를 명시하여 외부 서버를 제어할 수 있습니다.
    • ~~no-poll : 외부 DNS 서버를 참조하는 파일(/etc/resolv.dnsmasq)의 변경 여부를 주기적으로 확인하지 않도록 설정합니다.~~
      • ~~dnsmasqresolv-file의 변경 사항을 확인하기 위해 파일을 지속적으로 폴링(polling)하는 것을 방지 합니다.~~
      • 변경이 필요하면 dnsmasq를 수동으로 다시 시작해야 합니다.
    • ~~log-queries : 처리된 모든 DNS요청을 로깅합니다.~~
      • ~~DNS 요청을 실시간으로 모니터링하거나 디버깅 목적으로 로그에 기록합니다.~~
      • 예를 들어, 어떤 도메인이 자주 요청이되는지 확인할 수 있습니다.
      • 운영 환경에는 주석처리를 권장
    • ~~log-facility=/var/log/dnsmasq.log : 로그 파일의 저장 위치를 /var/log/dnsmasq.log로 지정합니다.~~
      • ~~dnsmasq의 로그가 지정된 파일에 기록됩니다.~~
      • 기본적으로 syslog를 사용하지만, 별도의 파일을 지정하여 관리할 수 있습니다.
    • ~~/etc/resolv.dnsmasq 파일의 169.254.169.253AWS VPC의 각 가용 영역에 내장된 DNS Resolver 서비스 입니다. 관련 내용은 링크를 참고 하세요~~

dnsmasq 실행

~~systemctl enable dnsmasq && systemctl start dnsmasq~~

모든 DNS 쿼리를 루프백 인터페이스로 보내기도록 /etc/resolv.conf 파일을 수정 합니다.

~~echo "options edns0" >> /etc/resolv.conf~~

~~options edns0 설정은 EDNS0(Extension Mechanisms for DNS 0) 기능을 활성화하는 데 사용되는 옵션입니다. 자세한 내용은 아래 링크를 참고 하세요~~

~~https://linux.die.net/man/5/resolv.conf https://datatracker.ietf.org/doc/html/rfc2671~~

설정 파일 /etc/dnsmasq.conf/etc/resolv.dnsmasq 파일을 생성합니다. /etc/resolv.dnsmasq 파일은 dnsmasq 서비스가 쿼리할 상위 DNS 서버의 IP주소를 입력합니다.

~~cp /etc/dnsmasq.conf /etc/dnsmasq.conf.ori

cat << EOF > /etc/dnsmasq.conf
# Server Configuration
domain-needed
interface=lo
bind-interfaces
listen-address=127.0.0.1
cache-size=1000
resolv-file=/etc/resolv.dnsmasq
no-poll
# log-queries
# log-facility=/var/log/dnsmasq.log
EOF

echo "nameserver 169.254.169.253" > /etc/resolv.dnsmasq~~

dnsmasq를 NetworkManager 제어 하에 실행되도록 구성

    • domain-needed : 도메인이 없는 쿼리(예: localhost, 단순 문자열)가 외부 DNS 서버로 전달되지 않도록 합니다.
      • 도메인 이름이 없는 요청을 거부하고, 로컬에서만 처리하도록 제한합니다.
      • 예를 들어, ping test와 같은 쿼리는 무시되고, test.com과 같은 완전한 도메인만 외부 DNS로 전달됩니다.
    • cache-size=1000 : DNS 캐시 크기를 1000개 항목으로 제한합니다.
      • 최대 1000개의 DNS 레코드를 캐싱하여 동일한 요청이 반복될 때 외부 DNS 서버로의 요청을 줄입니다.
      • 캐시 크기를 너무 작게 설정하면 성능 저하가 발생할 수 있습니다.
    • server=169.254.169.253 : 모든 도메인을 169.254.169.253으로 전달
      • 특정 도메인이나 그룹을 특정 DNS서버로 전달합니다.
      • 예를 들어 server=/example.com/192.168.1.1 은 모든 example.com 하위 도메인(www.example.com, api.example.com)을 192.168.1.1 DNS로 전달하고 이 외에 요청은 기본 DNS 서버로 전달합니다.

NetworkManager를 재시작 또는 서버를 재부팅 합니다.

systemctl restart NetworkManager
또는(가능하다면?)
reboot

dnsmasq 설정파일 추가

cat << EOF > /etc/NetworkManager/dnsmasq.d/custom.conf
server=169.254.169.253
cache-size=1000
domain-needed
# log-queries
# log-facility=/var/log/dnsmasq.log
EOF

dnsmasq를 통해 DNS 캐싱을 활성화하도록 NetworkManager를 구성하는 파일(/etc/NetworkManager/conf.d/dns.conf)을 만듭니다.

cat << EOF > /etc/NetworkManager/conf.d/dns.conf
[main]
dns=dnsmasq
EOF

검증

dnsmasq 설치 후 dns 질의는?

localhost의 dnsmasq에 질의함.

dnsmasq 가 설치 되지 않는 경우 dns질의는?

당연히 AWS에서 제공된 resolver에 질의함

Read more

매번 헷갈리는 RPO와 RTO

RPO와 RTO는 재해 복구(DR) 계획을 세울때 가장 핵심이 되는 지표 입니다. 용어가 비슷해서 헷갈리기 쉽지만, 어느 시점의 데이터로 돌아갈 것인가(RPO) 와 얼마나 빨리 복구할 것인가(RTO)의 차이로 이해하시면 쉽습니다. 백업 정책 예를 통해 살펴 봅시다. 운영중인 데이터베이스 서버가 있다고 가정합니다. 백업 정책은 아래와 같습니다. * 일 4회(6시간

By Onlab

[Monitoring] zabbix 2편: zabbix agent 설치하기

zabbix 서버는 zabbix agent, SNMP 등을 통해 원격 컴퓨터를 모니터링 합니다. 앞서 zabbix 서버 설치에 대해 다루어 보았는데 이번에는 zabbix-agent 설치에 대해서 다루어 보겠습니다. agent는 두가지 버전을 제공합니다. zabbix-agent와 zabbix-agent2 로 나뉘어 있습니다. agent2가 차세대 버전쯤으로 생각하면 됩니다. 자세한 내용은 아래 링크를 참고하세요. 15 Agent vs agent 2 comparisonDocs 이

By Onlab

[Monitoring] zabbix 1편: zabbix server 설치하기

엔터프라이즈급 오픈소스 모니터링 솔루션인 zabbix를 설치하고 초기 설정 하는 방법을 알아보겠습니다. 서버 대수가 늘어날수록 서비스 상태를 일일이 확인하는 것은 불가능에 가깝습니다. zabbix를 이용하면 서버의 CPU, 메모리, 트레픽 상태는 물론 장애 발생 시 실시간 알림까지 받을 수 있는 스마트한 환경을 구축할 수 있습니다. zabbix 란 무엇인가요? zabbix는 네트워크 서비스, 서버, 하드웨어

By Onlab

[Tip]터미널에서 AWS Profile 전환을 효율적으로 하는 방법

개요 aws cli를 사용할 때 profile 기능을 이용하면 여러개의 자격 증명을 등록하고 스위칭 해서 효율적으로 사용할 수 있다. default 프로파일을 사용하는 것은 human error 를 초래할 수 있어 권장되지 않아 cli를 사용할때 매번 --profile 옵션을 추가해야 하는 번거로움이 발생한다. 이 같은 번거로움을 조금이라도 회피해 보고자 합니다. AWS CLI의 default profile

By Onlab