2026年6月5日

2026年6月5日

DNS64 を設定する手順:NAT64と組み合わせてIPv6専用環境からIPv4サイトへ接続する

DNS64 は、IPv4アドレスしか持たない宛先について、NAT64 用のIPv6アドレス(AAAAレコード)を合成して返すDNSの機能です。DNS64 だけでは通信できず、合成したアドレスを実際にIPv4へ変換する NAT64 とセットで動かすことが前提になります。この記事では、仕組みの要点、BIND・Unbound・AWS での設定例、動作確認の方法、導入時に起きやすい問題を説明します。

DNS64 とNAT64の役割

IPv6だけを持つサーバー(IPv6シングルスタック)から、IPv4しか持たない外部サービスに接続したい場面を考えます。たとえば WordPress を IPv6専用のサブネットに置いたとき、プラグインの更新や外部API呼び出しの接続先がIPv4だけだと、そのままでは通信できません。

ここで次の2つが協力します。

  • DNS64: 接続先のAAAAレコードが存在しない場合、Aレコードの値(IPv4アドレス)を NAT64 プレフィックスの中に埋め込み、合成したAAAAとして返します。標準のプレフィックスは 64:ff9b::/96 で、192.0.2.1 は 64:ff9b::c000:201 になります。
  • NAT64: 64:ff9b::/96 宛てのIPv6パケットを受け取り、埋め込まれたIPv4アドレスに向けて変換して送り出します。

つまり、DNS64 は「宛先を教える係」、NAT64 は「実際に運ぶ係」です。DNS64 を設定してもNAT64へのルートがなければ、名前解決は成功するのに接続はタイムアウトする、という状態になります。

設定前に決めること

使うプレフィックス

多くの環境では標準の 64:ff9b::/96 を使います。独自のプレフィックス(ネットワーク固有プレフィックス)を使う場合は、DNS64 と NAT64 の両方で同じ値を設定します。標準プレフィックスはグローバルなIPv4アドレスの表現に使うものとされているため、社内のプライベートIPv4アドレスを合成の対象にしない設定にしておきます。

DNS64 を使うクライアントの範囲

DNS64 の結果は、デュアルスタック(IPv4とIPv6の両方を持つ)の端末にとっては遠回りになります。IPv4で直接つながる宛先まで NAT64 経由になってしまうためです。DNS64 のリゾルバーは、IPv6専用のネットワークのクライアントだけが使うように範囲を絞ります。

BIND での設定例

BIND では options に dns64 ブロックを書きます。設定を変更する前に、現在の named.conf を控えておいてください。

options {
    // 既存の設定はそのまま
    dns64 64:ff9b::/96 {
        clients { 2001:db8:100::/48; };
        mapped { !10.0.0.0/8; !172.16.0.0/12; !192.168.0.0/16; any; };
        exclude { ::ffff:0:0/96; };
    };
};

clients は DNS64 を適用する問い合わせ元、mapped は合成の対象にするIPv4アドレス、exclude は「このAAAAが返ってきても無視して合成する」範囲です。IPv6アドレスのブロック 2001:db8:100::/48 は例なので、実際のIPv6専用サブネットに置き換えます。

sudo named-checkconf
sudo systemctl reload named

named-checkconf が何も出力しなければ構文は正しく読み込めています。

Unbound での設定例

Unbound では、モジュールの並びに dns64 を加え、プレフィックスを指定します。

server:
    module-config: "dns64 validator iterator"
    dns64-prefix: 64:ff9b::/96

module-config の順番は意味を持ちます。dns64 を先頭に置く書き方が Unbound の説明書きに沿った形です。変更後は unbound-checkconf で確認してから再起動します。

sudo unbound-checkconf
sudo systemctl restart unbound

AWS での設定例

AWS の VPC では、サブネット単位で DNS64 を有効にでき、NAT64 は NAT ゲートウェイが担います(2026年10月現在の機能です。対応リージョンや細かな条件は AWS のドキュメントで確認してください)。

# サブネットで DNS64 を有効にする
aws ec2 modify-subnet-attribute --subnet-id subnet-0123456789abcdef0 --enable-dns64

# 64:ff9b::/96 宛てを NAT ゲートウェイへ向けるルートを追加する
aws ec2 create-route --route-table-id rtb-0123456789abcdef0 \
  --destination-ipv6-cidr-block 64:ff9b::/96 \
  --nat-gateway-id nat-0123456789abcdef0

NATゲートウェイは、IPv4のインターネット接続を持つパブリックサブネットに置く必要があります。セキュリティグループやネットワークACLで、64:ff9b::/96 宛ての送信と戻りの通信を止めていないかも確認します。

動作確認の方法

合成されたAAAAが返るか

ipv4only.arpa は、DNS64 の確認用に用意されたIPv4専用の名前です。DNS64 が動いていれば、プレフィックスに 192.0.0.170 と 192.0.0.171 を埋め込んだアドレスが返ります。

dig AAAA ipv4only.arpa @(DNS64リゾルバーのアドレス) +short
# 64:ff9b::c000:aa
# 64:ff9b::c000:ab

何も返らない場合は、問い合わせ元が clients の範囲に入っているか、リゾルバーの再読み込みが済んでいるかを確認します。

NAT64 を通って接続できるか

合成アドレスが返っても、通信できるかは別に確認します。IPv6専用のサーバーから次のように試します。

# IPv6で外部のIPv4サイトへ接続できるか
curl -6 -sI https://example.com/ | head -n 1

# 経路がNAT64に向いているか
ip -6 route get 64:ff9b::c000:201

名前解決は成功するのに curl がタイムアウトするなら、NAT64 へのルート、NAT64 装置の状態、ファイアウォールの順に確認します。

導入時に起きやすい問題

IPv4アドレスを直接指定した通信は通らない: DNS64 は名前解決を通る通信にしか効きません。設定ファイルやアプリケーションにIPv4アドレスを直書きしている場合は、名前での指定に直すか、端末側でIPv4を扱える仕組み(464XLAT など)を検討します。

DNSSEC の検証と相性が悪い: 合成したAAAAには署名がありません。リゾルバー側の検証は DNS64 と両立するように作られていますが、端末自身が DNSSEC を検証する場合、合成された応答を拒否することがあります。こうした端末がある環境では動作を事前に確かめてください。

ログや制限でIPアドレスが変わって見える: NAT64 を通ると、接続先から見た送信元はNAT64装置のIPv4アドレスになります。外部APIでIP制限を使っている場合は、許可リストの登録先を見直します。

デュアルスタックの端末が遠回りになる: 先に述べたとおり、DNS64 を使う範囲を絞ることで避けられます。

まとめ

  • DNS64 はAAAAを合成するだけで、通信の変換は NAT64 が行います。両方を同じプレフィックスで設定します。
  • BIND は dns64 ブロック、Unbound は module-config と dns64-prefix、AWS はサブネットの DNS64 有効化と NAT ゲートウェイへのルートで設定します。
  • DNS64 を使うクライアントはIPv6専用ネットワークに限り、プライベートIPv4を合成の対象から外します。
  • dig AAAA ipv4only.arpa で合成を、curl -6 で実際の接続を、それぞれ分けて確認します。
  • IPv4アドレスの直書き、端末側の DNSSEC 検証、送信元IPの変化は、導入前に洗い出しておきます。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲