4.2. 複数のアップリンク/プロバイダに対するルーティング

以下のようなよくある場合を考えてみましょう。 ローカルなネットワーク (1 台のマシンかもしれませんが) をインターネットへと接続しているプロバイダが 2 つあるような場合です。
                                                                 ________
                                          +------------+        /
                                          |            |       |
                            +-------------+ Provider 1 +-------
        __                  |             |            |     /
    ___/  \_         +------+-------+     +------------+    |
  _/        \__      |     if1      |                      /
 /             \     |              |                      |
| Local network -----+ Linux router |                      |     Internet
 \_           __/    |              |                      |
   \__     __/       |     if2      |                      \
      \___/          +------+-------+     +------------+    |
                            |             |            |     \
                            +-------------+ Provider 2 +-------
                                          |            |       |
                                          +------------+        \________

この設定においては、通常 2 つの問題点があります。

4.2.1. アクセス分割

最初の問題点は、特定のプロバイダからやって来たパケットに対して、 応答をどのようにルーティングするかです。 例えば 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
	
特別なことは何もしておらず、ゲートウェイへの経路と、 そのゲートウェイを経由する default 経路を作っただけです。 これは上流のプロバイダが 1 つだけの場合と同じですが、 経路をプロバイダごとに別々のテーブルに置いています。 ここではネットワークの経路だけで十分です。 なぜならネットワークを指定すれば、そこにあるすべてのホストに到達でき、 前述のようにゲートウェイもそのうちのひとつだからです。

次に main ルーティングテーブルを設定します。 パケットを直接の近隣に送る際には、 その近隣に接続しているインターフェースからにするのが良い考えです。 ここで `src' 引数によって、 確実に正しい起点 IP アドレスが選択されていることにも注目してください。
	    ip route add $P1_NET dev $IF1 src $IP1
	    ip route add $P2_NET dev $IF2 src $IP2
	  
ここで default ルートを好きな方に設定します。
	    ip route add default via $P1
	  
次にルーティングの rule を設定します。 これらは実際には、どのルーティングテーブルを使うかの選択です。 既にソースアドレスが付けられている場合には、 そのインターフェースから出ていくように経路を選びたいはずです。
	    ip rule add from $IP1 table T1
	    ip rule add from $IP2 table T2
	  
この一連のコマンドによって、 特定のインターフェースからやって来たトラフィックが、 必ずそのインターフェースを通して応答されることが確実となりました。

Warning

読者である Rod Roark によると: 「$P0_NET がローカルネットワークで $IF0 をそのインターフェースとすると、 次のようなエントリも追加しておくほうが良いでしょう
ip route add $P0_NET     dev $IF0 table T1
ip route add $P2_NET     dev $IF2 table T1
ip route add 127.0.0.0/8 dev lo   table T1
ip route add $P0_NET     dev $IF0 table T2
ip route add $P1_NET     dev $IF1 table T2
ip route add 127.0.0.0/8 dev lo   table T2                                      

さて、これは非常に基本的な設定にすぎません。 これはルータで動作しているプロセスと、 マスカレードされている場合にはローカルネットワークに対しても動作するでしょう。 それ以外としては、両方のプロバイダから IP 空間をもらっている場合と、 片方のプロバイダに対してのみマスカレードをしている場合とが考えられます。 このいずれにおいても、 どちらのプロバイダを通して発信するかを、 ローカルネットワークのマシンの IP アドレスから決めるような ルールを追加することになるでしょう。

4.2.2. 負荷分散

二番目の問題点は、二つのプロバイダを通して出て行くトラフィックを バランスさせるやり方です。これは実際には、 前述のようなアクセス分割を既に行っていれば、難しくありません。

default の経路として片方のプロバイダを選ぶ代わりに、 default 経路を multipath 経路として設定します。 デフォルトのカーネルでは、これで両者のプロバイダへの経路がバランスされます。 これは次のようにして行います (ここでもアクセス分割の節における例での場合を考えます)。
	    ip route add default scope global nexthop via $P1 dev $IF1 weight 1 \
	    nexthop via $P2 dev $IF2 weight 1
	  
これで両方のプロバイダへの経路がバランスされます。 weight パラメータは、 一方のプロバイダをもう一方より優先するよう調節します。

このバランス化は経路に基づいたもので、経路はキャッシュされるため、 完全とは言えません。なぜかというと、良く利用されるサイトに対する経路は、 つねに同じプロバイダから出て行くことになるからです。

さらに、本当にこれを実行した場合は、 Julian Anastasov のページ にあるパッチをみるとよいでしょう。 これらを用いると、より良好な動作が期待できます。