Tips

2017.09.08

ネットワーク用語/ステートフルNAT64

ステートフルNAT64

ステートフルNAT64は、IPv4ネットワークとIPv6ネットワークを共存させるための技術であるNAT64の方式の1つです。NAT64はIPv6ネットワーク内の端末とIPv4ネットワークの端末間の通信を可能にするためにIPv6パケットをIPv4パケットへ変換、またはその逆を行うものです。NAT64の方式にはステートレスNAT64とステートフルNAT64があります。
 ステートフルNAT64はIPv6パケットとIPv4パケットの変換を行うトランスレータがIpv6アドレス、ポート番号とIpv4アドレス、ポート番号の対応情報といったステートを保持する方式です。

ステートフルNAT64の特徴

ステートフルNAT64はRFC6146でその動作について述べられています。
ステートフルNAT64には以下のような特徴があります。
・IPv4の端末をIPv6アドレスで表すためにIPv4-converted addressを使用する必要があります。
・IPv6ネットワーク内の端末が使用するIPv6アドレスはステートレスNAT64と違い自由に使える
・ステートフルNAT64ではIPv6アドレスとIPv4アドレスの変換が多対1で行われます。
・TCPとUDP、ICMPに対応しています。
・IPv6ネットワークからIPv4ネットワークへ通信を開始する場合をサポートしている

※IPv4-converted addressesはIPv4-embedded IPv6 addressを参照して下さい。

ステートフルNAT64のアドレス変換

 IPv6ネットワークからIPv4ネットワークへ通信する際に宛先IPv6アドレスをIPv4アドレスに変換する方法はステートレスNAT64とステートフルNAT64で変わりがありません。
 またIPv4ネットワークからIPv6ネットワークへ通信する際の送信元IPv4アドレスをIPv6アドレスに変更する際の動作もステートレスNAT64とステートフルNAT64で変わりあれません。ステートフルNAT64でもIPv6ネットワーク内のPCが宛先となるIPv4アドレスが設定されたPCを指定する際に使用するIPv6アドレスはIPv4-converted IPv6 addressesです。しかしIPv6ネットワーク内のPCが使用するIPv6アドレスが異なります。
 ステートレスNAT64ではIPv6ネットワーク内の端末はIPv4アドレスが埋め込まれたIPv4-translatable addressを使用しましたが、ステートフルNAT64では任意のアドレスを使用できます。ステートレスNAT64ではIPv4アドレスから内部のIPv6アドレスが特定できなければならないのに対して、ステートフルNAT64ではトランスレータが変換の情報や変換の方式を保持するため内部のIPv6アドレスはIPv4に対応したアドレスでなくても構いません。

以下の図で動作を見てみましょう。

図1 ステートフルNAT64
PC01から100.0.0.1へHTTPの通信を行った際に動作をみてみます。
IPv6ネットワークの端末は2001:1234:abcd::/96のネットワークを使用しているとします。PC01は2001:1234:abcd::2、PC02は2001:1234:abcd::3が割り当てられているとします。
IPv6ネットワーク内の端末はIPv4ネットワークに送信される際に、200.0.0.1と変換されるようにNAT64トランスレータで設定されているとします。
 IPv6ネットワークから100.0.0.1を指定する場合はIPv4-converted IPv6 addressesを使用します。Well-Known Prefixである64:ff9b::/96の後ろにIPv4アドレスを埋め込んだ、64:ff9b::6400:0001が宛先IPv6アドレスとなります。
IPv6ネットワーク内では宛先IPv6アドレスが64:ff9b::6400:0001、送信元IPv6アドレスが2001:1234:abcd::2となっています。
トランスレータがこのパケットを受信すると設定されている変換ルールに沿って、送信元IPv6アドレスをIPv4アドレスに変換します。今回200.0.0.1に変換されるよう設定されているため、送信元は2001:1234:abcd::2から200.0.0.1に変換します。多数のIPv6アドレスと1つのIPv4アドレスを紐づけるにはIPの変換情報だけでなく、ポート番号も必要となります。そこで今回は、送信元ポート番号は49302から20000と変換されたとします。これらの変換情報をステートレスNAT64ではトランスレータが記録しておきます。
宛先の変換は宛先IPv6アドレスがIPv4アドレスを埋め込んだものとなっているため、下位32ビットを取り出せば100.0.0.1と変換できます。
IPv4ネットワークでは送信元IPv4が200.0.0.1、宛先IPv4アドレスが100.0.0.1となります。
 次に100.0.0.1にこのパケットが到達し、応答が返ってきた場合を考えます。
応答のパケットは宛先IPv4アドレスが200.0.0.1宛先ポート番号が20000となり、送信元IPv4アドレスが100.0.0.1送信元ポート番号が80となります。
このパケットを受信したトランスレータは自身の保持している変換のテーブルを確認します。
IPv6ネットワークからIPv4ネットワークへ通信する際に記録されたエントリにそって変換が行われます。2001:1234:abcd:2 49302と200.0.0.1 20000がマッピングされているため、この内容に変換されます。
宛先IPv6アドレスは2001:1234:abcd::2、宛先ポートは49302となります。
送信元IPv6アドレスは64:ff9b::6400:0001、送信元ポートは80となります。
こうしてIPv6ネットワークとIPv4ネットワークの通信が行われます。

Recent News

Recent Tips

Tag Search