DNS on EC2 で VPCエンドポイント用に Amazon Provided DNS への Forwarder を記載する

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

SRE部 佐竹です。
EC2 Instance で運用しているDNSサーバの設定を変更する機会があったのでブログにします。

はじめに

VPC Endpoint Service (AWS PrivateLink) を作成すると、その VPC 内の指定した Subnet に ENI が作成され、以後その Private IP アドレスをサービス用のIPとして利用可能になります。

通常であれば、以下の通りの経路で名前解決が可能です。

f:id:swx-satake:20201008144949p:plain

これは、Systems Manager (SSM) 向けの VPC Endpoint Service が構築済の環境で、 ssm.ap-northeast-1.amazonaws.com に対して EC2 Instance の内部から名前解決を実行している図となります。

通常の名前解決経路

デフォルトでは EC2 Instance 内部のOSは、名前解決にあたり VPC (例では 10.0.0.0/16 ) の前から2番目のIPアドレスである 10.0.0.2/32 に存在している Amazon Provided DNS = Amazon Route 53 Resolver server を参照します。作成された VPC Endpoint Service の名前解決に必要な情報は Amazon Provided DNS に登録されるため、 Amazon Provided DNS が参照できれば名前解決が可能です。

補足ですが VPC Endpoint Service の名前解決の前提として、VPC において enableDnsHostnamesenableDnsSupportTrue である必要があります。詳しくは「VPC での DNS の使用 - Amazon Virtual Private Cloud」を参照してください。

EC2 上に構築したDNSサーバを利用する場合の各名前解決経路

f:id:swx-satake:20201008150616p:plain

amzn.local.net という Zone を Bind (DNS) 上で構築している環境があるとします。Bind のIPアドレスは、仮に 10.0.1.23 とします。

また、本 Bind の named.conf では Forwarders として以下の設定がされているとします。

zone "local.net" {
    type forward;
    forwarders { 10.1.1.1; 10.2.2.2; };
};

これは AWS 以外のリソースについてはオンプレのDNSサーバを参照したいために記載している状況です。

amzn.local.net の名前を解決する場合

f:id:swx-satake:20201008151003p:plain

左上に配置されている EC2 Instance には、参照するDNSサーバとして 10.0.1.23 が記載されているとします。この場合、EC2 Instance 内部で amzn.local.net を名前解決する場合は、10.0.1.23 のDNSサーバが応答し、あて先を返却します。

local.net の名前を解決する場合

f:id:swx-satake:20201008151420p:plain

amzn. 以外ではじまる local.net のドメイン名を名前解決する場合、EC2 Instance はDNSサーバ 10.0.1.23 がオンプレの DNSサーバ にフォワードし、あて先を返却します。

Systems Manager の名前を解決する場合

f:id:swx-satake:20201008151544p:plain

Systems Manager や CloudWatch など AWS のサービスを名前解決する場合、EC2 Instance が参照するDNSサーバ 10.0.1.23 は、 ssm.ap-northeast-1.amazonaws.com の宛先を知らないため、オンプレの DNSサーバ にフォワードしあて先を探索しに行きます。この時、オンプレにあるDNSサーバは ssm.ap-northeast-1.amazonaws.com の宛先を「グローバル」に探索しにいくため、返却されるIPアドレスはグローバルIPになってしまいます。

この時、グローバルIPではなくプライベートIPを返却するようにしたいというのが今回のブログの趣旨です。

解決策

Bind に Amazon Provided DNS への Forwarder の設定を記載するのが解決策です。具体的には以下を named.conf に記載し設定を反映します。

zone "ap-northeast-1.amazonaws.com" {
    type forward;
    forward only;
    forwarders { 10.0.0.2; };
};

この設定を追加することで、 ap-northeast-1.amazonaws.comAmazon Provided DNS にあて先を探索しに行くようになります。設定反映後の名前解決経路は以下の通りです。

f:id:swx-satake:20201008152243p:plain

nslookup での検証結果

本設定が正常に動作しているかどうか設定前と設定後で nslookup の結果を比較しました。

[ec2-user@ip-10-0-1-10 ~]$ nslookup ssm.ap-northeast-1.amazonaws.com 10.0.0.2
Server:         10.0.0.2
Address:        10.0.0.2#53

Non-authoritative answer:
Name:   ssm.ap-northeast-1.amazonaws.com
Address: 10.0.0.12
Name:   ssm.ap-northeast-1.amazonaws.com
Address: 10.0.0.29

上記コマンドの結果から、 Amazon Provided DNS が VPC Endpoint Service のプライベートIPアドレスを認識していることが確認できます。

設定反映前

[ec2-user@ip-10-0-1-10 ~]$ nslookup ssm.ap-northeast-1.amazonaws.com 10.0.1.23
Server:         10.0.1.23
Address:        10.0.1.23#53

Non-authoritative answer:
Name:   ssm.ap-northeast-1.amazonaws.com
Address: 52.119.219.52

上記コマンドの結果から、 Bind は VPC Endpoint Service のプライベートIPアドレスを返却できないことが確認できます。

設定反映後

設定反映後は以下の通りとなりました。

[ec2-user@ip-10-0-1-10 ~]$ nslookup ssm.ap-northeast-1.amazonaws.com 10.0.1.23
Server:         10.0.1.23
Address:        10.0.1.23#53

Non-authoritative answer:
Name:   ssm.ap-northeast-1.amazonaws.com
Address: 10.0.0.12
Name:   ssm.ap-northeast-1.amazonaws.com
Address: 10.0.0.29

この通り、無事に Bind から VPC Endpoint Service のプライベートIPアドレスが返却されています。

まとめ

f:id:swx-satake:20201008153003p:plain:w150

今回は数年前に構築した on EC2 で運用しているDNSサーバ(Bind)にて、VPC エンドポイントサービスのIPアドレスが想定通りにプライベートIPアドレスで動作していなかったため、その対応として「Amazon Provided DNS への Forwarder を記載する」作業を行ったことをブログにまとめました。

基本的に Route 53 をご利用されている方が多いと考えられますため、このような設定を施す機会は稀かと思われますが、on EC2 でDNSサーバを保守していて困ったら参考にしてみてください。

では、またお会いしましょう。

佐竹 陽一 (Yoichi Satake) 記事一覧はコチラ

SRE2課所属。AWS資格12冠。2010年1月からAWSを利用してきました。
AWSのコスト削減、最適化を得意としています。