Skip to content

再起動しても持続する静的 DNS サーバーを EC2 インスタンスに割り当てる方法を教えてください。

所要時間4分
0

再起動しても持続する静的 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 ファイルを更新する

次の手順を実行します。

  1. 既存の etc/dhcp/dhclient.conf ファイルを開くか、新しく作成します。
    注: このファイルを編集するには、root ユーザーのアクセス許可が必要です。sudo -i で root ユーザーになるか、sudo を使用すると、すべてのコマンドを実行できます。
  2. domain-name-servers をオーバーライドするには、ファイルに次の supersede コマンドを追加します。
    supersede domain-name-servers 000.000.000.000, 000.000.000.000;
    注: 000.000.000.000 は、インスタンスで使用する DNS サーバーの IP アドレス (複数可) に置き換えます。
  3. /etc/sysconfig/network-scripts/ifcfg-* など、インターフェイスごとの設定ファイルで PEERDNS パラメータを yes に設定します。
  4. EC2 インスタンスを再起動しますresolv.conf ファイルはインスタンスの再起動時に更新され、dhclient ファイルで指定した DNS サーバーのみが含まれるようになります。

ifcfj-eth0 ファイルを更新する

次の手順を実行します。

  1. /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
  2. /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.confsupersede ステートメントが想定通りに機能しない可能性があります。

  • このファイルはインスタンスの symlink ではありません。
  • このファイルは、/run/systemd/resolve/resolv.conf などの別のファイルを指す symlink です。

DNS サーバーの値を上書きするには、次の手順を実行します。

  1. 次のデータを含む 、/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
  2. 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 サーバーをバックグラウンドで使用します。

  3. インスタンスを再起動します

  4. システムが意図した DNS サーバーの IP アドレスを正しく使用していることを確認するには、Ubuntu のバージョンに応じて次のコマンドを実行します。
    Ubuntu 18.04:

    systemd-resolve --status

    Ubuntu 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 ファイルを手動で作成します。

関連情報

Amazon VPC の DHCP オプションセット

ネットワークファイル (Archlinux のウェブサイト)

resolved.conf(5) (Archlinux のウェブサイト)

dhclient.conf(5) (Archlinux のウェブサイト)

Archlinux ウェブサイト上の「networkmanager.conf(5)

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