ネットワーク用語/ステートレスNAT64
ステートレスNAT64
ステートレスNAT64は、IPv4ネットワークとIPv6ネットワークを共存させるための技術であるNAT64の方式の1つです。NAT64はIPv6ネットワーク内の端末とIPv4ネットワークの端末間の通信を可能にするためにIPv6パケットをIPv4パケットへ変換、またはその逆を行うものです。NAT64の方式にはステートレスNAT64とステートフルNAT64があります。
ステートレスNAT64はIPv6パケットとIPv4パケットの変換を行うトランスレータがパケットの作成や変更に必要な情報を必要とせず、またネットワークの要素の情報を動的に保存しない方式です。
ステートレスNAT64の特徴
ステートレスNAT64はRFC6145でその動作について述べられています。
ステートレスNAT64には以下のような特徴があります。
・IPv4側のPCをIPv6アドレスで表すためにIPv4-converted addressを使用します。
・IPv6のPCはIPv4-translatable addressを使用します。
・IPv6アドレスとIPv4アドレスの変換が1対1で行われます。
・IPv6ネットワークからIPv4ネットワークへ通信を開始する場合とIPv4ネットワークからIPv6ネットワークへ通信を開始する場合の両方をサポートしている
※IPv4-converted addresses、IPv4-translatable addressesはIPv4-embedded IPv6 addressを参照して下さい。
ステートレスNAT64のアドレス変換
IPv6ネットワークからIPv4ネットワークへ通信する際に宛先IPv6アドレスをIPv4アドレスに変換する方法はステートレスNAT64とステートフルNAT64で変わりがありません。
またIPv4ネットワークからIPv6ネットワークへ通信する際の送信元IPv4アドレスを送信元IPv6アドレスに変更する際の動作もステートレスNAT64とステートフルNAT64で変わりあれません。
異なるのはIPv6ネットワークからIPv4ネットワークへ通信する際の送信元IPv6アドレスをIPv4アドレスに変換する方法と、IPv4ネットワークからIPv6ネットワーク方向へ通信する際の宛先IPv4アドレスとIPv6アドレスの変換です。
IPv6ネットワーク内のPCが宛先となるIPv4アドレスが設定されたPCを指定する際に使用するIPv6アドレスがIPv4-converted IPv6 addressesです。このアドレスはステートレスNAT64でもステートフルNAT64でも同様に使用されます。
ステートレスNAT64ではIPv6ネットワーク内のPCはIPv4-translatable addressという
IPv4アドレスが埋め込まれたIPv6アドレスを使用します。
IPv4-translatable addressはIPv4-embedded IPv6 addressのフォーマットを使用したアドレスです。
IPv4ネットワークからIPv6ネットワークへ通信する際、IPv4のPCは宛先となるIPv6ネットワーク内のPCをIPv4アドレスで指定します。しかし実際に宛先となるPCにはIPv6アドレスが設定されているため、
IPv4ネットワークから宛先として指定されたIPv4アドレスに対応するIPv6アドレスが必要になります。
ステートレスNAT64では変換を行うトランスレータがIPv4アドレスとIPv6アドレスの紐付けを管理しないため、
IPv4ネットワークから宛先として指定されたIPv4アドレスからIPv6ネットワーク内のIPv6アドレスが特定できる必要があります。
そのためIPv4アドレスを埋め込んだIPv6アドレスであるIPv4-translatable addressをIPv6内のPCは使用することになります。IPv4に対するIPv6アドレスが決まっているため、IPv4アドレスとIPv6アドレスの変換が1対1で行われます。
以下の図で動作を見てみましょう。
図1 ステートレスNAT64の例
まずIPv6ネットワーク内のPCに設定されるIPv6アドレスから見ていきます。
IPv6側のネットワークではNetwork-Specific Prefixとして2001:1234:abcd::/96を使用することになっているとします。IPv6ネットワーク内のPCはIPv4ネットワークからは200.0.0.0/24のネットワークとして認識されているとします。IPv6ネットネットワーク内で使用するPCのIPv6アドレスはIPv4-translatable addressesとしてそれぞれのPCに割り当てられる想定のIPv4アドレスを埋め込んだものとなります。
図の例でみると、PC01は200.0.0.10に対応するものと想定した場合、IPv4-translatable addressesとしては200.0.0.10を16進数に直したアドレスc800:000aを2001:1234:abcd::/96に埋め込んだものとなります。
プレフィックスが/96なので、IPv4-embedded IPv6 addressの埋め込みルールに基づいて最後に付加した2001:1234:abcd::c800:aとなります。
次に宛先の100.0.0.1をIPv6で表すことを考えます。
宛先は100.0.0.1なので同様に16進数に直した6400:0001を最後に付加し2001:1234:abcd::6400:1となります。
PC01は宛先IPv6アドレスを2001:1234:abcd::6400:1、送信元IPv6アドレスを2001:1234:abcd::c800:aとした
IPv6パケットを送信します。
受信したNAT64のトランスレータではIPv6ヘッダをIPv4ヘッダに変換します。
宛先IPv6アドレス2001:1234:abcd::6400:1から後ろの32ビットを取り出すと100.0.0.1となります。
送信元IPv6アドレス2001:1234:abcd::c800:aから後ろの32ビットを取り出すと200.0.0.10となります。
IPv4ネットワークにパケットを送信する際は宛先IPv4アドレスを100.0.0.1、送信元IPv4アドレスを
を200.0.0.10としたIPv4ヘッダに変換します。
ステートレスNAT64ではこのようにIPv4アドレスととIPv6アドレスが1対1で紐づくため、トランスレータの方で変換内容や変換の方式を保持する必要がありません。
また1対1で紐づいているため逆も可能です。
IPv4ネットワークから宛先200.0.0.11にパケットを送信すれば、トランスレータで2001:1234:abcd::c800:000b宛のパケットに変換されるためPC02にパケットが届きます。
IPv6側から通信を始めることもIPv4から通信を始めることも可能です。