注意: この記事はLLMによって英語から翻訳されたものです。正確性については保証いたしかねますので、あらかじめご了承ください。英語の原文はこちら。
今日はNAT64とDNS64について学んだ。これらはIPv6のみのネットワークがIPv4のみのネットワークと通信するための仕組みである。この仕組みにより、アクセスしようとするIPv4のみのサービスには、よく知られたプレフィックス64:ff9b::/96を使ったIPアドレスが(ローカルで)割り当てられる。
最近、スマートフォンから個人サーバー上のサービス(VPN経由でのアクセスが必要)にアクセスしようとしたところ、「403 Forbidden」というエラーが返された。「おかしいな」と思った。「WireGuardで接続しているから、アクセスできるはずなのに…」よく調べてみると、予想外のことに気づいた。WireGuardクライアント(IPv4アドレスに接続するよう設定済み)が、64:ff9b::xxxx:xxxxのようなIPv6エンドポイントに接続していたのだ。調査の結果、何らかの理由でネットワークが自分のサーバーにIPv6を割り当て、すべてのトラフィックをそこ経由で強制的に通していることがわかった。
検索してみると、新しい携帯キャリアがIPv6のみのネットワークを使用しており、IPv4のみのネットワークやサービスへの接続にNAT64とDNS64を利用していることが判明した。基本的に、起きていたことは以下の通りだ:
- スマートフォンが
mysite.comにアクセスするためにネットワークにDNSリクエストを送信 - 携帯キャリアのDNSが
mysite.comの存在しないAAAA DNSエントリを解決しようとした。解決できなかったため、(DNS Aレコードに基づき、RFC 5062を使って)64:ff9b::/96内にIPv6を作成し、スマートフォンに返した mysite.comに接続しようとする際、スマートフォンは割り当てられたIPv6を使用した。携帯キャリアのルーティングシステムがNAT64を使ってIPv4で自分のサーバーに到達していた- WireGuardのAllowed IPsリストにはサーバーのIPv4とVPNのCIDRしか登録されていなかったため、トラフィックはVPN経由でルーティングされず、サーバーによって拒否されていた
以下の図は、各コンポーネント間のすべてのやり取りをわかりやすく示している。

幸い、修正は非常に簡単だった。DNSレコードに新しいAAAAエントリを追加し、サーバーのIPv6をWireGuardのAllowed IPs設定に追加するだけで、すべてが正しくルーティングされるようになった。
参考文献と追加資料#
- DNS64: DNS Extensions for Network Address Translation from IPv6 Clients to IPv4 Servers (RFC 6147, IETF)
- IPv6 Addressing of IPv4/IPv6 Translators (RFC 5062, IETF)
- NAT64 and DNS64 (Wikipedia)
- NAT64/DNS64 (JPNIC - 日本語)
クレジット#
- カバー写真:Lars Kienle(Unsplash)