はじめに
今回はRoute 53 Resolver DNS Firewallを使って、ドメイン名ベースで通信を制御するDNSフィルタリングについて解説します。
DNS Firewallは、VPC内のリソースが外部へ行うDNSクエリを精査・フィルタリングする仕組みで、指定したドメインを[許可/ブロック/アラート]といった形で柔軟に制御できます。
これにより、インスタンスが意図しない外部サイトへアクセスしてしまうリスクを減らし、セキュリティを強化した安全なアウトバウンド通信環境を構築することが可能になります。
実務で上記のような要件が必要になったので調べてみました。
私について
2026年1月からITエンジニア完全未経験でSESに転職しました。
前職は自動車業界に10年程度在籍していました。
保有資格は下記3つ
- AWS CLF
- AWS SAA
- Linuc レベル1
前職在籍中に時間を作って独学で学習し、1年ほどかけて取得しました。
いずれも試験問題を解くだけの知識としては保有しておりますが、実際にAWSマネジメントコンソールやターミナル上での操作をほとんどやったことがない所謂エアプ状態です。
前提条件
- SSH 接続が可能であること
EC2 にリモートログインできる状態(TCP:22が許可されていること) - Google など外部サイトへ疎通確認ができること
名前解決の確認でdigコマンドを使用
私は検証だけして、すぐ削除予定だったのでそういう方は全開放でもいいです。
流れの確認
- ドメインリスト作成
- ルールグループ作成
大まかにやることはこれだけです。
実践
ドメインリスト作成
VPCのコンソール画面において、左側のナビゲーションペインから下記を探します。
▼ DNSファイアウォール
ルールグループ
ドメインリスト #まずはこっちのページでドメインリストを追加します
ドメインリスト名:任意の名前
1行につき1つのドメインを入力:任意のドメイン
上記2つの画像では2つのドメインリストを作成しています。
後述のルールグループ作成でTest:\*.google.co.jpは許可、Test-all:*は拒否という形で作成したいからです。
ドメインリスト作成完了!
ルールグループ作成
VPCのコンソール画面において、左側のナビゲーションペインから下記を探します。
▼ DNSファイアウォール
ルールグループ #次はこっちのページでルールグループを作成します
ドメインリスト
名前:任意の名前
上記ルールグループを作成したら、そのルールグループにドメインリストごとにルールを追加します。
名前:任意の名前
ルールタイプ:ドメインリスト(デフォルト)
ドメインリスト:カスタムドメインリスト(デフォルト)
- カスタムドメインのプルダウンから作成したドメインリストを選択します
- 私の場合は先に許可したいドメインリストを指定しています
ドメインリダイレクト設定:すべて検査(デフォルト)
クエリの種類:A
アクション:ALLOW
DNS Firewall のルール設定(AWSドキュメント)
クエリタイプ (ドメインリストのみ)
ルールが検査する DNS クエリタイプのリスト。有効な値を次に示します。
A: IPv4 アドレスを返します。 ←今回はこれ
AAAA: Ipv6 アドレスを返します。
CAA: ドメインの SSL/TLS 証明書を作成できる CA を制限します。
CNAME: 別のドメイン名を返します。
DS: 委任ゾーンの DNSSEC 署名キーを識別するレコード。
MX: メールサーバーを指定します。
NAPTR: ドメイン名の正規表現ベースの書き換え。
NS: 権威ネームサーバー。
PTR: IP アドレスをドメイン名にマッピングします。
SOA: ゾーンの管理情報の始点レコード。
SPF: ドメインから E メールを送信する権限を持つサーバーを一覧表示します。
SRV: サーバーを識別するアプリケーション固有の値。
TXT: E メール送信者とアプリケーション固有の値を検証します。
DNS タイプ ID を使用して定義するクエリタイプ (例えば、AAAA の場合は 28)。値は TYPE NUMBER として定義する必要があります。NUMBER は 1~65334 です。たとえば、TYPE28 です。詳細については、「DNS レコードタイプの一覧」を参照してください。
ルールごとに 1 つのクエリタイプを作成できます。
拒否したいドメインリストを指定する場合は
アクション:BLOCK
BLOCKアクションで送信する応答の選択:任意のアクション
- 今回はNXDOMAINを選択しています
無事ルールの追加完了です。
最後に作成したルールグループをVPCに関連付けしたら設定完了です。
[VPCを関連付け]ボタンを押し、一定時間経ってステータスが更新中から変わればOKです。
検証
digコマンドで確認します。
今回「*.google.co.jp」は許可、それ以外は拒否という形で作成しました。
dig A www.google.co.jpコマンドを0行目としたときに
5行目にstatus: NOERROR、6行目にANSWER: 1
14行目にIPアドレス172.253.63.94が返ってきているのでちゃんと許可されています。
$ dig A www.google.co.jp
; <<>> DiG 9.18.33 <<>> A www.google.co.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54618
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.google.co.jp. IN A
;; ANSWER SECTION:
www.google.co.jp. 181 IN A 172.253.63.94
;; Query time: 10 msec
;; SERVER: 172.31.0.2#53(172.31.0.2) (UDP)
;; WHEN: Wed Mar 04 06:57:30 UTC 2026
;; MSG SIZE rcvd: 61
また、dig A www.google.co.jpコマンドを0行目としたときに
5行目にstatus: NXDOMAIN、6行目にANSWER: 0
IPアドレスも返ってきていないのでちゃんと拒否されています。
$ dig A yahoo.co.jp
; <<>> DiG 9.18.33 <<>> A yahoo.co.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 48778
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;yahoo.co.jp. IN A
;; Query time: 0 msec
;; SERVER: 172.31.0.2#53(172.31.0.2) (UDP)
;; WHEN: Wed Mar 04 06:57:47 UTC 2026
;; MSG SIZE rcvd: 40
まとめ
- ドメインリストで許可または拒否したいドメインごとにリストを作成する
- ルールグループを作成し、各リストに対して許可・拒否を決めたルールを作成する
今回はドメイン名ベースの通信制御のため、IPアドレスを直接指定された場合は通信を防ぐことはできません。厳密にやりたい場合はVPCの機能であるNetwork Firewallを利用するのが推奨されているようです。そちらについてもやってみたいと思っています。
さいごに
ITエンジニア未経験でSESに転職し、実際に派遣先で働き始めてから1か月が過ぎました。(この記事を書いているタイミングの話であって、この記事が投稿されるまでに何回かセルフ見直し期間が存在するので、投稿される頃はもう少し経っていると思います。)
2~3日に1度は焦燥感に駆り立てられます。
ITエンジニアとして、知識・技術・経験を早く積まないとって日々思っています。








