久々の記事投稿です。
背景
前にお客様から、「インターネットにはでられないはずなのに名前解決ができてしまう」という相談をいただきました。相談を受けたときに自分もあれ?と最初は思いましたが、検証等を通してその理由が判明したので軽く記載します。
構成
実際の構成を簡略化して検証しました。SGはアウトバウンド全開放です。
なお、構成図から省いていますが名前解決先はRoute53 Resolverです。なにそれわからない…という方は下記をご参照ください。
そもそも論
VPCで名前解決をする際、Provided DNSを使っており、そこにDNSクエリを投げる時にインターネット(VPC外)にクエリは出て行きません。
最初は「名前解決ができている状態=インターネット(VPC外)に通信できている」と考えてしまっていました。確かに名前解決可能かどうかでよく使うコマンドとしてたとえばdig google.comなどが挙げられますが、DNS(今回はAWSのProvided DNS)はあくまで名前からIPアドレスを結び付けるために使われる仕組みで、そこからHTTP/HTTPS等VPC外に通信可能かは必ずしも結びつきません。
ちなみに、セキュリティグループ(SG)でこのDNSクエリをブロックすることはできません。DNSリクエストのフィルタリングにはRoute 53 Resolver DNS Firewallが必要です。
セキュリティグループは、「VPC+2 IP アドレス」 (「Amazon Route 53 デベロッパーガイド」の「Amazon Route 53 Resolver」を参照) または AmazonProvidedDNS と呼ばれることがある Route 53 Resolver から送受信される DNS リクエストをブロックできません。Route 53 Resolver 経由の DNS リクエストをフィルタリングするには、Route 53 Resolver DNS Firewall を使用します。
そしてRoute 53 ResolverはIGWが無いときも、DNSクエリが解決されることは明記されていました。
Route 53 リゾルバーは、パブリック DNS ゾーンの解決に、VPC にアタッチされたインターネットゲートウェイ (IGW)、セキュリティグループ、またはネットワーク ACL を使用しない点にご注意ください。つまり、VPC にインターネットゲートウェイがアタッチされていない場合や、インターネットへのルートがない場合でも、DNS クエリは解決されます。DNS ファイアウォールは Route 53 リゾルバーに適用され、インフラストラクチャを保護するためのルールを設定できます。(自動翻訳)
試してみた
冒頭の構成でEC2にセッションマネージャで接続し、digとcurlを打ちました。
## 名前解決できる
sh-4.2$ dig www.google.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.13.11 <<>> www.google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55618
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.google.com. IN A
;; ANSWER SECTION:
www.google.com. 17 IN A 142.251.222.4
;; Query time: 0 msec
;; SERVER: 172.32.0.2#53(172.32.0.2) #VPCは172.32.0.0/24なので、.2サーバに接続
;; WHEN: Thu Sep 04 02:41:16 UTC 2025
;; MSG SIZE rcvd: 59
## 名前解決してIPはわかるが、そこに接続はできない
sh-4.2$ curl -v -4 -m 2 www.google.com
* Trying 142.251.42.164:80...
* Connection timed out after 2001 milliseconds
* Closing connection
curl: (28) Connection timed out after 2001 milliseconds
はい。名前解決はできますが、curlコマンドが通りません。想定通りの動きです。ちなみにですが、googleが使っているIPアドレスはこちらから確認できます。"142.250.0.0/15" と記載があるため、ちゃんと名前解決できています。
同じVPC内の別サブネットにNATGWとIGWを配置してルートテーブルを書き換えて再度同じように実行してみます。
##名前解決できる
sh-4.2$ dig www.google.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.13.11 <<>> www.google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35289
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.google.com. IN A
;; ANSWER SECTION:
www.google.com. 218 IN A 142.251.222.4
;; Query time: 1 msec
;; SERVER: 172.32.0.2#53(172.32.0.2)
;; WHEN: Thu Sep 04 02:51:28 UTC 2025
;; MSG SIZE rcvd: 59
## 今度はインターネットへの口があるので接続できる
sh-4.2$ curl -v -4 -m 2 www.google.com
* Trying 142.250.207.4:80...
* Connected to www.google.com (142.250.207.4) port 80
> GET / HTTP/1.1
> Host: www.google.com
> User-Agent: curl/8.3.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Thu, 04 Sep 2025 10:04:38 GMT
< Expires: -1
< Cache-Control: private, max-age=0
< Content-Type: text/html; charset=ISO-8859-1
< Content-Security-Policy-Report-Only: object-src 'none';base-uri 'self';script-src 'nonce-bVm-4N98r0s1DX4-a8rYKw' 'strict-dynamic' 'report-sample' 'unsafe-eval' 'unsafe-inline' https: http:;report-uri https://csp.withgoogle.com/csp/gws/other-hp
< P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
< Server: gws
< X-XSS-Protection: 0
< X-Frame-Options: SAMEORIGIN
< Set-Cookie: AEC=AVh_V2jpDKUBcYVAjjVsTvnEg_-a-l4olwRMBNShWM7nvZt5IakshUI3tw; expires=Tue, 03-Mar-2026 10:04:38 GMT; path=/; domain=.google.com; Secure; HttpOnly; SameSite=lax
< Set-Cookie: NID=525=DfD9qBlt3Ifro42rJOBwCGoD0BdbB_MTGPNdm1Dh1Cnnx_n5rxdWv97Jm2uG10_hU5q1JLqk_lUt8sRBG1tcF7KSSASien1QY2RNJTCkewrPZ69QT8mHFCoj9g8SQwtAKStSumLok4cczZb0qzIq3b5yTzbjWwGB9JqC001yGxNDCn2wYiabXWmIzbWuXfmB_tk6WkxbwIJdUFm4LYE; expires=Fri, 06-Mar-2026 10:04:38 GMT; path=/; domain=.google.com; HttpOnly
< Accept-Ranges: none
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
<
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja">
########
省略
########
sh-4.2$
インターネットへの口ができたため、今度はHTTPでも接続できるようになりました。
まとめ
名前を引けるのと、引いた後でそこに接続できるかは別問題ということがお判りいただけたかと思います。短いですが今回は以上です。ここまでお読みいただきありがとうございました。