閉域オンプレミスと AWS のハイブリッド構成における Route 53 アウトバウンド・インバウンドエンドポイントの名前解決パターンを構築してみる

ガバメントクラウドでは、閉域でオンプレミスの庁舎内ネットワークとマルチアカウントで構成された AWS 環境と連携するハイブリッド構成のネットワークが多く見られます。

閉域オンプレミスと AWS のハイブリッド構成のネットワークを考える時に、Route 53 インバウンド / アウトバウンドエンドポイントとオンプレミスの DNS サーバーを連携させることが効率的ですが、AWS がマルチアカウント構成の場合、集約アカウント（ネットワークアカウント）にエンドポイントをまとめて、他のアカウントに共有すると更に効率化が図れます。

そこで、自宅に閉域オンプレミスに見立てた DNS の検証環境を構築し、VPN で AWS に接続した上で、実際に Route 53 インバウンドエンドポイント・アウトバウンドエンドポイントとオンプレミスの DNS サーバーと連携させて動作を確認してみました。

:::note info
本記事は、以前に書いた以下の記事に、オンプレミスの DNS サーバーからの連携を加筆して再構成したものとなります。
:::

https://takeda-h.hatenablog.com/entry/2024/11/22/013529

## 検証環境の構成

![R53Endpoints.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/139dce13-955d-47bd-9ff3-513bded1c488.png)

オンプレミスには intra.morori.jp というドメインを管理する権威 DNS サーバーがあるとします。AWS 環境では、アカウントごとに異なる、オンプレミスのドメインのサブドメインを使うこととします。

| 環境 | ドメイン | サブネット |
|:-|:-|:-|
| オンプレミス | intra.morori.jp | 10.1.0.0/16 |
| ネットワークアカウント VPC | test01.intra.morori.jp | 10.128.0.0/16 |
| ASP アカウント VPC | test02.intra.morori.jp | 10.129.0.0/16 |

各 DNS サーバー等の IP アドレスなどは次のとおり。

| DNS サーバー | IP アドレス |
|:-|:-|
| オンプレミスリゾルバ DNS サーバー | 10.1.1.3 |
| オンプレミス権威 DNS サーバー | 10.1.1.2 |
| Route 53 インバウンドエンドポイント | 10.128.130.26 |

オンプレミスと AWS 環境は、ネットワークアカウント VPC のパブリックサブネットにある EC2 インスタンスとオンプレミスのルーターで IPSec トンネルで接続して相互にルーティングできるようにしています。ガバメントクラウドでは実際には Direct Connect での接続となります。オンプレミスのルーターと EC2 インスタンスで VPN を張る手順は別記事にまとめています。

https://qiita.com/takeda_h/items/eec8d43e7dd986fbcf87

ネットワークアカウント VPC と ASP アカウント VPC は Transit Gateway で相互にルーティングできるようにしています。Transit Gateway ルートテーブル、VPC のルートテーブルに互いのサブネットへの経路情報を静的に追加し、オンプレミスを含めて相互にルーティングできるようにしています。複数アカウントの VPC を Transit Gateway で接続する手順は以前書きましたので参考になるかもです。

https://takeda-h.hatenablog.com/entry/2024/11/23/233553

## AWS 環境と連携する前の閉域オンプレミス DNS サーバー（BIND）の設定

仮想環境に 2 台 Alma Linux 9.5 でそれぞれオンプレミスの閉域環境内で管理するドメイン（intra.morori.jp）の権威 DNS サーバーと、リゾルバ DNS サーバーに BIND をインストールして立てます。クライアントはリゾルバ DNS サーバーを向いているとします。リゾルバ DNS サーバーに intra.morori.jp の名前解決要求が来たら、条件付きフォワーダで権威 DNS サーバーへ名前解決要求を転送し、閉域の中で名前解決が完結できるようにしています。

### リゾルバ DNS サーバーの設定

以下は AWS 環境と連携する前の設定で、この後、AWS 側の Route 53 インバウンドエンドポイント・アウトバウンドエンドポイントの設定に合わせてリゾルバ DNS サーバーの設定を追加していくことになります。

```/etc/named.conf
acl "intranets" {
  10.1.0.0/16; # オンプレミスのサブネット
  10.128.0.0/16; # ネットワークアカウント VPC のサブネット
  10.129.0.0/16; # ASP アカウントの VPC サブネット
};

options {
        listen-on port 53 { 10.1.1.3; }; # リゾルバ DNS サーバーの IP アドレス
        allow-query     { localhost; intranets; };
        recursion yes;
        dnssec-validation no; // yes だと転送に失敗するので注意
};

zone "." IN {
        type hint;
        file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/intra.morori.jp.zones";
```

```/etc/intra.morori.jp.zones
zone "intra.morori.jp" IN {
        type forward;
        forward only;
        forwarders { 10.1.1.2; }; # オンプレミスのドメインの権威 DNS サーバーの IP アドレス
};
```

### 権威 DNS サーバーの設定

```/etc/named.conf
acl "cache-server" {
  10.1.1.3/32;
};

options {
        listen-on port 53 { 10.1.1.2; };
        allow-query     { localhost; cache-server; };
        allow-recursion { none; };
        allow-query-cache { none; };
        recursion no;
};

include "/etc/intra.morori.jp.zones";
```

```/etc/intra.morori.jp.zones
zone "intra.morori.jp" {
        type master;
        file "intra.morori.jp.db";
};
```

```/var/named/intra.morori.jp.db
$TTL 86400
@       IN      SOA     ns1.intra.morori.jp.    root.morori.jp. (
        2025022201
        28800
        14400
        3600000
        86400
)
        IN      NS      ns1.intra.morori.jp.
        IN      MX      10      smtp.intra.morori.jp.

ns1     IN      A       10.1.1.2
ns2     IN      A       10.1.1.3
smtp    IN      A       10.1.1.4
```

## オンプレミスから AWS 環境の名前解決ができるようにする

### AWS 環境の設定

#### ネットワークアカウント VPC の名前解決のオプションを有効化

Route 53 インバウンドエンドポイント作るネットワークアカウント VPC の DNS 設定を変更し、「DNS 解決を有効化」「DNS ホスト名を有効化」を有効にしておきます。

#### ネットワークアカウント VPC に Route 53 インバウンドエンドポイントの作成

オンプレミスから AWS 環境の名前解決をするためのインバウンドエンドポイントをネットワークアカウント VPC に作成します。

事前にオンプレミス、AWS 環境のサブネットから UDP 53 番ポートと TCP 53 番ポートのアクセスを許可するセキュリティグループを作成しておいてください。

![スクリーンショット 2025-02-23 125717.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/439f5ae7-1ca3-4810-86b2-451bb9f2c6a0.png)

![スクリーンショット 2025-02-23 125902.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/922cd2a4-dc43-4713-8b4f-34bde63c31d7.png)

![スクリーンショット 2025-02-23 133444.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/cbd1003d-3034-4991-8864-d01a1a5f8566.png)

Route 53 インバウンドエンドポイントの IP アドレスが AZ を跨いで 2 つ作られました。Route 53 インバウンドエンドポイントは仕様上 2 つ以上の AZ に跨って作成するので必ず 2 個以上 IP アドレスがありますが、今回は検証目的なので、IP アドレスはこのうち 10.128.130.26 の方の 1 つだけ使用することにします。

#### ASP アカウントでのプライベートホストゾーンの作成

インバウンドエンドポイントの集約をする場合、プライベートホストゾーンをネットワークアカウントで作成するか、各 ASP アカウントで作成するかの二通りのプライベートホストゾーンの管理方法があると思います。

今回は ASP アカウントで自分達のリソースのプライベートホストゾーンを管理する方法を選択しようと思います。この ASP アカウントでは test02.intra.morori.jp というオンプレミスのドメインのサブドメインを運用することとし、ASP アカウントで test02.intra.morori.jp ドメインの Route 53 のプライベートホストゾーンを作成します。

![20241122000036.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/0ab1a373-24a6-4a57-9ffb-add364aaadd4.png)

![20241122000613.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/9d018730-391c-4ce8-b1b4-6ff11efc9d8b.png)

#### ASP アカウントのプライベートホストゾーンをネットワークアカウント VPC への関連付け

次に Route 53 インバウンドエンドポイントを作成したネットワークアカウント VPC にこの ASP アカウントプライベートホストゾーンを関連付けます。

別アカウントの VPC にプライベートホストゾーンを関連付ける作業はマネージメントコンソールでは行えないため、AWS CLI などから実施する必要があります。

まずは ASP アカウントのプライベートホストゾーンをネットワークアカウント VPC に関連付けの許可を求める設定です。

ASP アカウント側で、AWS CLI から以下のようにコマンドを実行します（なお、VPC は東京リージョンにあるものとします）。

```console
$ aws route53 create-vpc-association-authorization --hosted-zone-id （プライベートホストゾーンの ID） --vpc VPCRegion=ap-northeast-1,VPCId=（VPC ID） --region ap-northeast-1
```

許可を求める設定が成功すると以下のとおり JSON が返ってきます。

![20241122002231.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/b682cf93-5127-438f-a47f-298e2ae39100.png)

今度はネットワークアカウントの VPC へ実際に ASP アカウントのプライベートホストゾーンを関連付けます。

ネットワークアカウント側で、AWS CLI から以下のようにコマンドを実行します。

```console
$ aws route53 associate-vpc-with-hosted-zone --hosted-zone-id （プライベートホストゾーンの ID） --vpc VPCRegion=ap-northeast-1,VPCId=（VPC ID） --region ap-northeast-1
```

成功すると同様に JSON が返ってきます。

![20241122002951.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/ad81f018-513d-4f27-9247-42ecb75324c4.png)

AWS CLI の操作は以上で完了です。マネジメントコンソールを見ると関連付けられた VPC が追加されていることが分かります。

![20241122003313.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/208fbcd8-1351-4853-a2b9-16757669ad24.png)

コマンドの詳細はリファレンスを参照。

https://docs.aws.amazon.com/cli/latest/reference/route53/associate-vpc-with-hosted-zone.html

#### ASP アカウント VPC の DHCP オプションセットの DNS 設定を変更する

ASP アカウントの VPC のリソースがネットワークアカウント VPC の Route 53 インバウンドエンドポイントで名前解決をするようにしたいので、ASP アカウントの VPC の DHCP オプションセットを変更します。

以下のとおり DNS サーバーの IP アドレスに Route 53 インバウンドエンドポイントの IP アドレスを設定します（今回は検証目的のため、1 つの IP アドレスのみで設定しています）。

![スクリーンショット 2025-02-23 142252.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/d5bfb724-c978-458b-bbfc-660f878239e0.png)

これにより、ASP アカウントの VPC のリソースは、ネットワークアカウント VPC の Route 53 インバウンドエンドポイントの IP アドレスに名前解決する要求することで、自分のプライベートホストゾーンのレコードを含めた AWS 環境の名前解決できるようになります。

以降、他のアカウントがプライベートホストゾーンをネットワークアカウント VPC に関連付けるとそのプライベートホストゾーンのレコードも名前解決できるようになっている仕組みです。

### オンプレミスのリゾルバ DNS サーバーの設定

このままでは AWS 環境の中では ASP アカウントの Route 53 プライベートホストゾーンの名前解決ができますが、オンプレミスからはできないため、オンプレミスからも AWS 環境側の名前解決ができるようにしていきます。

オンプレミスのリゾルバ DNS サーバーに、test02.intra.morori.jp ドメインへの名前解決要求が来たら、条件付きフォワーダでネットワークアカウントの VPC の Route 53 インバウンドエンドポイントに転送するよう設定します。

:::note info
ここで注意点ですが、オンプレミスのサブドメインを AWS 環境で使うならオンプレミスの権威 DNS サーバーにサブドメインの委任ルールを設定すればいいのでは？と思うかもしれません。しかし、Route 53 インバウンドエンドポイントの仕様で、インバウンドエンドポイントをサブドメインの委任先 DNS として設定することはできません。そのため、サブドメインだとしても条件付きフォワーダを使う必要があるのです。
:::

:::note warn
この制約があるため、オンプレミスの DNS サーバーが権威とリゾルバを分けずに同一のサーバーで構成している場合、問題が起きる可能性がありますので、この機に権威とリゾルバは分けた方がよいと思います。
:::

話を戻して、BIND に以下のとおり設定を追加します（前述のとおり検証目的のため、フォワーダを 1 つの IP アドレスのみで設定しています）。

```/etc/intra.morori.jp.zones
zone "intra.morori.jp" IN {
        type forward;
        forward only;
        forwarders { 10.1.1.2; };
};
zone "test02.intra.morori.jp" IN { # ASP アカウントプライベートホストゾーンのドメイン
        type forward;
        forward only;
        forwarders { 10.128.130.26; }; # インバウンドエンドポイントの IP アドレス
};
```

### オンプレミスから名前解決の動作確認

オンプレミスのクライアントから、オンプレミスのリゾルバ DNS サーバーで ASP アカウントのプライベートホストゾーンのドメインのレコードを名前解決してみます。

![スクリーンショット 2025-02-23 133914.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/4dbe4c65-0eb5-418a-8b99-f26ca0a67cd0.png)

ASP アカウントのプライベートホストゾーンのドメインのレコードの IP アドレスが返ってくることが確認できました。

## AWS 環境からオンプレミスの名前解決ができるようにする

次は逆に AWS 環境からオンプレミスのドメインの名前解決ができるようにしていきます。

### ネットワークアカウント VPC に Route 53 アウトバウンドエンドポイントの作成

ネットワークアカウント VPC に Route 53 アウトバウンドエンドポイントを作成します。事前に AWS 環境のサブネットから UDP 53 番ポートと TCP 53 番ポートのアクセスを許可するセキュリティグループを作成しておいてください（アウトバウンドエンドポイントに対するセキュリティグループですが、セキュリティグループのルールはインバウンドのルールが必要なので注意してください）。

![スクリーンショット 2025-02-23 135213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/48d5fc0a-9eb6-4588-923b-7f8d18902030.png)

![スクリーンショット 2025-02-23 135252.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/605e4c84-cab7-468a-9661-d36b81107886.png)

### Route 53 リゾルバールールの作成と Resource Access Manager でのリソース共有

#### ネットワークアカウントでリゾルバールールを作成

オンプレミスのドメイン（intra.morori.jp）に対する Route 53 の転送ルールを作成します。作成した Route 53 アウトバウンドエンドポイントを指定します。また、アウトバウンドする先の DNS サーバーの IP アドレスとしてオンプレミスのリゾルバ DNS サーバーの IP アドレスを指定します。

![スクリーンショット 2025-02-23 135823.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/d1899139-baea-4384-941b-872b473b67ec.png)

#### ASP アカウントへのリゾルバールールのリソース共有を作成

Resource Access Manager（RAM）で作成したリゾルバールールを ASP アカウントへ共有します。Organizations で共有もできるのですが、ガバメントクラウドではメンバーアカウントとなるため使えないので、ASP アカウントのアカウント ID を指定して個別に共有します。

![スクリーンショット 2025-02-23 140417.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/7a55a00e-2dd8-46b8-8fe4-a09b3d3cbc90.png)

![スクリーンショット 2025-02-23 140441.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/4834c08e-cbd2-43d6-a629-3876281b9eff.png)

![スクリーンショット 2025-02-23 140535.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/8c2f5afd-eb52-4d53-b87a-e6356df2d276.png)

ASP アカウント側のマネージメントコンソールでリソース共有を承認します。

![スクリーンショット 2025-02-23 140846.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/5f144a60-1a63-4e6f-95a2-0964d4530e92.png)

![スクリーンショット 2025-02-23 141015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/ad6cd5f5-7b40-4ad2-b6ee-9da61e01d998.png)

### AWS 環境から名前解決の動作確認

オンプレミスのドメインへの名前解決要求は Route 53 アウトバウンドエンドポイントに転送するというリゾルバールールを設定したことにより、ASP アカウントの VPC にある EC2 から、Route 53 インバウンドエンドポイント→Route 53 アウトバウンドエンドポイント→オンプレミスのリゾルバ DNS サーバーへオンプレミスのドメインへの名前解決要求が転送されていくようになり、レコードを名前解決できるようになりました。

![スクリーンショット 2025-02-23 142618.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/c8f9d0e5-1279-4945-bdf8-85c9af5bdf76.png)

## （おまけ）S3 のインターフェイスエンドポイントの名前解決を試す

S3 のインターフェイスエンドポイントを作成してプライベート DNS 名を有効にした時の動作を見てみます。

先に閉域オンプレミスで amazonaws.com の名前解決をした際に Route 53 インバウンドエンドポイントに向くようにオンプレミスのリゾルバ DNS サーバーに条件付きフォワーダを追加します。

```/etc/intra.morori.jp.zones
zone "intra.morori.jp" IN {
        type forward;
        forward only;
        forwarders { 10.1.1.2; };
};
zone "test02.intra.morori.jp" IN { # ASP アカウントプライベートホストゾーンのドメイン
        type forward;
        forward only;
        forwarders { 10.128.130.26; }; # インバウンドエンドポイントの IP アドレス
};
zone "amazonaws.com" IN { # VPC エンドポイントの名前解決もインバウンドエンドポイントにむｋ
        type forward;
        forward only;
        forwarders { 10.128.130.26; }; # インバウンドエンドポイントの IP アドレス
};
```

インターフェイスエンドポイントを作ります。

![スクリーンショット 2025-02-23 144546.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/40d9505e-2f22-4c48-a8fa-27c1b30f8d75.png)

![スクリーンショット 2025-02-23 144638.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/d753c36a-ffa8-414a-b3d2-195394626b4c.png)

![スクリーンショット 2025-02-23 150142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/9afdf2ea-2a26-4103-aa41-1c9aa2629f42.png)

インターフェイスエンドポイントの DNS 名をオンプレミスのリゾルバ DNS サーバーで名前解決してみます。

![スクリーンショット 2025-02-23 150256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443658/7475a7d8-ec8e-424c-89bc-20510301d787.png)

ホスト名を閉域のオンプレミスから名前解決しても、VPC のプライベート IP アドレスが返るようになりました。

実は同じホスト名をインターネット環境で名前解決してもできてしまいます。ただし、返ってくるのはプライベート IP アドレスのため、セキュリティ上問題はありません。

これで、閉域内からでも名前解決できることで、インターフェイスエンドポイントを作成できる AWS のサービスには閉域内からアクセスできることが分かりました。

## 参考サイト

https://aws.amazon.com/jp/blogs/news/govcloud-domain-name-resolution/

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/resolver.html