Linux 2.6でのGREカプセル化に基づいたポイントツーマルチポイントトンネルの作成

Linuxには、ipipとgreの2種類のトンネルのサポートが組み込まれています。 トンネルがシステムで従来使用されている形式では、どちらを使用するかは重要ではありません。どちらもIPv4-in-IPv4トンネルに送信されるパケットに対して厳密に同じオーバーヘッドを与え(特にチェック)、IPsecによって等しく保護され、使用します処理に同じプロセッサ時間。 ただし、これらは異なるタイプのトンネルであり、greの可能性ははるかに広くなっています。

残念ながら、greトンネルの非常に便利で素晴らしい機能はインターネット上のどこにも記載されておらず、ほとんどの(すべてではないにしても)Linux管理者はmGREトンネルのような可能性を認識していません。 幸いなことに、私たちはこの欠点を補うつもりです:-)







したがって、3台のマシンがあり、3台すべてがLinuxバージョン2.6を実行しています(よくわからない、おそらく2.4もサポートしています)。 また、iproute2パッケージも必要です。これは、最新のLinuxシステムの標準です(ちなみに、古いユーティリティifconfig、routeなどは忘れてください)。 システムの外部IPアドレス:1.1.1.1、2.2.2.2および3.3.3.3。 それらの間にはルーティングがあります。



現時点では、暗号化とパケット認証なしで実行できます。トランスポートモードでホスト間でIPsecを設定するだけで、この例に追加するのは簡単です。 これは、トピックの範囲外のトピックです;)



1. GREトンネルを作成します。

(3つすべてで)
  ip tunnel add mgre0 mode gre key 0xfffffffe ttl 255 


ここで、宴会の住所を示していないことに注意してください。 これは、原則として、任意のアドレスに配置できることを意味します。 この場合のキーは、特定のmGREネットワークを識別します-これは、すべてのノードで同じ32ビットの数値です。



2.彼に住所を割り当てます。

(1.1.1.1で)
  ip addr add 10.0.0.1/24 dev mgre0 


(2.2.2.2で)
  ip addr add 10.0.0.2/24 dev mgre0 


(3.3.3.3で)
  ip addr add 10.0.0.3/24 dev mgre0 




イーサネットインターフェイスの場合は、これで十分です。 イーサネットには、アドレス解決プロトコル(ARP)があります。これにより、システムは、宛先ホストのIPアドレスを認識して、MACアドレスを個別に見つけることができます。 イーサネットはブロードキャストマルチプルアクセスメディアであり、ARPはネットワーク上のすべてのステーションへの要求の作成で構成されます(MACアドレスFF:FF:FF:FF:FF:FF):「おい、誰がIPアドレスxxxxを持っていますか?」 そのようなIPアドレスを持つステーションが使用可能な場合、「 xxxxyy:yy:yy:yy:yy:yyにあります 」と既に非公開で報告されます。



私たちのネットワーク(インターネット)にはARPなどの手段はなく、イーサネットの場合はMACアドレスである「第2レベル」アドレスの役割は、システムの外部IPアドレスによって実行されます。 NBMA(Non-Broadcast Multiple Access)環境を使用しているため、ARPが行うように、インターネット全体に叫ぶことはできません。「ねえ、0xfffffffe GREネットワークの誰がアドレス10.0.0.2を持っていますか?」



ネクストホップレゾリューションプロトコル(NHRP、NBMA環境のARPのアナログ)は、このアドレスの問題を解決することを目的としていますが、初めてその問題を解決します-同時に、Linuxネットワークの一般的な仕組みを理解します:)



3.そのため、隣接局を探す場所を手動で各ステーションに通知します。 これを行うには、次のコマンドを実行します。

(1.1.1.1で)
  ip neigh add 10.0.0.2 lladdr 2.2.2.2 dev mgre0
 ip neigh add 10.0.0.3 lladdr 3.3.3.3 dev mgre0 


(2.2.2.2で)
  ip neigh add 10.0.0.1 lladdr 1.1.1.1 dev mgre0
 ip neigh add 10.0.0.3 lladdr 3.3.3.3 dev mgre0 


(3.3.3.3で)
  ip neigh add 10.0.0.1 lladdr 1.1.1.1 dev mgre0
 ip neigh add 10.0.0.2 lladdr 2.2.2.2 dev mgre0 




ここで、各コマンドは、「ネットワーク層IPアドレスxxxxの隣接ステーションには、デバイスMからアクセス可能な物理アドレス(リンク層アドレス、lladdr) yyyyがあります」と述べています。 静的イーサネット(ARPなし)を構成した場合、 yyyyの代わりに対応するステーションのMACアドレスになります。 (ところで、動作中のイーサネットネットワークでip neigh show dev ethNを見ると、動的に受信した近隣アドレスのARPの結果が表示されます)。



それだけです 私たちのトンネルはこれで動作します:各ステーションは他のものにpingすることができます。 カーネルがGREマルチキャストをサポートするようにコンパイルされている場合、通常、完全に機能する「LAN」が得られます。RIPやOSPFなどの動的ルーティングプロトコルは、仮想ネットワークで完全に機能します。



これは、2番目のステーション(2.2.2.2)からの外観です。

  linux2#ping 10.0.0.1
 PING 10.0.0.1(10.0.0.1)56(84)バイトのデータ。
 10.0.0.1から64バイト:icmp_seq = 1 ttl = 64 time = 4.41 ms
 10.0.0.1から64バイト:icmp_seq = 2 ttl = 64 time = 0.429 ms
 ^ C
 --- 10.0.0.1 ping統計---
 2パケット送信、2パケット受信、0%パケット損失、時間1013ms
 rtt min / avg / max / mdev = 0.429 / 2.419 / 4.410 / 1.991 ms
 linux2#ping 10.0.0.2
 PING 10.0.0.2(10.0.0.2)56(84)バイトのデータ。
 10.0.0.2から64バイト:icmp_seq = 1 ttl = 64 time = 0.027 ms
 10.0.0.2から64バイト:icmp_seq = 2 ttl = 64 time = 0.020 ms
 ^ C
 --- 10.0.0.2 ping統計---
 2パケット送信、2パケット受信、0%パケット損失、時間999ms
 rtt min / avg / max / mdev = 0.020 / 0.023 / 0.027 / 0.006 ms
 linux2#ping 10.0.0.3
 PING 10.0.0.3(10.0.0.3)56(84)バイトのデータ。
 10.0.0.3から64バイト:icmp_seq = 1 ttl = 64 time = 8.47 ms
 10.0.0.3から64バイト:icmp_seq = 2 ttl = 64 time = 0.164 ms
 ^ C
 --- 10.0.0.3 ping統計---
 2パケット送信、2パケット受信、0%パケット損失、時間1018ms
 rtt min / avg / max / mdev = 0.164 / 4.318 / 8.472 / 4.154 ms
 linux2#ip addr show dev mgre0
 5:mgre0 @ NONE:<UP、LOWER_UP> mtu 1472 qdisc noqueue
    リンク/ gre 0.0.0.0 brd 0.0.0.0
     inet 10.0.0.2/24 brd 10.0.0.255スコープグローバルmgre0
 linux2#ip neigh show dev mgre0
 10.0.0.1 lladdr 1.1.1.1パーマネント
 10.0.0.3 lladdr 3.3.3.3パーマネント 




もちろん、多くのステーションがある場合、このアプローチは良くありません-各ステーションですべての隣人を登録しないでください! しかし、この問題の解決方法は非常に明確です。 しかし、それについては後で詳しく説明します。



All Articles