RFC 6146 (Stateful NAT64) を読む
他の RFC との関連について:
- IP/ICMP ヘッダの変換は SIIT / RFC 7915 に準ずる:
- IPv4 アドレスと IPv6 アドレスとの間の (等価な) 相互変換は RFC 6052 に準ずる
- 実際のネットワーク上の IPv4 アドレスと IPv6 アドレスのマッピングについては NAPT / RFC 3022 に準ずる.つまり IPv4 の NAPT を再利用できる.
この RFC が定義すること:
- ユニキャストの TCP, UDP, ICMP トラフィックを Stateful NAT64 Translator が変換する方法
定義しないこと:
- マルチキャストおよび TCP, UDP, ICMP 以外のトラフィックの変換方法 (SCTP, DCCP, IPsec を含む)
DNS64 は A RR を AAAA RR に変換する仕組みである.このとき, A レコードの持つ IPv4 アドレスは NAT64 と同様に RFC 6052 に準じて IPv6 アドレスへ変換される (同じ端末の利用する NAT64 と DNS64 でこのしくみは同じでないとうまく動かないことは自明) .
NAT64 + DNS64 の二つによって, IPv6 オンリーなクライアント (IPv6 接続しか持たないホスト, IPv6 のみを実装するホスト, IPv6 のみを実装するアプリケーション) から IPv4 オンリーなサーバへの接続を確立できる.
IPv4 アドレスの枯渇により, IPv6 接続しか提供されなくなることもあるかもしれない.その際も既存の IPv4 のサーバに接続したいだろう. NAT64 + DNS64 の組み合わせは IPv4 -> IPv6 への移行および共存についてとても重要である.またこのペアは IPv6 クライアントと IPv4 サーバのどちらにも変更を加える必要がないので容易にデプロイ可能である.
具体的なユースケースの例は RFC 6144 にある.
NAT64 の機能:
- NAT64 は NAT がどのように UDP, TCP, ICMP を扱うかにおける推奨事項 (それぞれ RFC 4787, RFC 5382, RFC 5508) に準拠する.そのため, NAT64 は端末非依存のマッピングと,端末非依存およびアドレス依存のフィルタリングのみをサポートする.また,これらの事項に準拠することから, ICE / RFC 5245 などの NAT トラバーサル技術にも対応する.
– NAT64 が以前のステートを持たない場合, IPv6 ノードだけが IPv4 ノードへのセッションを開始できる.これは IPv4-IPv4 の NAT で動作するアプリケーションであれば問題ない.
-
NAT64 が何らかの方法で IPv6 ノードへのマッピングを知ることができれば,利用するフィルタリングポリシ (端末非依存またはアドレス依存) によって, IPv4 ノードから IPv6 ノードへセッションを開始することもできる.
- IPv6 ノードが最近同じまたは別の IPv4 ノードへのセッションを開始した場合.これは NAT トラバーサル技術を使う時も当てはまる
- 静的に設定されている場合 (いわゆる "ポート開放" のうちの NAT の部分)
-
NAT64 は複数の IPv6 オンリーノード間で IPv4 インターネットアクセスのためのアドレスを共有できる.
– 先述されているとおり TCP, UDP, ICMP のみをサポートする.他のプロトコルについては他の文書で定義される.
NAT64 は IPv4 ネットワークに接続された IPv4 インターフェースと, IPv6 ネットワークに接続された IPv6 インターフェースを持つ. IPv6 側から来たパケットは NAT64 が変換して IPv4 側へ送出する. NAT64 は非対称のため,戻りパケットは話が変わる. IPv4 から IPv6 への変換にはステートを要求する.これには IPv6 トランスポートアドレス[1] と IPv4 トランスポートアドレスの束縛 (binding) を含む.
このステートは NAT64 に静的に設定されるか, IPv6 側からはじめてパケットが来て変換されたときに作成される.つまり一般的に (NAT トラバーサルしない限り) IPv6 ノードからしか通信を開始できないことになる.
-
トランスポートアドレスは IP アドレスと TCP/UDP ポート番号の組み合わせをいう. ↩︎
NAT64 のメイン要素は Translator であって,これはアドレス変換とプロトコル変換の二つに分けられる.
プロトコル変換 (どのように IPv4 ヘッダを IPv6 ヘッダにするか,その逆も) は先述された通り SIIT に準じて行われる.
アドレス変換は IPv6 トランスポートアドレスを IPv4 トランスポートアドレスに変換,またはその逆を行なってマッピングする.このために, IPv4 アドレスを IPv6 アドレスとして表すための IPv6 アドレスプールと, IPv4 ネットワークで使うアドレスのプールの 2 つを持つ.
IPv6 アドレスプールは一つまたは複数のプレフィクス Pref64::/n の集まりである.複数指定されたときすべてのプレフィクスに対して変換を適用する.すべてのプレフィクスにおいて,ホスト部は IPv4 アドレススペース 32 bit より長い必要がある.
IPv4 アドレスプールは IPv4 アドレスの集まり,一般的には割り当てられたプレフィクスである. IPv4 アドレスは限られた資源なので IPv6 アドレスと一対一にマップすることは現実的でない.したがって NAT64 では IP アドレス同士を変換するのではなく IP トランスポートアドレス同士を変換する[1] .
-
現在 NAT と呼ばれているものは大体 NAPT である.この文があるということは NAT64 も NAPT64 というわけだが…… ↩︎
RFC 6146 ,NAT64 の概念をどうやっても理解してもらおうとあまりにも丁寧すぎて同じこと何回も書かれてる
NAT64 はルールに従ってパケットをフィルタリング (状況に応じて特定のパケットのみを許可するという意味) できる.これは NAT64 の IPv4 アドレスプールや CPU, ポート, メモリといったリソースを消費する DoS 攻撃を防ぐ手段を提供するためである.どうやってフィルタリングするかは NAT64 の範疇ではないので書いてない
ただ,IPv4 パケットをフィルタリングすることは NAT64 のステートの扱いにも関係するので,その扱いは書かれている.
端末非依存 (Endpoint-Independent) フィルタリングを行う場合,入ってきたパケットの宛先トランスポートアドレスが NAT64 のステートに存在していなければパケットをドロップする.
アドレス依存 (Address-Dependent) フィルタリングを行う場合,入ってきたパケットの宛先トランスポートアドレスと,送信元 IP アドレスが一致するステートが存在していなければパケットをドロップする.