Linux | Top

Linuxでマルチホーム (複数のISPの同時利用)

突っ込み・指摘助言などがありましたら 掲示板までお願いします。

概要

Linuxでiproute2を利用し、複数のISPと接続するマルチホームを構成し、 トラフィックの分散を図ります。

動機

私は現在 B FLET'S ニューハイパーファミリータイプを利用しています。

ニューハイパーファミリータイプは複数の契約者が100Mbps1Gbpsの光ファイバーに相乗りする サービスなので、必ずしも一人の契約者が100Mbpsを利用できるわけではありませんが、 フレッツ・スクウェアでの速度測定よりも ISP経由でインターネットを利用する(速度測定サイトや、 ISP内のftp/Webサーバからのダウンロード等)時の方が遅いです。 (あくまで私の環境での話ですが)

つまりネットワークのどこかにボトルネックがあると考えられます。 試しに以下のような実験を行ってみました。

  1. 2つの ISP と契約します。
  2. ISP A および ISP B と PPPoE 接続します。 ここでは話を分かりやすくするために、ISP A へはマシンA から、 ISP B へは マシンB からそれぞれ PPPoE 接続することにします。
  3. マシンA から ISP A 内の ftp サーバからダウンロードを行い、速度を測ります。
  4. マシンB から ISP B 内の ftp サーバからダウンロードを行い、速度を測ります。
  5. 上記のダウンロードを同時に行い、速度を測ります。
この結果、個別に速度を測定した時と、同時に測定した時で、 ダウンロードの速度に差はありませんでした。 NTT地域会社のフレッツを利用する場合、 (レイヤーとか無視して)通信経路を簡単に書くと
利用者 → 光ファイバー → NTTの局舎 → 地域IP網 →
 地域IP網内のルータ → 何らかの回線 → ISP側のルータ →
  ISP内のネットワーク網 → IX等 → 通信先のサーバ等
となると思いますが、今回の実験の結果ボトルネックは利用者⇔地域IP網ではなく、 地域IP網⇔ISPの間か、あるいはISP内部のネットワーク網にあると考えられます。

というわけで、

などの理由から、複数の ISP を同時に利用するマルチホーム構成を実現してみることにしました。

ネットワーク図

今回構築したネットワークは以下のようになります。 ONU とブロードバンドルータの間に L2スイッチを狭んでいます。


設定

ブロードバンドルータ

BUFFALOとコレガの安物です。 DMZ機能を使って、受信したパケットはすべてLinuxサーバに転送させます。

もちろん、Linux サーバに直接 PPPoE を喋らせても構いません。 私の場合、Linux サーバの負荷軽減と、Linux サーバに万が一何らかの障害が発生し Linux サーバ単体では PPPoE 接続できなくなった場合のことを考えて、 ブロードバンドルータを利用しています。


2005/07/27追記

コレガのは CG-BARMXなのですが、これがヒドいシロモノで、 頻繁にハングアップします。 最初は熱暴走かと思ったのですが、熱対策を行ってもハングします。 どうもファームウェアの出来が非常によろしくないようです。

仕方ないのでそちら側はLinuxに直接PPPoEを喋らせることにしました。


Linux側

ルーティング (iproute2)

iproute2 を使用して以下のような設定(ポリシールーティング)を行います。 JFLinux Advanced Routing & Traffic Control HOWTO や、サーチエンジンで「Linux iproute2」で検索して出てくるページを参考にしてます。

iproute2を使った設定スクリプトの例

フィルタリング (iptables)

iptables を使用し、不要な通信をブロックします。 外向きのインターフェースが2つあるので、両方に対してブロックをしたり、 インターフェース単位で許可を与えたりする必要がある場合もあります。

iptablesを使った設定スクリプトの例


問題点

大体良好に動作していますが、以下のような問題点・検討課題があります。

障害に弱い

[追記 2005/01/31]
先日、片方のブロードバンドルータがハングアップしてしまいましたが、 そちらを経路としていた通信は当然不通になってしまいました。 (最初は何が起きたか分からなくて焦りました)

本当は障害の発生を検知して経路から切り離すような細工をすべきでしょうが、 少なくとも素の iproute ではそこまでの面倒は見てくれません。

負荷分散ではない

Linux Advanced Routing & Traffic Control HOWTO の「4.2.2. 負荷分散」 にも記載されていますが、今回の設定では中→外の経路は単純なラウンドロビンで 選択されます。つまり、厳密な負荷分散、つまりトラフィック量に基づく経路の 振り分けをやっているわけではありません。

なので、どちらか片方の ISP にトラフィックが集中することがよくあります。

近い経路の選択

例えば ISP A と ISP B を利用しているとしましょう。 ISP A の Webサーバ/ftpサーバを利用する場合とか、 同じ ISP A を利用している他のユーザと通信を行う場合は、 外への経路として ISP A 側を利用した方が良好な結果を得られるはずですので そちらを使いたいと思うでしょう。

しかし先に書いたように、経路は単純なラウンドロビンで決定されるので、 特別な対策を講じない場合は ISP B を経由して ISP A の Webページを閲覧してしまう等が普通に起きます。

今のところの回避策としては、最適な経路が判明しているアドレスブロックに 対して静的ルートを設定するぐらいです。 とりあえずは ISP の Webサーバやメールサーバ等の各種サーバや、 自分に割り当てられた IPアドレスなどから調べて登録するのがよいでしょう。

私の場合 Debian のパッケージを取得するサーバとして ASAHIネットの ring.asahi-net.or.jp を利用しているので、これの IPアドレスを含む アドレスブロックを whois で調べ、そこに対しては ASAHIネット側から 出ていくように静的ルートを設定しています。

Windows Update

Windows Update を完了するまで複数のサーバ(以前調べた時は 4つほど)を参照しますが、 それらのサーバに対する経路が分散してしまった場合、 Windows Update の完了までに異様に時間がかかったり、 最悪の場合 Windows Update が完了しなかったりしました。

これも、利用しているサーバを調べて whois してアドレスブロックを調べ、 そこへの経路は片方の ISP のみを利用するように静的ルートを設定する、 という方法でしのいでいます。 利用サーバを調べるには例えば squid 等のプロキシサーバを経由させてそのログを 見る、等の方法があります。

ICQ

マルチホームにすると、何故か ICQ のサーバに接続しづらくなってしまいました。

[追記 2005/01/25]
Socks デーモン (sockd) 経由で接続するようにして、接続のログを見ると、 接続の時に 2つのサーバに問い合わせているようです。

Jan 25 20:47:34 SOCKS-SERVER sockd[21247]: connect from CLIENT (192.168.2.2)
Jan 25 20:47:34 SOCKS-SERVER sockd[21247]: connected -- Connect from hiramoto(unknown)@CLIENT to bucp2-vip-m.blue.aol.com (5190)
Jan 25 20:47:35 SOCKS-SERVER sockd[21247]: terminated -- Connect from hiramoto(unknown)@CLIENT to bucp2-vip-m.blue.aol.com (5190).
Jan 25 20:47:35 SOCKS-SERVER sockd[21247]: 139 bytes from CLIENT, 308 bytes from bucp2-vip-m.blue.aol.com
Jan 25 20:47:35 SOCKS-SERVER sockd[21248]: connect from CLIENT (192.168.2.2)
Jan 25 20:47:35 SOCKS-SERVER sockd[21248]: connected -- Connect from hiramoto(unknown)@idol.angel.flatray.com to 64.12.24.68 (5190)
bucp2-vip-m.blue.aol.com から最終的に接続しにいくサーバの情報(この例だと 64.12.24.68) を得ているのでしょうか。 この 2つのホストのアドレスブロックへの経路が同じになるように静的ルートを設定したところ 改善されました。

ITmedia

ITmediaを閲覧する時に、 HTMLコンテンツを管理しているwww.itmedia.co.jpと、 画像データを管理しているimage.itmedia.co.jpへの経路が別になった場合、 画像データが表示されないまたは表示までに異様に時間がかかりました。 ITmediaは画像データへアクセスの際にRefererをチェックしているのは知ってますが、 経路というかクライアント側のIPアドレスも影響するというのはちょっと謎です。

これも片方の経路のみ利用するように静的ルートを設定すると解消しました。

ネットゲーム

[追記 2005/03/24]
この環境で一部のネットゲームをプレイすると頻繁にサーバから切断されます。 「またいつものパターン?」と思いつつ 片方の経路のみ利用するように静的ルートを設定すると解消しました。

ネットゲームのサーバのIPアドレスの調べ方ですが、 Windows上でパーソナルファイアウォールの類を使用している場合は、 最初にゲームを起動するとアクセス先の情報が表示されたり 設定画面で通信を許可した内容を確認できるでしょうから それが参考になります。 あるいはLinux上でiptraf等のパケットキャプチャソフトを利用する手もあります。


突っ込み・指摘助言などがありましたら 掲示板までお願いします。
hiramoto@flatray.com (平本 光二/HIRAMOTO Kouji)