スキップしてコンテンツを表示

Amazon EC2 Linux インスタンスで DNS 解決の障害を回避する方法を教えてください。

所要時間4分
0

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 のすべてのバージョンに適用できます。他のディストリビューションを使用している場合は、そのディストリビューションのドキュメントを参照してください。

解決策

注: 次の解決手順では、DNS リゾルバーの IP アドレスには 169.254.169.253 を使用します。別の DNS リゾルバーを使用する場合は、169.254.169.253 をその DNS リゾルバーの IP アドレスに置き換えてください。

dnsmasq を使用してローカル DNS キャッシュを設定する

ローカル DNS キャッシュを設定するには、dnsmasq を使用します。詳細については、thekelleys.org.uk ウェブサイトの「dnsmasq」を参照してください。

次の手順を実行します。

  1. 次のコマンドを実行して dnsmasq サーバーをインストールします。

    sudo yum install -y dnsmasq
  2. インスタンスを Amazon Linux 2023 (AL2023) で実行している場合は、ステップ 3 に進んでください。dnsmasq を実行する専用のシステムユーザーを作成するには、次のコマンドを実行じます。

    sudo groupadd -r dnsmasq
    sudo useradd -r -g dnsmasq dnsmasq

    注: 通常、dnsmasq は root ユーザーとして実行されます。ただし、起動後にユーザーは変更され、root 権限は削除されます。デフォルトでは、ユーザーは nobody です。

  3. 次のコマンドを実行して dnsmasq.conf ファイルのバックアップを作成します。

    sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.ori
  4. vim テキストエディタで /etc/dnsmasq.conf 設定ファイルを作成して開くには、次のコマンドを実行します。

    sudo vim /etc/dnsmasq.conf

    注: /etc/dnsmasq.conf ファイルの変更には、任意のテキストエディタ (例: vinano) を使用できます。

  5. 次の内容を /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

    注: dnsmasqbogus-priv オプションを指定した場合、/etc/hosts に含まれないプライベート IP 範囲に対する DNS 逆引きは失敗します。さらに、このオプションが原因で、Dynamic Host Configuration Protocol (DHCP) リースファイルに対する DNS 逆引きも失敗します。DNS 逆引きを正常に行うには、bogus-priv をコメントアウトするか削除します。

  6. /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) 内で起動させることもできます。

  7. dnsmasq サーバーを再起動し、サービスがブート時に起動するように設定するには、ディストリビューションに応じて次のいずれかのコマンドのを実行します。
    Amazon Linux 1 (AL1):

    sudo service dnsmasq restart
    sudo chkconfig dnsmasq on

    Amazon Linux 2 (AL2)、AL2023:

    sudo systemctl restart dnsmasq.service
    sudo systemctl enable dnsmasq.service
  8. 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)
    ...
  9. 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 を使用します。

  10. 変更を適用するには、使用する Linux ディストリビューションに応じて次のコマンドを実行します。
    AL2:

sudo dhclient

AL2023:

sudo systemctl restart systemd-resolved.service

または、
ネットワークサービスを再起動する場合は、次のコマンドを実行します。

sudo systemctl restart network

または、
インスタンスを再起動する場合は、次のコマンドを実行します。

sudo reboot
  1. インスタンスが 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 スクリプトをスタンドアロンスクリプトとして実行するには、次の手順を実行します:

  1. スクリプトをインスタンスにダウンロードして実行可能にするには、次のコマンドを実行します。

    wget https://raw.githubusercontent.com/awslabs/aws-support-tools/master/EC2/AutomateDnsmasq/AutomateDnsmasq.sh
    chmod +x AutomateDnsmasq.sh
  2. スクリプトを実行するには、次のコマンドを root ユーザーとして実行します。

    sudo ./AutomateDnsmasq.sh

関連情報

Amazon EC2 インスタンスの IP アドレス

AWS公式更新しました 10ヶ月前
コメントはありません

関連するコンテンツ