Amazon EC2 Linux 인스턴스에서 DNS 확인 실패를 방지하려면 어떻게 해야 합니까?
Amazon Elastic Compute Cloud(Amazon EC2) Linux 인스턴스에서 DNS 확인 실패를 방지하고 싶습니다.
간략한 설명
DNS 확인 실패를 방지하려면 DNS 캐시를 적용하십시오.
DNS 캐시를 사용하여 외부 DNS 리소스를 쿼리하면 캐시는 대부분의 반복 DNS 쿼리에 로컬로 응답합니다. 이 시나리오에서는 캐시가 네트워크를 통해 DNS 리졸버와 상호 작용하지 않습니다. 다음 예와 같은 외부 DNS 리소스를 쿼리할 수 있습니다.
- Amazon Relational Database Service(RDS)
- Amazon ElastiCache
- Amazon Simple Storage Service(Amazon S3)
모든 Amazon Linux 버전에서 다음 해결 단계를 사용할 수 있습니다. 다른 배포판을 사용하는 경우 해당 배포판의 설명서를 참조하십시오.
- Debian의 경우 Debian 웹 사이트의 로컬 캐싱을 참조하십시오.
- Ubuntu의 경우 Ubuntu 웹 사이트의 Dnsmasq를 참조하십시오.
- Red Hat Enterprise Linux(RHEL)의 경우 Red Hat 웹 사이트에서 RHEL에서 dnsmasq를 사용하여 DNS 캐싱 서버를 구성하는 방법을 참조하십시오.
해결 방법
참고: 다음 해결 단계에서는 169.254.169.253을 DNS 리졸버 IP 주소로 사용합니다. 다른 DNS 리졸버를 사용하는 경우 169.254.169.253을 DNS 리졸버 IP 주소로 바꾸십시오.
dnsmasq를 사용하여 로컬 DNS 캐시 설정
로컬 DNS 캐시를 설정하려면 dnsmasq를 사용하십시오. 자세한 내용은 thekelleys.org.uk 웹 사이트의 dnsmasq를 참조하십시오.
다음 단계를 완료하십시오.
-
다음 명령을 실행하여 dnsmasq 서버를 설치합니다.
sudo yum install -y dnsmasq -
인스턴스가 Amazon Linux 2023(AL2023)에서 실행되는 경우 3단계로 진행합니다. dnsmasq를 실행할 전용 시스템 사용자를 만들려면 다음 명령을 실행합니다.
sudo groupadd -r dnsmasq sudo useradd -r -g dnsmasq dnsmasq참고: dnsmasq는 일반적으로 루트 사용자로 실행됩니다. 그러나 시작 후 사용자가 변경되고 루트 권한이 삭제됩니다. 기본적으로 사용자는 nobody입니다.
-
다음 명령을 실행하여 dnsmasq.conf 파일의 백업을 만듭니다.
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.ori -
vim 텍스트 편집기로 /etc/dnsmasq.conf 구성 파일을 만들고 열려면 다음 명령을 실행합니다.
sudo vim /etc/dnsmasq.conf참고: vi 또는 nano와 같은 텍스트 편집기를 사용하여 /etc/dnsmasq.conf 파일을 수정할 수 있습니다.
-
/etc/dnsmasq.conf 파일에 다음 내용을 입력합니다.
# Server Configuration listen-address=127.0.0.1 port=53 bind-interfaces user=dnsmasq group=dnsmasq pid-file=/var/run/dnsmasq.pid # Name resolution options resolv-file=/etc/resolv.dnsmasq cache-size=500 neg-ttl=60 domain-needed bogus-priv참고: dnsmasq의 bogus-priv 옵션으로 인해 /etc/hosts에 없는 프라이빗 IP 주소 범위에 대한 역방향 DNS 조회가 실패합니다. 또한 이 옵션을 사용하면 DHCP(Dynamic Host Configuration Protocol) 임대 파일에 대한 역방향 DNS 조회가 실패할 수 있습니다. 역방향 조회를 성공적으로 수행하려면 bogus-priv를 주석 처리하거나 제거합니다.
-
/etc/resolv.dnsmasq 파일을 만들고 Amazon DNS 서버 또는 DHCP 옵션 세트에 지정한 사용자 지정 도메인 이름 서버를 설정합니다. 다음 명령을 실행합니다.
sudo bash -c "echo 'nameserver 169.254.169.253' > /etc/resolv.dnsmasq"참고: DNS 서버 위치에 대한 자세한 내용은 DHCP란?을 참조하십시오. 또한 dnsmasq 캐시가 있는 인스턴스에서 Amazon Machine Image(AMI)를 만들어 다른 CIDR을 사용하는 또 다른 가상 프라이빗 클라우드(VPC)에서 시작할 때 169.254.169.253 서버 위치를 조정할 수 있습니다.
-
dnsmasq 서버를 다시 시작하고 부팅 시 서비스가 시작되도록 설정하려면 배포판에 따라 다음 명령 중 하나를 실행합니다.
Amazon Linux 1(AL1):sudo service dnsmasq restart sudo chkconfig dnsmasq onAmazon Linux 2(AL2) 및 AL2023:
sudo systemctl restart dnsmasq.service sudo systemctl enable dnsmasq.service -
dnsmasq가 올바르게 작동하는지 확인하려면 다음 명령을 실행합니다.
dig aws.amazon.com @127.0.0.1응답이 다음 예와 비슷하면 dnsmasq 캐시가 제대로 작동하는 것입니다.
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.13.11 <<>> aws.amazon.com @127.0.0.1 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33958 ;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;aws.amazon.com. IN A ;; ANSWER SECTION: aws.amazon.com. 300 IN CNAME tp.8e49140c2-frontier.amazon.com. tp.8e49140c2-frontier.amazon.com. 9 IN CNAME dr49lng3n1n2s.cloudfront.net. dr49lng3n1n2s.cloudfront.net. 59 IN A 108.158.61.67 dr49lng3n1n2s.cloudfront.net. 59 IN A 108.158.61.79 dr49lng3n1n2s.cloudfront.net. 59 IN A 108.158.61.96 dr49lng3n1n2s.cloudfront.net. 59 IN A 108.158.61.102 ;; Query time: 2 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ... -
dnsmasq DNS 캐시를 기본 DNS 리졸버로 설정합니다.
참고: DHCP에서 제공하는 기본 DNS 리졸버를 억제해야 합니다. 이렇게 하려면 /etc/dhcp/dhclient.conf 파일을 변경하거나 만드십시오.
AL2의 경우 다음 명령을 실행합니다.sudo bash -c "echo 'supersede domain-name-servers 127.0.0.1, 169.254.169.253;' >> /etc/dhcp/dhclient.conf"AL2023의 경우 다음 명령을 실행합니다.
sudo bash -c 'echo "DNS=127.0.0.1" >> /etc/systemd/resolved.conf' sudo bash -c 'echo "DNS=169.254.169.253" >> /etc/systemd/resolved.conf'참고: AL2023은 systemd-networkd를 기본 DNS 리졸버로 사용합니다.
-
변경 사항을 적용하려면 Linux 배포판에 따라 다음 명령을 실행합니다.
AL2:
sudo dhclient
AL2023:
sudo systemctl restart systemd-resolved.service
-또는-
네트워크 서비스를 다시 시작하려면, 다음 명령을 실행합니다.
sudo systemctl restart network
-또는-
인스턴스를 재부팅하려면 다음 명령을 실행합니다.
sudo reboot
- 다음 명령을 실행하여 인스턴스가 DNS 캐시를 사용하는지 확인합니다.
dig aws.amazon.com
출력에 응답 서버가 127.0.0.1인 것으로 표시되면 DNS 캐시가 제대로 작동하는 것입니다.
출력 예시:
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.13.11 <<>> aws.amazon.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29129 ;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;aws.amazon.com. IN A ;; ANSWER SECTION: aws.amazon.com. 297 IN CNAME tp.8e49140c2-frontier.amazon.com. tp.8e49140c2-frontier.amazon.com. 25 IN CNAME dr49lng3n1n2s.cloudfront.net. dr49lng3n1n2s.cloudfront.net. 41 IN A 108.158.61.102 dr49lng3n1n2s.cloudfront.net. 41 IN A 108.158.61.96 dr49lng3n1n2s.cloudfront.net. 41 IN A 108.158.61.79 dr49lng3n1n2s.cloudfront.net. 41 IN A 108.158.61.67 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) <------------- ...
새 인스턴스에 대한 dnsmasq 자동화
Amazon Linux에서 DNS 리졸버로 dnsmasq의 설치 및 구성을 자동화하려면 다음 옵션 중 하나를 사용하십시오.
- AutomateDnsmasq.sh bash 스크립트를 사용합니다. 파일을 다운로드하려면 GitHub 웹 사이트에서 AutomateDnsmasq.sh를 참조하십시오.
- AutomateDnsmasq.cloudinit 지시문을 사용합니다. 파일을 다운로드하려면 GitHub 웹 사이트에서 AutomateDnsmasq.cloudinit를 참조하십시오.
다른 Linux 배포판에서 dnsmasq 설치를 자동화하려면 위 파일 중 하나를 사용하여 필요한 사용자 지정을 수행하십시오. 어떤 파일이든 169.254.169.253 Amazon DNS 서버 대체 주소를 사용하면 VPC 인스턴스에서 파일을 실행할 수 있습니다.
시작 시 두 파일 중 하나를 실행하려면 사용자 데이터에 파일 내용을 입력합니다. AWS Systems Manager 실행 명령을 사용하여 bash 스크립트를 실행할 수 있습니다. 지시문은 최초 부팅 초기화에만 사용하는 것이 좋습니다.
Bash 스크립트를 독립형 스크립트로 실행하려면 다음 단계를 완료하십시오.
-
인스턴스에 스크립트를 다운로드하고 실행 가능하게 만들려면 다음 명령을 실행합니다.
wget https://raw.githubusercontent.com/awslabs/aws-support-tools/master/EC2/AutomateDnsmasq/AutomateDnsmasq.sh chmod +x AutomateDnsmasq.sh -
스크립트를 실행하려면 루트 사용자로 다음 명령을 실행합니다.
sudo ./AutomateDnsmasq.sh

