AWS VPC환경에서 dnsmasq를 이용한 local dns cache 구현
배경
AWS VPC환경의 ec2에서 실행되는 애플리케이션에서 DNS질의에 실패하는 사례가 발생함
원인
AWS VPC환경에서 제공하는 DNS에는 초당 1024개의 패킷만 허용하게 되어있음. 이 한도를 초과하는 트레픽은 거부하게 됨
개선방안
각 서버별 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)의 변경 여부를 주기적으로 확인하지 않도록 설정합니다.~~~~dnsmasq가resolv-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.253은AWS 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에 질의함