GRE(Generic Routing Encapsulation)は、トンネリングのためのプロトコルです。トンネリングでは、あるパケットを別のパケットの中に入れて(カプセル化して)運びます。この記事では、Cisco ルータで GRE トンネルを作り、トンネルの上で OSPF を動かして、離れた2つのプライベートネットワークをつなぐまでを確認します。
- GRE におけるオーバーレイとアンダーレイの関係
- トンネルインタフェースの設定と、トンネルの状態の確認
- トンネルの上での OSPF の設定と、カプセル化されたパケットの確認
検証構成
端末A と端末B は、それぞれプライベートネットワーク(192.168.12.0/24、192.168.34.0/24)にあります。R2〜R5 の間は、インターネットに見立てたネットワーク(169.254.25.0/24、169.254.35.0/24)です。
R5 は、プライベートネットワークへのルーティング情報を持っていません。そのため、このままでは端末A と端末B は通信できません。そこで、R2 と R3 の間に GRE トンネルを作り、その上に新しいネットワーク(オーバーレイネットワーク)を作ります。GRE トンネルは、2台のルータの間を1対1(ポイントツーポイント)で結びます。
この検証では、インターネット側のアドレスとして 169.254.0.0/16 の範囲を使っています。この範囲はリンクローカル用のアドレス(RFC 3927)で、実際のインターネットでは使われません。検証用のアドレスとして読み替えてください。
GREにおけるオーバーレイとアンダーレイの整理
GRE トンネルを使うときは、ネットワークを2つの層に分けて考えるとわかりやすくなります。
| 層 | この記事のネットワーク | 役割 |
|---|---|---|
| オーバーレイ | 192.168.235.0/24(トンネル)、192.168.12.0/24、192.168.34.0/24 | トンネルの上に作る論理的なネットワーク。端末どうしの通信が流れる |
| アンダーレイ | 169.254.25.0/24、169.254.35.0/24 | トンネルを運ぶ土台のネットワーク。カプセル化されたパケットが流れる |
オーバーレイネットワークから見ると、R2 と R3 は、あたかも 192.168.235.0/24 のスイッチに直接つながっているように見えます。間にある R5 は、オーバーレイネットワークからは見えません。
実際には、R2 は端末A からのパケットを GRE でカプセル化し、アンダーレイのアドレス(169.254.25.2 → 169.254.35.3)を付けた外側の IP ヘッダで送ります。R5 は外側の IP ヘッダだけを見て転送するので、プライベートネットワークの経路を知らなくても届けられます。R3 は外側のヘッダと GRE ヘッダを外し、元のパケットを端末B へ転送します。
GRE は、元のパケットに GRE ヘッダ(基本は4バイト)と外側の IP ヘッダ(20バイト)を付けます。外側の IP ヘッダのプロトコル番号は、GRE を表す 47 になります。
GREの設定
R2 と R3 の設定を確認します。
トンネルインタフェースの設定
GRE の基本設定は次のとおりです。オーバーレイネットワークに使うトンネルインタフェースを作り、アンダーレイネットワークでの送信元と宛先の IP アドレスを設定します。今回、トンネルインタフェースのアドレスは 192.168.235.0/24 にしています。
R2
R2(config)# interface Tunnel0 R2(config-if)# ip address 192.168.235.2 255.255.255.0 R2(config-if)# tunnel source 169.254.25.2 R2(config-if)# tunnel destination 169.254.35.3 R2(config-if)#! R2(config)# ip route 169.254.35.0 255.255.255.0 169.254.25.5
R3
R3(config)# interface Tunnel0 R3(config-if)# ip address 192.168.235.3 255.255.255.0 R3(config-if)# tunnel source 169.254.35.3 R3(config-if)# tunnel destination 169.254.25.2 R3(config-if)#! R3(config)# ip route 169.254.25.0 255.255.255.0 169.254.35.5
| コマンド | 意味 |
|---|---|
| interface Tunnel0 | トンネルインタフェース Tunnel0 を作る |
| ip address | オーバーレイ側のアドレス(R2 は .2、R3 は .3) |
| tunnel source | カプセル化したパケットの送信元になる、自分のアンダーレイ側のアドレス |
| tunnel destination | カプセル化したパケットの宛先になる、相手のアンダーレイ側のアドレス |
| ip route | 相手の tunnel destination に届くための、アンダーレイの経路 |
R2 の tunnel source が R3 の tunnel destination になり、R3 の tunnel source が R2 の tunnel destination になるよう、両端で逆に設定します。トンネルのモードは指定していないので、既定の GRE(GRE/IP)になります。
R2 と R3 の間でトンネルを作るには、アンダーレイネットワークでルータどうしが通信できる必要があります。今回は、スタティックルートで R2 と R3 がお互いのアンダーレイ側のアドレスに届くようにしています。
トンネルの状態の確認
トンネルインタフェースの状態を確認します。Tunnel0 is up, line protocol is up となっていれば、トンネルインタフェースはアップしています。
R2
R2# show interfaces tunnel 0 Tunnel0 is up, line protocol is up Hardware is Tunnel Internet address is 192.168.235.2/24 MTU 17916 bytes, BW 100 Kbit/sec, DLY 50000 usec, reliability 255/255, txload 1/255, rxload 1/255 Encapsulation TUNNEL, loopback not set Keepalive not set Tunnel source 169.254.25.2, destination 169.254.35.3 Tunnel protocol/transport GRE/IP
R3
R3# show interfaces tunnel 0 Tunnel0 is up, line protocol is up Hardware is Tunnel Internet address is 192.168.235.3/24 MTU 17916 bytes, BW 100 Kbit/sec, DLY 50000 usec, reliability 255/255, txload 1/255, rxload 1/255 Encapsulation TUNNEL, loopback not set Keepalive not set Tunnel source 169.254.35.3, destination 169.254.25.2 Tunnel protocol/transport GRE/IP
| 表示 | 意味 |
|---|---|
| Tunnel0 is up, line protocol is up | トンネルインタフェースがアップしている |
| Internet address | オーバーレイ側のアドレス |
| BW 100 Kbit/sec | インタフェースの帯域幅の値。OSPF のコストの計算に使われる(STEP 4) |
| Keepalive not set | GRE キープアライブを設定していない |
| Tunnel source / destination | アンダーレイでの送信元と宛先 |
| Tunnel protocol/transport GRE/IP | IP の上で GRE を使うトンネル |
キープアライブを設定していない GRE トンネルは、tunnel source のインタフェースがアップしていて、tunnel destination への経路があれば、相手のルータが止まっていてもアップのままになります。相手の状態をトンネルの状態に反映させたい場合は、トンネルインタフェースで keepalive を設定します(既定は10秒間隔、3回応答がなければダウン)。
オーバーレイネットワークができているか確認します。R2 から、R3 のトンネルインタフェースのアドレスに Ping を実行します。
R2
R2# ping 192.168.235.3
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.235.3, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 16/34/64 ms
192.168.235.3 に Ping が届いているので、オーバーレイネットワークで R2 と R3 が通信できています。
オーバーレイネットワーク上でのルーティング設定
端末A と端末B が通信できるよう、R2 と R3 で OSPF を設定します。OSPF に入れるのは、オーバーレイ側のネットワーク(両方の LAN とトンネル)です。
OSPFの設定
R2
R2(config)# router ospf 1 R2(config-router)# network 192.168.12.0 0.0.0.255 area 0 R2(config-router)# network 192.168.235.0 0.0.0.255 area 0
R3
R3(config)# router ospf 1 R3(config-router)# network 192.168.34.0 0.0.0.255 area 0 R3(config-router)# network 192.168.235.0 0.0.0.255 area 0
トンネルインタフェースのネットワーク(192.168.235.0/24)を OSPF に入れると、R2 と R3 はトンネルの中で OSPF のネイバーになり、お互いの LAN の経路を交換します。アンダーレイのネットワーク(169.254.x.0/24)は OSPF に入れません(下の「うまくいかないとき」)。
ルーティングテーブルの確認
R2 と R3 のルーティングテーブルを確認します。
R2
R2#show ip route ospf
O 192.168.34.0/24 [110/1001] via 192.168.235.3, 01:05:23, Tunnel0
R3
R3#show ip route ospf
O 192.168.12.0/24 [110/1001] via 192.168.235.2, 01:06:51, Tunnel0
| 表示 | 意味 |
|---|---|
| O | OSPF で学習した経路 |
| [110/1001] | アドミニストレーティブディスタンス 110(OSPF)と、メトリック(コスト)1001 |
| via 192.168.235.3 | ネクストホップは、相手のトンネルインタフェースのアドレス |
| Tunnel0 | 出力インタフェースはトンネル。オーバーレイネットワークを経由する |
R2 では、192.168.34.0/24 の出力インタフェースが Tunnel0 になっていて、オーバーレイネットワークを経由することがわかります。コストの 1001 は、トンネルのコスト 1000(参照帯域幅の既定 100 Mbps ÷ トンネルの帯域幅 100 Kbit/sec)に、相手側の LAN のコスト 1 を足した値と読めます。トンネルが複数あって経路を選ばせたい場合は、トンネルインタフェースの bandwidth や ip ospf cost でコストを調整します。
疎通とカプセル化の確認
端末A(Cisco デバイス)から端末B に Ping を実行します。
端末A
PC1#ping 192.168.34.4
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.34.4, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 48/59/76 ms
traceroute を実行すると、オーバーレイネットワークを経由していることがわかります。2番目のホップは R3 のトンネルインタフェースのアドレスで、アンダーレイネットワークのアドレス(R5)は見えません。
端末A
PC1#traceroute 192.168.34.4
Type escape sequence to abort.
Tracing the route to 192.168.34.4
VRF info: (vrf in name/id, vrf out name/id)
1 192.168.12.2 12 msec 16 msec 4 msec
2 192.168.235.3 12 msec 28 msec 28 msec
3 192.168.34.4 60 msec 12 msec 72 msec
R5 で端末A から端末B への通信をパケットキャプチャすると、アンダーレイネットワークのアドレスでカプセル化されていることがわかります。
この記事の画面は、実際の画面ではなく、検証時の画面から見るポイントを抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。
▸ Ethernet II, Src: 00:00:00_00:55:55 (00:00:00:00:55:55), Dst: 00:00:00_00:33:33 (00:00:00:00:33:33)▸ 802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 351▾ Internet Protocol Version 4, Src: 169.254.25.2, Dst: 169.254.35.3 0100 .... = Version: 4 .... 0101 = Header Length: 20 bytes (5) ▸ Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)2 Total Length: 124 Identification: 0x01d9 (473) ▸ Flags: 0x0000 Fragment offset: 0 Time to live: 2543 Protocol: Generic Routing Encapsulation (47) Header checksum: 0x2a78 [validation disabled] [Header checksum status: Unverified] Source: 169.254.25.2 Destination: 169.254.35.34▸ Generic Routing Encapsulation (IP)5▸ Internet Protocol Version 4, Src: 192.168.12.1, Dst: 192.168.34.4▸ Internet Control Message Protocol
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Src: 169.254.25.2, Dst: 169.254.35.3 | 外側の IP ヘッダ。アンダーレイのアドレス(R2 の tunnel source と tunnel destination) |
| 2 | Total Length: 124 | 外側の IP パケットの長さ。元のパケット 100 バイトに、GRE ヘッダ 4 バイトと外側の IP ヘッダ 20 バイトが加わっている |
| 3 | Protocol: Generic Routing Encapsulation (47) | 外側の IP ヘッダの次に GRE ヘッダが続く(プロトコル番号 47) |
| 4 | Generic Routing Encapsulation (IP) | GRE ヘッダ。中に入っているのが IP パケットであることを示す |
| 5 | Src: 192.168.12.1, Dst: 192.168.34.4 | 内側(元)の IP ヘッダ。オーバーレイのアドレス(端末A から端末B) |
R5 は外側の IP ヘッダ(169.254.25.2 → 169.254.35.3)だけを見て転送しています。内側のプライベートアドレスは GRE の中に入っているので、R5 がプライベートネットワークの経路を知らなくても通信できます。
キャプチャで内側の IP ヘッダがそのまま読めるように、GRE はカプセル化するだけで、暗号化はしません。インターネットを経由して拠点をつなぐ場合は、GRE と IPsec を組み合わせて(GRE over IPsec)暗号化するのが一般的です。IPsec の設定は 【IPSec】サイト間IPSec(Crypto-Map) で説明しています。
うまくいかないとき
| 状態 | よくある原因 | 確認すること |
|---|---|---|
| Tunnel0 の line protocol が down | tunnel source のインタフェースがダウンしている、tunnel destination への経路がない | show ip interface brief、show ip route で宛先への経路があるか |
| トンネルはアップだが通信できない | 相手のルータが止まっている、相手側の tunnel source/tunnel destination が合っていない(キープアライブがないと、トンネルはアップのまま) | 相手側の設定、アンダーレイで相手の tunnel source に Ping が届くか |
トンネルがアップとダウンを繰り返す(%TUN-5-RECURDOWN) | トンネルの宛先への経路を、トンネル自身を経由して学習している(再帰ルーティング) | アンダーレイのネットワークをトンネル上の OSPF に入れていないか |
| Ping は通るが、大きなパケットだけ通らない | GRE のヘッダ(24 バイト)の分、運べるパケットが小さくなる(GRE の IP MTU は 1500 − 24 = 1476 が目安) | トンネルインタフェースの ip mtu、TCP なら ip tcp adjust-mss |
| OSPF のネイバーができない | トンネルのネットワークを OSPF に入れていない、エリアが違う | show ip ospf neighbor、network コマンドの範囲 |
まとめ
| 項目 | ポイント |
|---|---|
| GRE | パケットを別の IP パケットの中に入れて運ぶトンネリングのプロトコル(プロトコル番号 47)。暗号化はしない |
| オーバーレイ | トンネルの上の論理的なネットワーク。R2 と R3 が直接つながっているように見える |
| アンダーレイ | トンネルを運ぶネットワーク。中継する R5 は外側の IP ヘッダだけを見て転送する |
| トンネルの設定 | interface Tunnel0 にオーバーレイのアドレス、tunnel source と tunnel destination にアンダーレイのアドレスを設定する(両端で逆) |
| アンダーレイの経路 | 相手の tunnel destination へ届く経路が必要(今回はスタティックルート) |
| オーバーレイのルーティング | トンネルと LAN のネットワークを OSPF に入れる。アンダーレイのネットワークは入れない |
コメント