VPC内のあるサーバだけ異なるDNSサーバを参照したい

記事タイトルとURLをコピーする

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オプションセットで確認できます。

f:id:swx-watanabe:20220114113253p:plain
デフォルトの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サーバを参照したい

結論からすると、この記事どおりにやれば設定できます。

aws.amazon.com

以上、

f:id:swx-watanabe:20220114165505p:plain:w300

やってみた

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年入社。趣味は言語学習。