最終回 NAT64でIPv6端末をIPv4サーバにつなげよう


A10ネットワークス株式会社
山村剛久
2012/5/29
これまでのIPv4アドレス在庫で「枯渇の日」を乗り切ったとしても、もう新たな割り当てはありません。この連載では、徐々に顕在化してくると思われるIPv4アドレス枯渇問題を乗り切り、段階的にIPv6対応を進めていく手助けとなるIPv6移行ソリューションを紹介します。(編集部)

一台二役を果たす「NAT64/DNS64」

 前回の記事では、SLB-PT(IPv6→IPv4)という手法を用いてIPv6端末からIPv4サーバにアクセスする方法を説明しました。意外と簡単にIPv4サーバをIPv6化できることを実感いただけたかと思います。

 ただSLB-PTの場合、IPv4サーバはSLB-PTをサポートしたロードバランサの配下に設置し、かつSLBにサーバのIPv4アドレスを設定しなければなりません。同時に、ロードバランサのVIPに設定するIPv6アドレスは、AAAAレコードとして設定する必要があります。こういった要因から、通信対象となるIPv4サーバも自組織の管理下に置く必要があります。

 では、自組織管理下のサーバではなく、「The Internet」そのものと通信したい場合はどうすればいいでしょうか。サーバの数は無数にあります。また、そのサーバもほとんどは他組織によって運営されており、アドレス自体が変わる可能性もあります。この場合は、SLB-PTで対応するには無理があります。

 このようなケースに適しているのが、NAT64/DNS64という手法です。「NAT64」はIPv6ネットワークとIPv4ネットワークの間に立ってNAT(IPv6→IPv4)を行い、同時に「DNS64」で、DNSによる名前解決に関するIPv4/IPv6の違いを吸収します。

 そこで今回も、A10ネットワークスの「AXシリーズ」を例に用い、NAT64/DNS64の実装方法について説明します。サンプルネットワーク構成は図1の通りです。図の左側がIPv6ネットワーク、右側がIPv4ネットワークと考えてください。

図1 サンプル構成図1

 図中の各構成要素の説明は、以下の通りです。

A: Ethernet18 / VLAN30 / IPv6:2001:db8:1:2::2/64 イントラネット側のAXインターフェイス(IPv6)
B: Ethernet17 / VLAN10 / IPv4:10.111.0.2 インターネット側のAXインターフェイス(IPv4)
C: Ethernet5 / VLAN20 / IPv4:10.20.20.2 / IPv6:2001:db8:1:1::2/64 DNSサーバ群へのAXインターフェイス(IPv4/IPv6)
D: 2001:db8:1:2::254 イントラネット側IPv6へのNextHopルータ(IPv6)
E: 10.111.0.254 インターネット側IPv4へのデフォルトルータ
NAT Pool F: 10.111.0.101-110&111-120 NAT64を行う際のIPv4プールアドレス群
NAT Pool G: 10.20.20.200-220 DNSサーバへアクセスする際のIPv4プールアドレス群
H: IPv6:2001:db8:1:1::22 IPv6 DNSサーバ
I: IPv4:10.20.20.22 IPv4 DNSサーバ
VIP J:2001:db8:1:2::100 DNS64を行う際にアクセスするVIP IPv6アドレス
K: 2001:db8:1:3::1 イントラネット内のIPv6端末
L: 10.20.20.23 Logサーバ1
M: 10.20.20.24 Logサーバ2

動作フロー

 では、図1の環境で、どのようにIPv6端末からIPv4サーバへのアクセスが可能になるのか、流れを追ってみましょう。

  1. IPv6端末はwww.example.comのアドレスを解決するため、IPv6パケットでDNSリクエストを送信します。www.example.comはIPv4サーバです。DNSクエリの送信先アドレスは、AXに設定されたIPv6 VIPです。

  2. AXは、AAAA(IPv6アドレスレコード)クエリをDNSサーバに送信します。DNSサーバはIPv6でもIPv4でも対応可能です。

  3. DNSサーバは、www.example.comのAAAAレコードを探します。

  4. www.example.comはIPv4サーバですから、AAAAレコードは存在しません。DNSクエリの結果は、「DNSアンサーがない」、または「エラー」になります。

  5. DNSサーバは、4.で受信したDNSレスポンスをAXに送信します。

  6. AXは、A(IPv4アドレスレコード) クエリをDNSサーバに送信します。

  7. DNSサーバは、www.example.comのAレコードを探します。

  8. www.example.comのAレコードが解決され、IPv4アドレス(ここでは192.168.0.5)が返ってきます。

  9. DNSサーバは、8.で受信したDNSレスポンスをAXに送信します。

  10. AXは、IPv4アドレスにIPv6プレフィックス(「64:ff9b::」、デフォルト)を付与し、さらにIPv4アドレス部分を16進数に変換し、「64:ff9b::c0a8:5」をIPv6端末に送信します。

  11. IPv6端末はwww.example.comに到達するために、宛先アドレス64:ff9b::c0a8:5にパケットを送信します。

  12. AXは、64:ff9b::c0a8:5宛のパケットを、IPv4アドレス192.168.0.5に変換し送信します。また、IPv4ネットワークへ出ていくパケットの送信元IPは、AXに設定されたIP NAT PoolのIPv4アドレスに置き換えられます。

  13. www.example.comは、AXに設定されたIP NAT PoolのIPv4アドレス宛にリプライのパケットを送信します。

  14. AXはセッションエントリを確認し、192.168.0.5からのパケットをIPv6にNAT変換して、IPv6端末へ送信します。

 このように、IPv6端末とIPv4サーバの間に立つAXが、DNSの名前解決を取り持ち、通信ステータスを保持してNATを行うことで、アクセスを可能にしています。

 さて、NAT64/DNS64を導入する場合も、前回紹介したSLB-PTと同様に、以下のような事柄について検討しておく必要があります。それぞれの対処方法に関しては、前回同様、次ページでお話ししたいと思います。

検討事項1:MTU(Maximum Transfer Unit)に関連する考慮
検討事項2:L7ヘッダやそのペイロード(データ部分)のリライト(書き換え)
検討事項3:IPv4←→IPv6間の変換ログの保存

AXシリーズにおけるNAT64/DNS64の設定例

 では本題に入っていきましょう。

 まず、図1の場合のAXのコンフィグ例を示しました。ここでは設定の意味を分かりやすくするために、NAT64関係の設定をブルー、DNS64関係の設定をレッド、ロギング関係の設定をグリーンで色分けしています。

AXコンフィグ例


vlan 10						インターネット側
 tagged ethernet 17
 router-interface ve 10
!
vlan 20						DNSサーバのあるL2スイッチ側
 tagged ethernet 5
 router-interface ve 20
!
vlan 30						イントラネット側
 tagged ethernet 18
 router-interface ve 30
!
class-list c1					NAT64の設定……(1)
 2001:db8::/32 lsn-lid 1			NAT64の設定……(1)
!
interface ve 10					Interface ve10→インターネット接続
ip address 10.111.0.2 255.255.255.0
ip nat outside					NAT64の設定……(2)
!
interface ve 20					interface ve20→DNSサーバ群に接続
 ip address 10.20.20.2 255.255.255.0
ipv6 address 2001:db8:1:1::2/64
!
interface ve 30 				interface ve30→イントラネット接続
 ipv6 address 2001:db8:1:2::2/64 
 ipv6 nat inside 				NAT64の設定……(2)
!
ip route 0.0.0.0 /0 10.111.0.254 		IPv4のインターネット側へのデフォルトルート
!
ipv6 route 2001:db8:1:3::/64 2001:db8:1:2::254 	IPv6イントラネット側へのルート
!
ip nat pool p1 10.111.0.101 10.111.0.110 netmask /24 lsn	IPv4のNATプール(NAT64の設定)……(3)
ip nat pool p2 10.111.0.111 10.111.0.120 netmask /24 lsn	IPv4でNATプール(NAT64の設定)……(3)
ip nat pool source-nat-pool 10.20.20.200 10.20.20.220 netmask /24	DNSサーバへNATする際に利用(NAT64の設定)……(4)
ip nat pool-group pg1 p1 p2			p1とp2をグループ化(NAT64の設定)……(3)
!
ip nat lsn endpoint-independent-mapping enable 		(NAT64の設定)……(5)
ip nat lsn endpoint-independent-filtering enable 	(NAT64の設定)……(5)
ip nat lsn logging default-template nat64_logging	(LSN Loggingの設定)……(9)
!
nat64 prefix well-known 			(NAT64の設定)……(6)
nat64 alg ftp enable ……(6)
nat64 alg rtsp enable ……(6)
nat64 sip rtsp enable ……(6)
nat64 alg tftp enable ……(6)
nat64 inside source class-list c1		(NAT64の設定)……(1)/(6)
!
lsn-lid 1					(NAT64の設定)……(3)
 source-nat-pool pg1				(NAT64の設定)……(3)
!
slb server ipv6_22 2001:db8:1:1::22		IPv6 DNSサーバのアドレス(DNS64の設定)……(7)
   port 53  udp
slb server ipv4_22 10.20.20.22			IPv4 DNSサーバのアドレス(DNS64の設定)……(7)
   port 53  udp
!
slb service-group sg-dns64 udp			(DNS64の設定)……(8)
    member ipv4_22:53
    member ipv6_22:53
!
!
slb template dns dns-1				(DNS64の設定)……(8)
    dns64
!
slb virtual-server vip-100 2001:db8:1:2::100	(DNS64の設定)……(8)
   port 53  dns-udp
      source-nat pool source-nat-pool……(4)
      service-group sg-dns64
      template dns dns-1

slb server log1 10.20.20.23			(ログサーバの設定)……(9)
    port 514  udp
slb server log2 10.20.20.24			(ログサーバの設定)……(9)
    port 514  udp
!
slb service-group log:514 udp			(ログサーバのサービスグループの設定)……(9)
     member log1:514
     member log2:514

ip nat template logging nat64_logging		(ログテンプレートの設定)……(9)
  facility local5
  log port-mappings both
  log sessions
  include-destination
  service-group log:514
  severity informational
!

 各行の設定の意味は、以下の通りです。

(1)NAT64でNATさせるIPv6アドレスのリストを設定する
(2)NAT64でNATする際のInsideとOutsideのインターフェイスを指定する
(3)NAT64の際に使用するIPv4のプールアドレスを指定する
(4)DNSサーバへNATしてアクセスする際に利用するIPv4のプールアドレスを指定する
(5)LSN関連の設定を追加する
(6)NAT64関連の設定を追加する(ALGの有効化など)
(7)DNSサーバのアドレスを追加する
(8)DNS64関連の設定を追加する
(9)ログ関連の設定を追加する

 DNS64において一番重要な点は、AレコードとAAAAレコードの変換ロジックの部分です。どのように変換を行っているかというと、次のように至ってシンプルなロジックとなります。

 ご存じの通り、IPv4アドレス(Aレコード)の長さは32ビットです。一方IPv6アドレス(AAAAレコード)は128ビットで、その差は96ビットあります。そこで、先頭の96ビットに「64:ff9b::/96」(AXシリーズのデフォルト設定)のプレフィックスを挿入し、後半32ビットに、Aレコードで教えてもらったIPv4アドレスを充当し(表記上は16進数に変換)、IPv6アドレスを生成しています。

 こうして生成したIPv6アドレスを、名前解決を要求したIPv6端末に返すことで、IPv6端末は擬似的に生成された目的のサーバのIPv6アドレスを知ることができます。

 この後の通信は、どのように行われるのでしょうか。

 NAT64を提供するAXシリーズに、上記のようにして生成されたIPv6アドレス宛のパケットが到達すると、AXシリーズは該当IPv6アドレスのうち後半32ビットだけを抜き出して、それをIPv4のあて先アドレスとして利用をします。これにより、NATされたパケットは目的のIPv4サーバに到達できます。NATされた際のソースアドレスには、上記の設定の「ip nat pool p1」と「p2」で指定したプールから払い出されたIPv4アドレスを使用します。

 なお今回の例では、AXシリーズがNAT64機能だけでなくDNS64機能も提供していますが、InfobloxのようなDNS64をサポートしたアプライアンスと組み合わせることも可能です(ちなみにInfobloxは、A10ネットワークスのテクニカルパートナーです)。

 ここまでの設定で、NAT64/DNS64が動作し、IPv6とIPv4の間で通信できる環境となりました。

最終回 NAT64でIPv6端末をIPv4サーバにつなげよう
一台二役を果たす「NAT64/DNS64」
AXシリーズにおけるNAT64/DNS64の設定例
  フラグメンテーションのサポート
HTTPならばリンク先のリライトは原則不要に
NAT64セッションログの保存
当面続く「移行期」への備えを
「Master of IP Network総合インデックス」


Master of IP Network フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Master of IP Network 記事ランキング

本日 月間