Amazon EC2 Linux インスタンスで DNS 解決の障害を回避する方法を教えてください。
Amazon Elastic Compute Cloud (Amazon EC2) Linux インスタンスにおける、DNS 解決の障害を回避したいです。
簡単な説明
DNS 解決の障害を回避するには、DNS キャッシュを適用します、。
DNS キャッシュを使用して外部 DNS リソースをクエリすると、そのキャッシュは、再帰的 DNS クエリの大部分に対し、ローカルで応答します。このシナリオでは、キャッシュはネットワーク経由で DNS リゾルバーと通信しません。クエリ可能な外部 DNS リソース例を次に示します。
- Amazon Relational Database Service (Amazon 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 キャッシングサーバーの設定方法」を参照してください。
解決策
注: 次の解決手順では、DNS リゾルバーの IP アドレスには 169.254.169.253 を使用します。別の 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 は root ユーザーとして実行されます。ただし、起動後にユーザーは変更され、root 権限は削除されます。デフォルトでは、ユーザーは nobody です。
-
次のコマンドを実行して dnsmasq.conf ファイルのバックアップを作成します。
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.ori -
vim テキストエディタで /etc/dnsmasq.conf 設定ファイルを作成して開くには、次のコマンドを実行します。
sudo vim /etc/dnsmasq.conf注: /etc/dnsmasq.conf ファイルの変更には、任意のテキストエディタ (例: vi、nano) を使用できます。
-
次の内容を /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 逆引きは失敗します。さらに、このオプションが原因で、Dynamic Host Configuration Protocol (DHCP) リースファイルに対する DNS 逆引きも失敗します。DNS 逆引きを正常に行うには、bogus-priv をコメントアウトするか削除します。
-
/etc/resolv.dnsmasq ファイルを作成し、Amazon DNS サーバー または DHCP オプションセットで指定したカスタムドメイン名サーバーを設定します。次のコマンドを実行します。
sudo bash -c "echo 'nameserver 169.254.169.253' > /etc/resolv.dnsmasq"注: DNS サーバーの場所の詳細については、「DHCP について」を参照してください。Amazon マシンイメージ (AMI) を dnsmasq キャッシュを使用するインスタンスから作成する際、169.254.169.253 サーバーの場所を調整することで、他の CIDR に属する別の 仮想プライベートクラウド (VPC) 内で起動させることもできます。
-
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 は、デフォルトの DNS リゾルバーには systemd-networkd を使用します。
-
変更を適用するには、使用する 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 バッシュスクリプトを使用します。ファイルのダウンロードについては、GitHub のウェブサイトで AutomateDnsmasq.sh を参照してください。
- AutomateDnsmasq.cloudinit ディレクティブを使用します。ファイルのダウンロードについては、GitHub のウェブサイトで AutomateDnsmasq.cloudinit を参照してください。
他の Linux ディストリビューションで dnsmasq を自動インストールするには、上記のいずれかのファイルで必要なカスタマイズを行います。どちらのファイルでも、Amazon DNS サーバーの代替アドレス 169.254.169.253 を使用うると、ファイルを VPC インスタンスで実行できます。
起動時にいずれかのファイルを実行するには、ユーザーデータにファイルの内容を入力します。bash スクリプトの実行には、AWS Systems Manager の Run Commands を使用できます。ディレクティブは、初回起動時の初期化以外での使用は推奨されません。
Bash スクリプトをスタンドアロンスクリプトとして実行するには、次の手順を実行します:
-
スクリプトをインスタンスにダウンロードして実行可能にするには、次のコマンドを実行します。
wget https://raw.githubusercontent.com/awslabs/aws-support-tools/master/EC2/AutomateDnsmasq/AutomateDnsmasq.sh chmod +x AutomateDnsmasq.sh -
スクリプトを実行するには、次のコマンドを root ユーザーとして実行します。
sudo ./AutomateDnsmasq.sh
関連情報
関連するコンテンツ
- 質問済み 1年前
- 質問済み 1年前

