弱者は決して許すことができない。許しは強者の態度である── ガンディー
ネットワーク

書き換えた住所は、戻せるように覚えておく

支店の PC が外のサーバを見に行くとき、ルータが送信元の住所とポート番号を書き換えて変換表に 1 行覚え、帰りに書き戻すまでを 1 枚の図で追う

ぴぐおv1人の校閲なし(AI のみ)訂正なし
ネットワークnatインターネットconcept
目次

図 7 では、支店からデータセンターへ社内の住所のまま送ると、プロバイダのルータで止まりました。

それなのに、同じ支店の PC は普通にウェブを見られます。 図 7 の注では、その理由をルータの書き換えとして 1 行だけ置きました。 この記事は、その書き換えを扱います。 図 7 で挙げた 3 つの問題のうち、解けるのは「社内専用の住所はインターネットでは運ばれません」の、外のサーバへ行く分だけです。

この連載は、ネットワークの言葉を 3 つの層に置いて読みます。 もの(物理か論理か)、結びつき(人が設定で付ける手動か、機器が学習する自動か、製造時に決まる固定か)、通信フロー(1 本の通信がそれらを順に通る道筋)の 3 つです。

登場するもの

変換表(NAT テーブル)

論理のものです。 ルータの中にできる、もう 1 つの表です。 書いてあるのは「内側の住所とポート番号」と「書き換えた後の外側の住所とポート番号」の対応で、帰りの通信をこの表で逆に引いて書き戻します。

内側ローカルと内側グローバル

内側ローカルは、社内で実際に使っている住所です。 内側グローバルは、書き換えた後の外向けの住所です。 外のサーバに見えるのは後者だけです。

ポート番号

TCP や UDP が持つ番号で、1 台の機器の中でどの通信かを見分けるために使います。 ウェブの既定は 80 です。 図 5 では、ルータが見るのは IP の部分だけだと書きました。 NAT はその後ろのポート番号まで見て書き換えます。

内側の送信元を書き換える NAT の 3 種

  • 静的 NAT は、住所だけを 1 対 1 で置き換えます。人が 1 行書き、その行はずっと残ります(ポート番号まで固定で結ぶ書き方もありますが、この図では扱いません)。
  • 動的 NAT は、用意しておいた外側の住所の集まりから 1 つ割り当てます。行は通信の開始でできて、終了で消えます。同時に使えるのは住所の数までです。
  • PAT は、1 つの外側の住所をポート番号で共用します。ポート番号が違えば何台でも同じ外側の住所を使えます。この図の ② はこれです。

結びつき

  • インターフェース ⇄ 内側と外側の役は手動です。どちらの口が内側でどちらが外側かを人が指定します。この指定が無いと変換は起きません。
  • 内側の住所とポート番号 ⇄ 外側の住所とポート番号は、静的 NAT では手動です。動的 NAT と PAT では、通信の開始で自動に行ができます。
  • ルーティングテーブルとは結び付きません。NAT で行が増えるのは変換表だけで、経路の行は図 7 のままです。

通信フロー

支店の A(192.168.10.10)から、外のサーバ(192.0.2.50)のウェブを見に行き、返事が戻るまでです。

① A は宛先 192.0.2.50 が自分のネットワーク外なので、デフォルトゲートウェイ(ルータ 1)へ送ります。図 5・図 7 の ① と同じです。

② ルータ 1 は外側の口から出すときに、送信元を 192.168.10.10 のポート番号 50000 から 203.0.113.10 のポート番号 51001 に書き換え、変換表に 1 行書きます。

③ 宛先も送信元もグローバル IP なので、インターネットは運べます。図 7 の ③ で捨てられたのは、宛先が社内専用の住所だったからです。

④ サーバは返事を 203.0.113.10 のポート番号 51001 あてに返します。サーバが知っているのは書き換えた後の住所だけです。

⑤ ルータ 1 は変換表を逆に引いて、宛先を 192.168.10.10 のポート番号 50000 に書き戻し、内側へ転送します。

図 8

図の上半分が構成図と 3 種の分け方、下半分が各テーブルの推移と通信の中身の推移です。

NAT:外へ出るときに送信元の住所を書き換え、戻せるように覚えておく 図 7 の問題 2(社内専用の住所はインターネットで運ばれない)のうち、外のサーバへ行く分だけを解く 支店(自分のもの) インターネット(他人のもの) 外のサーバ(相手のもの) PC-A 192.168.10.10 GW 192.168.10.1 ルータ 1 Gi0 192.168.10.1 (内側 ip nat inside) Gi1 203.0.113.10 (外側 ip nat outside) Gi0 Gi1 ISP-1 プロバイダのルータ 203.0.113.1 ISP-2 他人の ルータ 外のサーバ 192.0.2.50 ウェブ(ポート番号 80) 1 2 3 4 5 ② ここで送信元を書き換える 送信元も宛先もグローバル IP なので運べる サーバに社内の住所は見えない 内側の送信元を書き換える NAT の 3 種(この図の ② でどれを使うか) 静的 NAT(1 対 1・固定) 人が 1 行書く(手動) 住所だけを 1 対 1 で置き換える (ポート番号まで固定で結ぶ書き方  もあるが、この図では扱わない) 行はずっと残る 外から中へ入る用途にも使える 動的 NAT(プール) 外側の住所を何個か用意しておく 通信の開始で 1 つ割り当てる 行は自動でできて、通信が  終わると消える 同時に使えるのは住所の数まで PAT(1 つの外側 IP を共用) 住所とポート番号の組で覚える ポート番号が違えば、同じ外側 IP  を何台でも共用できる 行は通信の開始で自動にできる この図の ② はこれ フロー ① A は宛先 192.0.2.50 が自分のネットワーク外なので、デフォルトゲートウェイ(ルータ 1)へ送る =図 5・図 7 の ① と同じ ② ルータ 1 は外側の口(Gi1)から出すときに、送信元を 192.168.10.10:50000 から 203.0.113.10:51001 に書き換え、変換表に 1 行書く ③ 宛先も送信元もグローバル IP なので、インターネットは運べる。図 7 の ③ で捨てられたのは、宛先が社内専用の住所だったから ④ サーバは返事を 203.0.113.10:51001 あてに返す。サーバが知っているのは書き換えた後の住所だけで、192.168.10.10 は見えない ⑤ ルータ 1 は変換表を逆に引いて、宛先を 192.168.10.10:50000 に書き戻し、内側へ転送する 3 層で見ると もの:変換表(NAT テーブル。論理)。内側ローカル=社内の実際の住所、内側グローバル=書き換えた後の外向けの住所 結びつき:インターフェース ⇄ 内側/外側の役(手動)。内側の住所+ポート番号 ⇄ 外側の住所+ポート番号(静的は手動、動的と PAT は通信で自動) フロー:図 5 の「宛先 IP・送信元 IP は端から端まで変わらない」が、NAT を通す区間で崩れる。MAC の付け替えは図 5 のまま 図 7 の 3 つの問題のうち、解けるのは問題 2 の「外向き」だけ。支店とデータセンターの社内住所同士をつなぐ話(図 10 の GRE・図 11 の IPsec)は別の道具 図の 192.0.2.50 も説明用に予約された番地(RFC 5737)。203.0.113.x は図 7 と同じ 各テーブルの推移(変換表だけは、人が書く行と通信でできる行の両方がある) 前提: ルータ 1 に PAT(1 つの外側 IP を共用)が設定してあり、Gi0 を内側・Gi1 を外側と指定済み ルータ 1: 変換表(NAT テーブル) ② 追加: 内側 192.168.10.10:50000     ⇄ 外側 203.0.113.10:51001     (相手 192.0.2.50:80) ⑤ この行を逆に引いて書き戻す 通信が終わると消える(動的・PAT) ルータ 1: ルーティングテーブル 192.168.10.0/24 → Gi0(自動) 203.0.113.0/24 → Gi1(自動) 0.0.0.0/0 → 203.0.113.1(手動) 図 7 と同じ。NAT では行は増えない ルータ 1: ARP テーブル ① 追加: 192.168.10.10 → MAC A ② 追加: 203.0.113.1 → MAC ISP-1 インターフェースの役(手動で指定) Gi0(内側): ip nat inside Gi1(外側): ip nat outside この指定が無いと変換は起きない 外のサーバから見えるもの 相手の IP は 203.0.113.10 相手のポート番号は 51001 192.168.10.10 は見えない 通信の中身の推移(フローごとのフレーム/パケット) ① PC-A → ルータ 1(内側の区間) 宛先 MAC MAC R1-Gi0 送信元 MAC MAC A 宛先 IP 192.0.2.50 送信元 IP 192.168.10.10 送信元ポート番号 50000 宛先ポート番号 80 データ ウェブ フレーム=全部。ただしスイッチが見るのは MAC とタグの部分だけ パケット=この部分。NAT を使うルータは、IP とその後ろのポート番号まで見る ② ルータ 1 → ISP-1(外側の区間・送信元 IP と送信元ポート番号が書き換わる) 宛先 MAC MAC ISP-1 送信元 MAC MAC R1-Gi1 宛先 IP 192.0.2.50 送信元 IP 203.0.113.10 送信元ポート番号 51001 宛先ポート番号 80 データ ウェブ ③ インターネットの中 宛先がグローバル IP なので運ばれる。送信元も書き換え済みなので、返事の宛先もグローバル IP になり、戻ってこられる ④ サーバ → ルータ 1(外側の区間・返事) 宛先 MAC MAC R1-Gi1 送信元 MAC MAC ISP-1 宛先 IP 203.0.113.10 送信元 IP 192.0.2.50 送信元ポート番号 80 宛先ポート番号 51001 データ 返事 ⑤ ルータ 1 → PC-A(内側の区間・宛先 IP と宛先ポート番号が書き戻る) 宛先 MAC MAC A 送信元 MAC MAC R1-Gi0 宛先 IP 192.168.10.10 送信元 IP 192.0.2.50 送信元ポート番号 80 宛先ポート番号 50000 データ 返事 NAT は IP の部分だけでなく、その後ろの TCP/UDP のポート番号まで見て書き換える。IP だけを見ていた図 5 との違い 図 5 では「宛先 IP・送信元 IP は端から端まで変わらない」と書いた。NAT を通す区間では、行きで送信元側が、帰りで宛先側が書き換わる 外側のポート番号はルータが選ぶ。内側と同じ番号をそのまま使おうとする実装もある(RFC 4787 4.2.1)。  ただし、ぶつかったときも同じ番号にし続ける使い方(ポート多重)は禁止されている(同 REQ-3) ルータの中の順序(内側 → 外側): 入口の ACL → 経路探し → 変換 → 出口の ACL  帰り(外側 → 内側)は 入口の ACL → 変換 → 経路探し → 出口の ACL で、変換のほうが先に来る 未検証: プールを使い切ったときの挙動(infraexpert の動的 NAT ページに記述なし) 出典(NAT と NAPT の定義): RFC 3022 https://www.rfc-editor.org/rfc/rfc3022.html 出典(NAPT はポート番号も変換するので 1 つのグローバル IP を共用できる): https://www.infraexpert.com/study/ip11.5.html 出典(内部ローカル・内部グローバル、ip nat inside / ip nat outside): https://www.infraexpert.com/study/natz0.html 出典(動的 NAT の行は通信の開始ででき、終了で消える): https://www.infraexpert.com/study/natz1.html 出典(外側ポート番号の選び方・ポート多重の禁止): RFC 4787 4.2.1 / REQ-3 https://www.rfc-editor.org/rfc/rfc4787.html 出典(ルータの中の順序): Cisco Understand the NAT Order of Operation  https://www.cisco.com/c/en/us/support/docs/ip/network-address-translation-nat/6209-5.html 出典(ウェブの既定のポート番号が 80): RFC 9110 4.2.1 https://www.rfc-editor.org/rfc/rfc9110.html ## 図 7・図 9 との接続

図 5 では「宛先 IP・送信元 IP は端から端まで変わらない」と書きました。 NAT を通す区間では、この約束が崩れます。 行きで送信元の側が、帰りで宛先の側が書き換わります。 MAC の付け替えは図 5 のままで、変わるのは IP とポート番号の欄だけです。

図 7 の ③ で通信が止まったのは、宛先が社内専用の住所で、途中に一致する行が無かったからです。 図 8 の ③ は宛先も送信元もグローバル IP なので運ばれます。 ただし解けたのは外向きの分だけです。 支店とデータセンターの社内住所同士をつなぐ話は図 10 の GRE、中身が読める話は図 11 の IPsec が扱います。

次の図 9 では、ルータの口に「通す・通さない」の行の並びを付けます。 ルータの中で、その判定が経路探しや変換とどの順で来るかは、この図と同じ出典で確かめられます。

未検証・注意

  • 外側のポート番号はルータが選びます。内側と同じ番号をそのまま使おうとする実装もあります(RFC 4787 4.2.1)。ただし、ぶつかったときも同じ番号を使い続ける使い方(ポート多重)は禁止されています(同 REQ-3)。図では別の番号(50000 から 51001)で描いてあり、番号が変わり得ることを見せています。
  • 動的 NAT でプールを使い切ったときの挙動は未検証です。引用したページに記述がありません。
  • 静的 NAT について「ポート番号は使わない」とは書けません。ポート番号まで固定で結ぶ書き方があります。この図では扱っていません。
  • ルータの中の処理順序は、内側から外側が「入口の ACL → 経路探し → 変換 → 出口の ACL」、外側から内側が「入口の ACL → 変換 → 経路探し → 出口の ACL」です。帰りだけ変換が先に来ます。
  • 図の 192.0.2.50 と 203.0.113.x は、説明用に予約された番地です(図 7 から引き継ぎ)。

出典

関連

この記事の校閲記録

誰が・いつ・どの版の・どの段落を・何の観点で見て、何と言ったかを全件そのまま出す(追記のみ・削除しない)。

段落 33 のうち出典つき 13・出典なし 20

v1 2 件
  • AIAI (claude-fable-5) が AI 確認未解決

    出典 8 件をすべて再取得した。NAPT が「内側の IP とポート番号」と「外側の IP とポート番号」の組を対応づけること・外向きは送信元のポート番号を、内向きは宛先のポート番号を変換することを RFC 3022 の本文で確認した。外側のポート番号に内側と同じ番号を使おうとする実装があること、ぶつかっても同じ番号を使い続ける使い方が MUST NOT であることを RFC 4787 4.2.1 と REQ-3 で確認した。ルータの中の処理順序(内側から外側は入口の ACL・経路探し・変換・出口の ACL、外側から内側は変換が経路探しより先)を Cisco のページの表で確認した。ウェブの既定のポート番号 80 は RFC 9110 4.2.1 で確認した。内部ローカルと内部グローバル・ip nat inside と ip nat outside の指定・動的 NAT の行が通信の開始ででき終了で消えることは、インフラエキスパートの該当ページで確認した。動的 NAT がプールを使い切ったときの挙動は同ページに記述が無く、未検証として本文に残した。静的 NAT について「ポート番号は使わない」とは書かず、この図では扱わない書き方に留めた。校正チェックリストを通し、例え話・体言止め・断定を示す禁止語の混入を機械検査した。守秘: 実名・社名・会場名・地名・金額なし

  • AIAI (claude-fable-5) が 編集未解決

    公開前の校閲。技術・連載整合・校正チェックリスト・frontmatter・守秘の 5 観点を通した。図 7 の 3 つの問題の言い回し、wikilink と /notes/ の実在、sources と本文「出典」の一致、アドレス計画との照合は差分なし。frontmatter のタグ NAT を、運用指示書の「英語タグは小文字・半角英数字」と公開済み記事の表記に合わせて nat に直した。本文の修正はなし。

参考文献

更新履歴

  • 連載のトピックを「ネットワーク基礎」から「ネットワーク」へ改名(32 本+目次。slug と URL は不変)
  • 公開: 連載「ネットワーク基礎」図 8〜24 の記事 17 本と目次の更新

機械可読の記録