EC2はDHCPオプションセットのDNSサーバを参照する
EC2インスタンスがDNSで名前解決をするとき、デフォルトでは Route 53 Resolver というDNSサーバを利用します。 たとえばLinuxの場合、 /etc/resolv.conf にDNSサーバのIPアドレスが設定されますが、実際にみてみると以下のようになっているのがわかります。
options timeout:2 attempts:5 ; generated by /usr/sbin/dhclient-script search ap-northeast-1.compute.internal nameserver 10.200.0.2
この例ではDNSサーバが 10.200.0.2 という Route 53 Resolver のアドレスになっています。 これはマネージメントコンソールでVPCに紐づいているDHCPオプションセットで確認できます。
おっと、IPアドレスではなく、 AmazonProvidedDNS と表示されていますね。
これは Route 53 Resolver が使われることを意味します。このようなデフォルト設定の場合は、「VPC ネットワーク範囲のベースにプラス 2 した予約済み IP アドレス」がDNSサーバとしてDHCPで通知されます。
VPC を作成すると、デフォルトで作成される Route 53 Resolver は、VPC ネットワーク範囲のベースにプラス 2 した予約済み IP アドレスで実行する DNS サーバーにマッピングされます。 https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/resolver.html
このDHCPオプションセットの変更はできませんが、新しく作成してVPCに紐づけることは可能なので、そうすれば独自のDNSサーバを利用できます。
ただし、1つのVPCに紐づけ可能なのは、1つのDHCPオプションセットに限られるため、同一VPCの全てのEC2インスタンスは同じDNSサーバを参照することになります。では、VPC内のある1つのサーバだけ異なるDNSサーバを参照させたい場合はどうしたらいいのでしょうか。
VPC内のあるサーバだけ異なるDNSサーバを参照したい
結論からすると、この記事どおりにやれば設定できます。
以上、
やってみた
Amazon Linux 2 で試してみました。
オプション1 (dhclient.conf)
/etc/dhcp/dhclient.conf を変更する方法です。
デフォルトではtimeoutの一行だけ記載があります。
timeout 300;
そこに supersede domain-name-servers DNSサーバ1,DNSサーバ2;
といった感じで追記します。
timeout 300; supersede domain-name-servers 8.8.8.8,1.1.1.1;
なお、/etc/sysconfig/network-scripts/ifcfg-*のPEERDNS パラメータを yesにするという記載がありますが、Amazon Linux 2の場合はデフォルトで以下のように設定が入っていたため、変更は不要でした。
DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes TYPE=Ethernet USERCTL=yes PEERDNS=yes <--- ココ DHCPV6C=yes DHCPV6C_OPTIONS=-nw PERSISTENT_DHCLIENT=yes RES_OPTIONS="timeout:2 attempts:5" DHCP_ARP_CHECK=no
インスタンスの再起動、またはネットワークのリスタートをします。
$ sudo init 6
or
$ sudo systemctl restart network
resolv.conf で変更されていることが確認できます。
$ cat /etc/resolv.conf options timeout:2 attempts:5 ; generated by /usr/sbin/dhclient-script search ap-northeast-1.compute.internal nameserver 8.8.8.8 <--- 変更されました nameserver 1.1.1.1 <--- 変更されました
オプション2 (ifcfg-eth0)
/etc/sysconfig/network-scripts/ifcfg-eth0 を変更する方法です。
以下のように2行追記してみましょう。
DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes TYPE=Ethernet USERCTL=yes PEERDNS=yes DHCPV6C=yes DHCPV6C_OPTIONS=-nw PERSISTENT_DHCLIENT=yes RES_OPTIONS="timeout:2 attempts:5" DHCP_ARP_CHECK=no DNS1=8.8.8.8 <--- 追記 DNS2=1.1.1.1 <--- 追記
インスタンスの再起動、またはネットワークのリスタートをします。
$ sudo init 6
or
$ sudo systemctl restart network
resolv.conf で変更されていることが確認できます。
$ cat /etc/resolv.conf options timeout:2 attempts:5 ; generated by /usr/sbin/dhclient-script search ap-northeast-1.compute.internal nameserver 8.8.8.8 <--- 変更されました nameserver 1.1.1.1 <--- 変更されました
resolv.confを編集すればいいのでは?
上記の2つの方法のいずれも、結局は resolv.conf が変更されます。それなら直接 resolv.conf を変更すればいいのでは?と思うでしょう。 実際に試すと確かにそれで変更できます。
しかし、インスタンス再起動やネットワーク再起動をすると、DHCPオプションセットの値に戻ってしまいます。
渡辺 信秀(記事一覧)
2017年入社 / 地味な内容を丁寧に書きたい