以下のようなよくある場合を考えてみましょう。 ローカルなネットワーク (1 台のマシンかもしれませんが) をインターネットへと接続しているプロバイダが 2 つあるような場合です。
________ +------------+ / | | | +-------------+ Provider 1 +------- __ | | | / ___/ \_ +------+-------+ +------------+ | _/ \__ | if1 | / / \ | | | | Local network -----+ Linux router | | Internet \_ __/ | | | \__ __/ | if2 | \ \___/ +------+-------+ +------------+ | | | | \ +-------------+ Provider 2 +------- | | | +------------+ \________ |
この設定においては、通常 2 つの問題点があります。
最初の問題点は、特定のプロバイダからやって来たパケットに対して、 応答をどのようにルーティングするかです。 例えば Provider 1 からのパケットに対して、 返信を再び同じプロバイダに戻すにはどうすればいいでしょう。
まず記号的な名前を設定しましょう。 $IF1 を第一インターフェース (上記の絵の if1)、 $IF2 を第二インターフェースとします。次に $IP1 は $IF1 に関連付けられた IP アドレス、 $IP2 は $IF2 に関連付けられた IP アドレスとします。 さらに、 $P1 を Provider 1 のゲートウェイの IP アドレス、 $P2 を Provider 2 のゲートウェイの IP アドレスとします。 最後に、$P1_NET を $P1 の所属する IP ネットワーク、 $P2_NET を $P2 の所属する IP ネットワークとします。
2 つのルーティングテーブルを追加します。 ここでは T1 および T2 とします。 これらは /etc/iproute2/rt_tables に追加します。 そしてこれらのテーブルでのルーティングを次のように設定します。
ip route add $P1_NET dev $IF1 src $IP1 table T1 ip route add default via $P1 table T1 ip route add $P2_NET dev $IF2 src $IP2 table T2 ip route add default via $P2 table T2 |
次に main ルーティングテーブルを設定します。 パケットを直接の近隣に送る際には、 その近隣に接続しているインターフェースからにするのが良い考えです。 ここで `src' 引数によって、 確実に正しい起点 IP アドレスが選択されていることにも注目してください。
ip route add $P1_NET dev $IF1 src $IP1 ip route add $P2_NET dev $IF2 src $IP2 |
ip route add default via $P1 |
ip rule add from $IP1 table T1 ip rule add from $IP2 table T2 |
Warning | |
読者である Rod Roark によると: 「$P0_NET がローカルネットワークで $IF0 をそのインターフェースとすると、 次のようなエントリも追加しておくほうが良いでしょう
|
さて、これは非常に基本的な設定にすぎません。 これはルータで動作しているプロセスと、 マスカレードされている場合にはローカルネットワークに対しても動作するでしょう。 それ以外としては、両方のプロバイダから IP 空間をもらっている場合と、 片方のプロバイダに対してのみマスカレードをしている場合とが考えられます。 このいずれにおいても、 どちらのプロバイダを通して発信するかを、 ローカルネットワークのマシンの IP アドレスから決めるような ルールを追加することになるでしょう。
二番目の問題点は、二つのプロバイダを通して出て行くトラフィックを バランスさせるやり方です。これは実際には、 前述のようなアクセス分割を既に行っていれば、難しくありません。
default の経路として片方のプロバイダを選ぶ代わりに、 default 経路を multipath 経路として設定します。 デフォルトのカーネルでは、これで両者のプロバイダへの経路がバランスされます。 これは次のようにして行います (ここでもアクセス分割の節における例での場合を考えます)。
ip route add default scope global nexthop via $P1 dev $IF1 weight 1 \ nexthop via $P2 dev $IF2 weight 1 |
このバランス化は経路に基づいたもので、経路はキャッシュされるため、 完全とは言えません。なぜかというと、良く利用されるサイトに対する経路は、 つねに同じプロバイダから出て行くことになるからです。
さらに、本当にこれを実行した場合は、 Julian Anastasov のページ にあるパッチをみるとよいでしょう。 これらを用いると、より良好な動作が期待できます。