再起動しても持続する静的 DNS サーバーを EC2 インスタンスに割り当てる方法を教えてください。
再起動しても持続する静的 DNS サーバーを持つ Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを設定しようとしています。
解決策
デフォルトでは、Amazon Virtual Private Cloud (Amazon VPC) に関連付けられた EC2 インスタンスは、起動時に DNS サーバーアドレスをリクエストします。動的ホスト構成プロトコル (DHCP) がリクエストを送信し、Amazon は DNSサーバーのアドレスを含む DHCP 応答をローカルの /etc/resolv.conf ファイルに書き込みます。
カスタム DNS サーバーアドレスを含む resolv.conf ファイルへの手動変更は、インスタンスを再起動時に失われます。インスタンスの再起動時に静的 DNS サーバーを維持するには、お使いの Linux ディストリビューションに応じて設定を更新してください。
重要: インスタンスを変更する前に、Amazon マシンイメージ (AMI) を使用してバックアップを作成してください。バックアップの作成には、Amazon Elastic Block Store (Amazon EBS) スナップショットも使用できます。インスタンスのネットワーク設定を変更すると、そのインスタンスにアクセスできなくなる可能性があります。
AL2023
Amazon Linux 2023 (AL2023) は、systemd-resolved を使用します。詳細については、Archlinux のウェブサイトで「systemd-resolved」を参照してください。
リゾルバーの設定
/etc/systemd/resolved.conf ファイルを編集し、[DNS] オプションと [ドメインオプション] を変更します。
設定ファイルの例:
# /etc/systemd/resolved.conf [Resolve] DNS=8.8.8.8 Domains=~.
または、ドロップインを作成します。例えば、/etc/systemd/resolved.conf.d/dns\ _servers.conf ファイルを使用します。
設定ファイルの例:
#/etc/systemd/resolved.conf.d/dns_servers.conf [Resolve] DNS=8.8.8.8 8.8.4.4 Domains=~.
注: systemd-resolved が リンクごとの構成で設定したリンクごとのサーバーを使用することを避けるために、Domains=~. オプションを設定します。Domains=~. オプションは、リンクごとの構成で指定した、特定の検索ドメインを照合するドメイン名のクエリには影響しません。ドメイン名が解決されると、リンクごとの DNS サーバーを使用するようになります。
/etc/resolv.conf が指す場所を変更する
デフォルトでは、/etc/resolv.conf はローカルホストのスタブリゾルバーを指します。リゾルバーを変更するには、フィールドを更新してファイルを再作成するか、既存のファイルでローカルホストのスタブリゾルバー以外を指すようにします。たとえば、systemd-resolved が使用するサーバーの平坦化リストを含む /run/systemd/resolve/resolv.conf を指すようにします。
ローカル DNS キャッシュを使用する場合の設定ファイルステータスの例:
### Default Symbolic link status : point to stub-resolv.conf ### Flow: DNS query => Local Cache DNS 127.0.0.53 ( systemd-resolved ) => External DNS # ls -al /etc/resolv.conf lrwxrwxrwx 1 root root 39 Mar 5 02:28 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf # cat /etc/resolv.conf nameserver 127.0.0.53 options edns0 trust-ad search . ### 127.0.0.53 is used for systemd-resolved ( local cache dns ) # lsof -nP -p `pidof systemd-resolved` |grep TCP systemd-r 339 systemd-resolve 14u IPv4 2753 0t0 TCP 127.0.0.53:53 (LISTEN)
ローカル DNS キャッシュを使用しない場合の設定ファイルステータスの例:
### Changed Symbolic link status : point to /run/systemd/resolve/resolv.conf # cat /run/systemd/resolve/resolv.conf nameserver 1.1.1.1 nameserver 1.0.0.1 search . # ln -sf ../run/systemd/resolve/resolv.conf /etc/resolv.conf # ls -al /etc/resolv.conf lrwxrwxrwx 1 root root 34 Apr 1 16:05 /etc/resolv.conf -> ../run/systemd/resolve/resolv.conf
設定をテストするには、次のコマンドを実行します。
# resolvectl status
# resolvectl query amazonaws.com
出力例:
# resolvectl status Global Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported resolv.conf mode: uplink DNS Servers 8.8.8.8 8.8.4.4 DNS Domain ~. Link 2 (ens5) Current Scopes: DNS Protocols: +DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported DNS Servers: 10.2.0.2 DNS Domain: ap-northeast-2.compute.internal
# resolvectl query amazonaws.com amazonaws.com: 207.171.166.22 -- link: ens5 72.21.206.80 -- link: ens5 72.21.210.29 -- link: ens5 -- Information acquired via protocol DNS in 3.0ms. -- Data is authenticated: no; Data was acquired via local or encrypted transport: no -- Data from: cache
AL1 または AL2
Amazon Linux 1 (AL1) または Amazon Linux 2 (AL2) インスタンスを設定するには、etc/dhcp/dhclient.conf ファイルまたは ifcfg-eth0.confファイルを更新します。両方のファイルを設定した場合は、ifcfg-eth0.conf ファイルで指定した DNS サーバーが優先されます。
前提条件 ifcfg-eth0.conf ファイルの PEERDNS パラメータ値を yes に設定します。PEERDNS パラメータを no に設定すると、Amazon EC2 は、ifcfg-* ファイルで指定した DNS サーバーおよび DHCP が指定した DNS サーバーを無視します。
etc/dhcp/dhclient.conf ファイルを更新する
次の手順を実行します。
- 既存の etc/dhcp/dhclient.conf ファイルを開くか、新しく作成します。
注: このファイルを編集するには、root ユーザーのアクセス許可が必要です。sudo -i で root ユーザーになるか、sudo を使用すると、すべてのコマンドを実行できます。 - domain-name-servers をオーバーライドするには、ファイルに次の supersede コマンドを追加します。
注: 000.000.000.000 は、インスタンスで使用する DNS サーバーの IP アドレス (複数可) に置き換えます。supersede domain-name-servers 000.000.000.000, 000.000.000.000; - /etc/sysconfig/network-scripts/ifcfg-* など、インターフェイスごとの設定ファイルで PEERDNS パラメータを yes に設定します。
- EC2 インスタンスを再起動します。resolv.conf ファイルはインスタンスの再起動時に更新され、dhclient ファイルで指定した DNS サーバーのみが含まれるようになります。
ifcfj-eth0 ファイルを更新する
次の手順を実行します。
-
/etc/dhcp/dhclient.conf ファイル内の DNS サーバー値を上書きするには、インターフェイスごとの設定ファイルでカスタム DNS サーバーを指定します。
次のファイル例では、2 つのカスタム DNS サーバーを含む Amazon Linux インスタンスの /etc/sysconfig/network-scripts/ifcfg-eth0 ファイルを示しています。DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes TYPE=Ethernet USERCTL=yes PEERDNS=yes IPV6INIT=no PERSISTENT_DHCLIENT=yes RES_OPTIONS="timeout:2 attempts:5" DHCP_ARP_CHECK=no MTU="9001" DNS1=8.8.8.8 DNS2=8.8.4.4 -
/etc/sysconfig/network-scripts/ifcfg-* など、インターフェイスごとの設定ファイルで PEERDNS パラメータを yes に設定します。
注: インスタンスで Ubuntu 16.04 または Red Hat Enterprise Linux (RHEL) 7.5 を実行している場合は、上記の解決手順も使用できます。
Ubuntu 18.04、20.04、22.04
Ubuntu 18.04では、netplan.io パッケージがネットワークインターフェイスの設定を管理し、systemd-resolved サービスがスタブリゾルバーを使用して DNS クエリを管理します。スタブリゾルバーの IP アドレスは /etc/resolv.conf ファイルに記載されています。このファイルは、/run/systemd/resolve/stub-resolv.conf ファイルへの symlink です。/etc/resolv.conf ファイルに次の設定が含まれる場合、/etc/dhcp/dhclient.conf の supersede ステートメントが想定通りに機能しない可能性があります。
- このファイルはインスタンスの symlink ではありません。
- このファイルは、/run/systemd/resolve/resolv.conf などの別のファイルを指す symlink です。
DNS サーバーの値を上書きするには、次の手順を実行します。
-
次のデータを含む 、/etc/netplan/99-custom-dns.yaml という名前のファイルを作成します。
### Create Customer DNS config # cat << 'EOF' | sudo tee /etc/netplan/99-custom-dns.yaml network: version: 2 ethernets: ens5: nameservers: addresses: [1.1.1.1, 1.0.0.1] dhcp4-overrides: use-dns: false use-domains: false EOF ### Required File Permission # chmod 600 /etc/netplan/99-custom-dns.yaml ### Checking Netplan Configuration status # netplan get network: version: 2 ethernets: ens5: match: macaddress: "0a:e5:a1:40:a2:f5" nameservers: addresses: - 1.1.1.1 - 1.0.0.1 dhcp4: true dhcp4-overrides: use-dns: false use-domains: false dhcp6: false set-name: "ens5"注: 1.1.1.1, 1.0.0.1 は、実際の DNS サーバーの IP アドレスに置き換えます。Netplan は設定ファイルを /etc/netplan ディレクトリに保存します。上記の例では ens5 インターフェイスを使用しています。インターフェイス名が実際のインターフェイスと一致することを確認してください。インターフェイス名を確認するには、次のコマンドを実行します。
# ip a出力例
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000 link/ether 0a:e5:a1:40:a2:f5 brd ff:ff:ff:ff:ff:ff inet 172.31.35.233/20 metric 100 brd 172.31.47.255 scope global dynamic ens5 valid_lft 2828sec preferred_lft 2828sec inet6 fe80::8e5:a1ff:fe40:a2f5/64 scope link valid_lft forever preferred_lft forever -
Netplan YAML ファイルを設定ファイルに変換するには、次の netplan コマンドを実行します。
# netplan generate # netplan try # netplan apply注:「WARNING:root:Cannot call Open vSwitch: ovsdb-server.service is not running」というメッセージが表示される場合があります。このメッセージは無視して、次のステップに進んでも問題ありません。WARNING メッセージを表示させたくない場合は、Open vSwitch with DPDK パッケージをインストールしてください。スタブリゾルバーの IP アドレスは /etc/resolv.conf に記載されるようになります。スタブリゾルバーの IP アドレスはオペレーティングシステム (OS) のローカルであるため、これは想定動作です。スタブリゾルバーは、99-custom-dns.yaml ファイルで指定した DNS サーバーをバックグラウンドで使用します。
-
システムが意図した DNS サーバーの IP アドレスを正しく使用していることを確認するには、Ubuntu のバージョンに応じて次のコマンドを実行します。
Ubuntu 18.04:systemd-resolve --statusUbuntu 20.04、22.04:
resolvectl status
RHEL 7.5
デフォルトでは、NetworkManager サービスは RHEL ディストリビューションの resolv.conf ファイルを管理します。サービスは、DHCP が指定した DNS サーバーをファイルに入力します。カスタム DNS サーバーを使用するには、resolv.conf ファイルで NetworkManager をブロックします。こうすることで、resolv.conf ファイルでは DHCP が指定する DNS サーバーを無視するようになります。
[AL1 または AL2] では、「etc/dhcp/dhclient.conf を更新する」の手順を実行してください。または、/etc/NetworkManager/conf.d/90-DNS-None.conf ファイルを次の内容で作成します。
[main] dns=none
インスタンスを再起動し、/etc/resolv.conf ファイルを手動で作成します。
関連情報
ネットワークファイル (Archlinux のウェブサイト)
resolved.conf(5) (Archlinux のウェブサイト)
dhclient.conf(5) (Archlinux のウェブサイト)
Archlinux ウェブサイト上の「networkmanager.conf(5)」

