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

社内あてのパケットを、別のパケットの中に入れて運ぶ

支店とデータセンターの間に論理の口を 1 つ作り、社内あてのパケットをグローバル IP あてのパケットの中に入れて運ぶ。包んだ後にもう一度テーブルを探し直す段が増える

ぴぐおv1人の校閲なし(AI のみ)訂正なし
ネットワークgreトンネルルーティングconcept
目次

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

図 8 の書き換えは、外のサーバへ行くための道具で、拠点同士をつなぐ話には使えません。 この記事は、図 7 で挙げた 3 つの問題のうち「途中のルータの経路表を自分では書けません」と「社内専用の住所はインターネットでは運ばれません」の 2 つを、拠点同士について解きます。 3 つ目の「通信の中身は誰にでも読めます」は、この図では残ったままです。

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

登場するもの

トンネルインターフェース(Tunnel0)

論理のものです。 ケーブルも物理ポートも 1 本たりとも増えていません。 ルーティングテーブルの出口の欄に、物理ポートと同じように書ける口です。 実体は「包んで別の口から出す」処理です。

カプセル化

1 つのパケットの中に、別のパケットがまるごと入っている状態です。

GRE ヘッダ

論理のもので、通信 1 つずつに付きます。 最小 4 バイトで、この後ろに元のパケットがまるごと入ります。

外側 IP ヘッダ

宛先が相手ルータの外側グローバル IP、送信元が自分の外側グローバル IP です。 IPv4 では 20 バイトです。 プロトコルの欄は 47 で、途中の機器はこの番号で「中に別のパケットが入っている」と分かります。 分かるだけで、中身は読めます。

結びつき

  • Tunnel0 ⇄ source と destination の外側グローバル IP は手動です。両端のルータに、互いの外側の番地を人が書きます。
  • Tunnel0 ⇄ 社内あての行(192.168.3.0/24 → Tunnel0)は手動です。この行を書かないと、社内あては相変わらずデフォルトルートへ流れて捨てられます。
  • トンネルの中の番地(10.0.0.0/30)の行だけ自動です。自分の口の IP から行が載る、という図 1 と同じ理屈が論理の口にも働きます。

通信フロー

支店の A(192.168.10.10)から、データセンターの C(192.168.3.10)へ送ります。

① A はデフォルトゲートウェイ(ルータ 1)へ送ります。図 5・図 7 の ① と同じで、PC 側は何も変わりません。

② ルータ 1 はテーブルを探します。192.168.3.0/24 に一致する行の出口が Tunnel0 なので、そこへ渡します。

③ Tunnel0 は元のパケットの前に GRE ヘッダと外側 IP ヘッダを付けます。外側の宛先は 198.51.100.20、送信元は 203.0.113.10 です。できた新しいパケットを、ルータ 1 はもう一度テーブルで探し直し、デフォルトルートに従って Gi1 から送り出します。

④ プロバイダのルータは外側の宛先だけを見て運びます。中に入っている 192.168.3.10 は見ません。

⑤ ルータ 2 の Tunnel0 が外側 IP ヘッダと GRE ヘッダを外します。出てくるのは ① とまったく同じパケットです。それを自分のテーブルで探し、Gi1 から C へ送ります。

図 10

図の上半分が構成図と包むと何が増えるか、下半分が各テーブルと設定・通信の中身の推移です。

GRE トンネル:社内あてのパケットを、グローバル IP あての別のパケットの中に入れて運ぶ 図 7 の問題 1(途中のルータの経路表を書けない)と問題 2(社内専用の住所は運ばれない)の解。問題 3(中身が読める)は残る 支店(自分のもの) インターネット(他人のもの) データセンター(自分のもの) PC-A 192.168.10.10 GW 192.168.10.1 ルータ 1 Gi0 192.168.10.1 Gi1 203.0.113.10 (グローバル IP) Gi0 Gi1 ISP-1 他人の ルータ ISP-2 他人の ルータ ISP-3 他人の ルータ ルータ 2 Gi0 198.51.100.20 (グローバル IP) Gi1 192.168.3.1 Gi0 Gi1 PC-C 192.168.3.10 GW 192.168.3.1 Tunnel0 10.0.0.1 /30 Tunnel0 10.0.0.2 /30 トンネル(論理。ケーブルは 1 本も増えていない) 両端のルータだけが作る「直結しているように見える 1 本」 source と destination は互いの外側グローバル IP(手動) 1 2 3 4 5 包む 外す 外側の宛先 198.51.100.20 だけを見て運ばれる 包むと何が増えるか 元のパケットの前に 2 つ足す(カプセル化) ・GRE ヘッダ:最小 4 バイト(RFC 2784) ・外側 IP ヘッダ:20 バイト(IPv4) 合わせて 24 バイト増える テーブルに足す 1 行 192.168.3.0/24 → Tunnel0(手動) 出口が物理ポートではなく論理の口になる 包んだ後の新しいパケットは、もう一度 テーブルで探し直されて Gi1 から出る 減るもの:一度に運べる大きさ 1500 − 24 = 1476 Tunnel0 の既定の IP MTU は 1476 バイト (物理インターフェースより 24 バイト小さい) 大きいパケットは分割される。「分割するな」の 印が立っていれば、分割できず捨てられる フロー ① PC-A は宛先 192.168.3.10 が自分のネットワーク外なので、デフォルトゲートウェイ(ルータ 1)へ送る。図 5・図 7 の ① と同じ ② ルータ 1 はテーブルを探す。192.168.3.0/24 に一致する行の出口が Tunnel0(物理ポートではなく論理の口)なので、そこへ渡す ③ Tunnel0 は元のパケットの前に GRE ヘッダと外側 IP ヘッダを付ける。外側の宛先は 198.51.100.20、送信元は 203.0.113.10 できた新しいパケットを、ルータ 1 はもう一度テーブルで探し直し、デフォルトルートに従って Gi1 から送り出す ④ プロバイダのルータは外側の宛先(グローバル IP)だけを見て運ぶ。中に入っている 192.168.3.10 は見ない。図 7 の ③ で捨てられたのはここ ⑤ ルータ 2 の Tunnel0 が外側 IP ヘッダと GRE ヘッダを外す。出てきた元のパケットを自分のテーブルで探し、Gi1 から PC-C へ送る 増えたもの トンネルインターフェース(Tunnel0):論理。物理ポートと同じようにテーブルの出口に書けるが、実体は「包んで別の口から出す」処理 カプセル化:1 つのパケットの中に、別のパケットがまるごと入っている状態。外から見えるのは外側だけ 3 層で見ると もの:トンネルインターフェース(論理)・GRE ヘッダ(通信 1 つずつに付く 4 バイト以上の札) 結びつき:Tunnel0 ⇄ source/destination の外側 IP(手動)。Tunnel0 ⇄ 社内あての行(手動)。10.0.0.0/30 の行だけ自動 フロー:図 5 の ②「一致する行の出口へ送る」の出口が論理の口になり、包んだ後にもう一度テーブルを探し直す段が増える 各テーブルと設定(②④ の番号は上のフローに対応。青字) ルータ 1: ルーティングテーブル 192.168.10.0/24 → Gi0(自動) 203.0.113.0/24 → Gi1(自動) 10.0.0.0/30 → Tunnel0(自動・トンネルの中の番地) ②192.168.3.0/24 → Tunnel0(手動) 0.0.0.0/0 → 203.0.113.1(手動) ルータ 1: Tunnel0 の設定(手動) source 203.0.113.10(自分の外側) destination 198.51.100.20(相手の外側) IP 10.0.0.1/30 IP MTU 1476(既定) ISP のルーティングテーブル 198.51.100.0/24 の経路は載っている 192.168.3.0/24 の行は無いままでよい ④外側の宛先だけ見れば運べる ルータ 2: ルーティングテーブル 198.51.100.0/24 → Gi0(自動) 192.168.3.0/24 → Gi1(自動) 10.0.0.0/30 → Tunnel0(自動) 192.168.10.0/24 → Tunnel0(手動・戻り用) 0.0.0.0/0 → 198.51.100.1(手動) ルータ 2: Tunnel0 の設定(手動) source 198.51.100.20 destination 203.0.113.10 IP 10.0.0.2/30 向きが逆なだけで、中身は同じ組 事故:再帰ルーティング destination 198.51.100.20 への経路を Tunnel0 自身から学んでしまうと、包む → 出口を探す → またトンネル、と回り続ける Cisco はこれを %TUN-5-RECURDOWN として公開 → 外側の宛先だけは別の経路で持たせる 通信の中身の推移(フローごとのフレーム/パケット) ① PC-A → ルータ 1(図 5・図 7 の ① と同じ) 宛先 MAC MAC R1-Gi0 送信元 MAC MAC A 宛先 IP 192.168.3.10 送信元 IP 192.168.10.10 データ ping フレーム=全部。ただしスイッチが見るのは MAC とタグの部分だけ パケット=この部分。ルータはここ(IP)を見る ② ルータ 1 の中 テーブルの 192.168.3.0/24 の行の出口が Tunnel0。Tunnel0 が ① のパケットをまるごと「データ」として抱え、前に GRE ヘッダと外側 IP ヘッダを付ける ③ ルータ 1 → ISP-1(入れ子になった。外側だけが運ばれる) 宛先 MAC MAC ISP-1 送信元 MAC MAC R1-Gi1 外側 宛先 IP 198.51.100.20 外側 送信元 IP 203.0.113.10 GRE ヘッダ 4 バイト以上 内側 宛先 IP 192.168.3.10 内側 送信元 IP 192.168.10.10 データ ping ④ ルータ 2 の中 外側の宛先が自分なので受け取る。外側 IP ヘッダと GRE ヘッダを外すと、① とまったく同じパケットが出てくる。それを自分のテーブルで探す ⑤ ルータ 2 → PC-C(MAC は付け替わる。IP は ① のまま) 宛先 MAC MAC C 送信元 MAC MAC R2-Gi1 宛先 IP 192.168.3.10 送信元 IP 192.168.10.10 データ ping 橙の箱=プロバイダが見る外側。青の箱=社内の元の宛先。GRE ヘッダの最小の大きさは 4 バイト(RFC 2784 §2.1)。外側 IP ヘッダ(IPv4)は 20 バイト 外側 IP ヘッダのプロトコルの欄は 47(GRE・RFC 2784 §4)。途中の機器はこの番号で「中に別のパケットが入っている」と分かる。ただし中身は読める 外側 IP ヘッダ 20 + GRE 4 = 24 バイトぶん、一度に運べる大きさが減る。Cisco の既定では Tunnel0 の IP MTU は 1500 − 24 = 1476 バイト 入りきらないパケットは分割される。ただし「分割するな」の印(DF)が立っていると分割できず、捨てられる(RFC 791 §2.3) 青の箱の中身(内側の宛先・送信元・データ)は暗号化されていない。途中で開けば読める。図 7 の問題 3 は残っている(次の図で封をする) 再帰ルーティング: 包んだ後の宛先(トンネルの destination)への経路をトンネル自身から学んでしまうと、包む → 出口を探す → またトンネル、と回り続ける  Cisco はこれを %TUN-5-RECURDOWN というログの意味として公開しており、検知するとトンネルを数分間 down にする、と説明している  直し方は、トンネルの宛先への経路だけを別に(より範囲の狭い行で)持たせること。なお RFC 2784 が捨てると書いているのは別の話(包んだ中身の宛先が自分自身の場合) 出典(GRE の仕様・ヘッダの大きさ・プロトコル番号 47): RFC 2784 https://www.rfc-editor.org/rfc/rfc2784 出典(トンネルの IP MTU 1476): Cisco の解説 https://www.cisco.com/c/en/us/support/docs/ip/generic-routing-encapsulation-gre/25885-pmtud-ipfrag.html 出典(再帰ルーティングと %TUN-5-RECURDOWN): Cisco の解説 https://www.cisco.com/c/en/us/support/docs/ip/enhanced-interior-gateway-routing-protocol-eigrp/22327-gre-flap.html ## 図 7・図 11 との接続

図 5 の ② は「一致する行の出口へ送る」でした。 図 10 では、その出口が論理の口になり、包んだ後にもう一度テーブルを探し直す段が増えます。 図 5 には無かった段はここだけで、MAC の付け替えはそのまま生きています。

図 7 の ③ でプロバイダのルータが運べなかったのは、宛先が社内専用の住所だったからです。 図 10 の ④ で運べるのは、外側の宛先がグローバル IP だからです。 プロバイダに載っているのはグローバル IP の経路だけでよく、192.168.3.0/24 の行は 1 つも要りません。

残った問題 3 は、図の帯で内側の宛先・送信元・データが読める状態で並んでいるところに出ています。 次の図 11 で、この中身に封をします。

未検証・注意

  • 外側 IP ヘッダ 20 バイトと GRE ヘッダ 4 バイトで、一度に運べる大きさが 24 バイト減ります。Cisco の既定では、トンネルインターフェースの IP MTU は物理インターフェースより 24 バイト小さくなり、1500 に対して 1476 です。1500 は一般的なイーサネットの値、1476 は Cisco の既定値で、どちらも規格が定めた値ではありません。回線によって違います。
  • 入りきらないパケットは分割されます。ただし「分割するな」の印(DF)が立っていると分割できず、捨てられます。これは IPv4 一般の決まりです。なお RFC 2784 §9 は「既存の GRE 実装は経路 MTU 探索を行わず、配送ヘッダに分割禁止の印を立てない」と書いているので、外側そのものは途中で分割されることがあります。
  • GRE ヘッダは「最小 4 バイト」です。チェックサムを付ける設定では長くなります。
  • 再帰ルーティングという事故があります。包んだ後の宛先(トンネルの destination)への経路をトンネル自身から学んでしまうと、包む・出口を探す・またトンネル、と回り続けます。Cisco はこれを %TUN-5-RECURDOWN というログの意味として公開しており、検知するとトンネルを数分間 down にする、と説明しています。直し方は、トンネルの宛先への経路だけを、より範囲の狭い行で別に持たせることです。このログの文字列は Cisco 機器の表示で、他社の機器で同じ言い方をするかは確認していません。
  • RFC 2784 にも捨てるという記述はありますが、それは包んだ中身の宛先が自分自身だった場合の話で、再帰ルーティングとは別です。
  • 勉強会のラボは 3 拠点・トンネル 3 本という構成でしたが、この図は 2 拠点・トンネル 1 本に単純化しています。

出典

  • 勉強会での本人の観察(2026-09-13 実機ハンズオン。資料は非公開)
  • RFC 2784: Generic Routing Encapsulation (GRE) — §2 の「Delivery Header / GRE Header / Payload packet」、§2.1 の最小 4 オクテット、§4「The IPv4 protocol 47 is used when GRE packets are encapsulated in IPv4」、§9「既存の実装は経路 MTU 探索を行わず、配送ヘッダに DF を立てない」
  • RFC 791: Internet Protocol — §2.3「If internet datagram marked don't fragment cannot be delivered to its destination without fragmenting it, it is to be discarded instead」
  • Cisco: GRE と IPsec の断片化・MTU・PMTUD — トンネルインターフェースの IPv4 MTU は既定で物理より 24 バイト小さく、1476 になる
  • Cisco: GRE Tunnel Interface Flaps — 宛先への経路がトンネル自身を指すと回り続ける。検知すると数分間トンネルを down にする。トンネルの宛先には範囲の狭いスタティックルートを持たせる

関連

この記事の校閲記録

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

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

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

    出典 4 件を再取得した。配送ヘッダ・GRE ヘッダ・中のパケットという 3 層の並び、GRE ヘッダの最小 4 バイト、IPv4 に包むときのプロトコル番号 47 を RFC 2784 の §2・§2.1・§4 で確認した。同 §9 が「既存の GRE 実装は経路 MTU 探索を行わず、配送ヘッダに分割禁止の印を立てない」と書いていることも確認し、分割禁止の印で捨てられるという記述は IPv4 一般の決まり(RFC 791 §2.3)として書き分けた。トンネルインターフェースの既定の IP MTU が物理より 24 バイト小さく 1476 になることを Cisco のページで確認した。再帰ルーティングについては、Cisco が同社のページで現象・検知したときにトンネルを数分間 down にすること・トンネルの宛先に別の経路を持たせる直し方まで公開していることを確認したので、未検証としては扱っていない。ただし RFC 2784 が捨てると書いているのは包んだ中身の宛先が自分自身の場合で別の話なので、そちらには寄せていない。ログの文字列が他社の機器でも同じかは確認していないため未検証に残した。1500 と 1476 が規格の値ではないことも本文に書いた。校正チェックリストを通し、例え話・体言止め・断定を示す禁止語の混入を機械検査した。守秘: 実名・社名・会場名・地名・金額なし

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

    公開前の校閲。frontmatter のタグ GRE を小文字の gre に直した。本文は、図 7 の 3 つの問題のうち解く 2 つの言い回しが公開済みの図 7 と一致すること、外側のプロトコル番号 47・GRE ヘッダ最小 4 バイト・24 バイト減・再帰ルーティングの記述が図の担当メモと一致することを確認し、修正はしていない。

参考文献

更新履歴

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

機械可読の記録