[Network] Advance Routing for Multi-Homed Hosts

原文はこちら。
https://blogs.oracle.com/networking/entry/advance_routing_for_multi_homed

以前マルチホームホストと呼ばれる、異なるネットワークやサブネットへ参加するホストについて説明しました。今回はLayer-3のルーティングについてお話します。今回は2個のシナリオ、シンプルなパターンとちょっと複雑なパターンに分けて説明します。

シンプルな場合
4個のNICを持ち、それぞれ一意のLayer-3のサブネットを持つホストを考えます。3個のサブネットはプライベートLANで、4番目はより大きなWANです。小さなネットワークは管理、開発、テスト用で管理の目が行き届く環境ですが、大きなネットワークはインターネットもしくはイントラネットゆえ、ホストやサービスの個数が把握しづらい環境です。この大きなネットワークをさらに多くのネットワークに分割され、ほとんどの場合そこにはルータが存在します。ご存知のようにルータの主要な役目は異なるブロードキャストサブネット間のトラフィックをルーティングすることです。
マルチホームホストには大きなネットワークやWANへのデフォルトゲートウェイがあります。既知のネットワーク外との通信が発生する場合、この通信をデフォルトゲートウェイに転送します。このデフォルトゲートウェイはルータとも呼ばれます。簡単に説明しましょう。
ホストのネットワーク参加要件は以下の通りです。
eth0  - 201.19.23.128 / 24  with gateway IP 201.19.23.1
bond0 - 192.168.10.1  / 24  with no gateway requirements
bond1 - 10.214.28.101 / 24  with no gateway requirements
bond2 - 172.23.7.128  / 24  with no gateway requirements
このマシンは社内ネットワークと eth0 (201.19.23.1)とだけ通信すればよいように思えます。問題解決ですね。このデフォルトゲートウェイを /etc/sysconfig/networking というファイルか、もしくは /etc/sysconfig/network-scripts/ifcfg-eth0 に設定すればよいのです。

ちょっと複雑な場合
上のシナリオから同じホストで、大きなネットワークへの接続が一つでない場合を考えると、同じような2個の接続ができあがります。一つは本当のインターネットに向いており、もう一つは企業内のWANを向いていることが考えられます。そして、その他に2個の管理用および内部用の通信を維持しています。この標準的な方法を使ってデフォルトゲートウェイを構成し続ける場合、2個の大きなネットワークのうち、一つしかアクセスできなくなってしまいます。それはデフォルトゲートウェイがインターフェースやLayer3サブネットにバインドされているからです。

ホストのネットワーク参加要件は以下の通りです。
eth0  - 201.19.23.128 / 24  with gateway IP 201.19.23.1
bond0 - 192.168.10.1  / 24  with no gateway requirements
bond1 - 10.214.28.101 / 24  with gateway IP 10.214.28.1
bond2 - 172.23.7.128  / 24  with no gateway requirements
ここでeth0とbond1が各々デフォルトゲートウェイを必要としていることがおわかりになるかと思います。bond1とbond2はデフォルトゲートウェイを必要としていません。単にLayer3サブネットに接続するだけです。

単純にデフォルトルートを追加すると、1個のデフォルトゲートウェイしか有効にできません。

問題点
私の問題文の形で上記の議論を言い換えてみましょう。
どうすれば、マルチホームホストが様々なルータを通して1個以上のネットワークとアクセスできるようにできるでしょうか。

解決策
Linuxにはiproute2というツールを使って高度なルーティングが可能です。これを使うと、一つ以上のデフォルトゲートウェイやルータアドレスを指定することができます。Oracle Enterprise Linux 5ベースのサンプル構成をご覧に入れますが、これは他のディストリビューションであっても適用は容易かと考えています。
基本的に、ルールとルーティング先検索のためのルーティングテーブルを作成します。一意のテーブルIDが必要ですが、今回は224と225を使うことにしています。
これらのテーブルIDは以前に使われていてはいけないため、以下のようなコマンドで確認します。
ip rule list
最初の列を見ると、出力は224でも225でもないはずです。そうで無ければ、別の番号を使って下さい。

eth0用に以下のファイル2個を作成します。

vi /etc/sysconfig/network-scripts/rule-eth0
from 201.19.23.128/32 table 224
to 201.19.23.128 table 224
vi /etc/sysconfig/network-scripts/route-eth0
201.19.23.0/24 dev eth0 table 224
default via 201.19.23.1 dev eth0 table 224
bond1用に以下のファイル2個を作成します。

vi /etc/sysconfig/network-scripts/rule-bond1
from 10.214.28.10/32 table 225
to 10.214.28.10 table 225
vi /etc/sysconfig/network-scripts/route-bond1
10.214.28.0/24 dev bond1 table 225
default via 10.214.28.1 dev bond1 table 225
これでネットワークを再起動し、これらの新しい設定を反映することができますが、この操作により、ホストへのアクセスが中断されるため、無計画に実施すべきではありません。
また、ランタイム実行のためにipコマンドを使用することができます。これで終わりです。これでホストは、両方のルータ間でアクセスできるはずです。

静的ルーティング

さて、なぜ今まで静的ルートについては何も言及していないのか、と疑問に思ってらっしゃる方がいるかもしれません。私は忘れてはいません!静的ルートの利用は先のシナリオ両者の間のシナリオです。ルーター越しのwell-knownサブネットがある場合、確かにそのサブネット用の静的ルートを追加する必要があります。例えば、bond1ネットワークに接続されたマシンの1つが別のネットワークを知っていて、ルーティング機能がある場合、そのネットワークを通じて静的ルートを使用することができます。
OK、これでこのエントリは終わりです。いつものように、皆さんからのコメント大歓迎です。ありがとう!

0 件のコメント:

コメントを投稿