- PR -

自宅サーバでのNW冗長化

1
投稿者投稿内容
UNISON
会議室デビュー日: 2005/03/06
投稿数: 2
お住まい・勤務地: 関西
投稿日時: 2005-03-06 12:56
自宅にBフレッツを引いて、unnumbered IP16で7台のLinuxサーバを公開しています。
回線は比較的さくさく通信できているのですが、Bフレッツ網やISPで機器の故障や
工事などがたまにあるので、その期間は別の回線を使えないかと思いまして、
バックアップ回線としてフレッツADSLと別のISPのunnumbered IP16を申し込みました。
(USENなどにしたかったのですが、予算的に無理でした。NICは2枚刺さっています)

要するにマルチホーミングのようなことがしたいのですが、予算が限られている
ため、現在の構成でできるだけ安価に擬似的に冗長化できる方法を探しています。
ちなみにBフレッツ側のルータはマルチセッションには対応しているものの、
複数のunnumbered接続には対応していないので、サーバ側の2枚あるNICのうち1枚には
プライベートIPアドレスを割り振り、ADSL側のADSLモデムでNAPTをかける予定です。

当初考えていたのは、サーバにNICを2枚挿して違うネットワークのIPアドレスを割り
振り、DNSラウンドロビンで解決しようと思いました。

しかし、このときのルーティング方法が分かりません。

メイン回線であるBフレッツ回線側にデフォルトゲートウェイを設定してしまうと、
常にそっちを用いてルーティングしてしまいますし、異なるメトリックとして
デフォルトゲートウェイを設定したとしても、やはりクライアントからのHTTP接続
要求に対してBフレッツ側から出て行こうとして、SYN_RECV状態で止まったままに
なります。

やりたいことは「理想は、普段はeth0(メイン回線。Bフレッツ)を利用してアクセス
させるが、メイン回線が落ちた場合はeth1(バックアップ回線。ADSL)を利用して
アクセスさせたい」ということですが、これはVRRP対応ルータなどを使わずに解決
しようと思うと、DNSラウンドロビンしかないですよね?
なので、単純に「クライアントからのeth0(メイン回線)へのアクセスがあった
場合はeth0経由で外へ、クライアントからのeth1(バックアップ回線)へのアクセスが
あった場合はeth1経由で外へ出られるようにしたい」だけなのですが、こういった
1つのサーバに複数のグローバルIPアドレスを用いたケースというのが、Googleなど
でも探しきれず、解決方法が分からない状態です。

もっと単純に、iptablesだけで解決できるものなのでしょうか?
分かりにくいとは思いますが、下記に現在の構成を記します。
もし何かアドバイスなどがございましたら、どうぞよろしくお願いします。

[Bフレッツ]-------[ルータ(GW1)](61.x.x.B/28)
                |
                |
                |     +-------(61.x.x.x)[NIC1]
                |     |               |
             [スイッチングハブ]           [Linuxサーバ]
                |     |               |
                |     +-------(192.z.z.z)[NIC2]
                |
                |(192.z.z.A/24)
[フレッツADSL]----[ADSLルータモデム(GW2)](210.y.y.A/28)
kaz
ぬし
会議室デビュー日: 2003/11/06
投稿数: 5403
投稿日時: 2005-03-06 16:49
こんにちわ.

iproute2 についてお調べください.
以前,Solaris で同じようなことが出来ないかを
ここで問わせていただいたことがありますが,
まさに iproute2 ならそのようなことができると思います.

「ポリシールーティング」とか「linux iproute2」で検索すると,
結構 hit すると思います.

以上,ご参考までに.
Mattun
ぬし
会議室デビュー日: 2004/08/10
投稿数: 1391
投稿日時: 2005-03-06 17:04
大きく2つの側面の側面があります。
両方の回線が使える場合と片方のみしか使えない場合、それぞれ
1. サーバ側からの通信がどちらの経路を利用するか
2. クライアント側からの通信がどちらの経路を利用するか
ということです。

DNSのラウンドロビンに関しては、2.の問題ですね。
サーバのDNSホスト名がどちらのIPアドレスとして解決されるかによって
どちらの経路が利用されるか、ってのが決定されることになります。
ただ、DNSラウンドロビンはステートレスなので、片方の回線が落ちても
両方のIPアドレスに対応するDNSレコードを返すことになってしまうため、
片方落ちた場合に落ちた側のIPアドレスに解決されちゃったら接続できません。
回線の稼動状況に応じてDNSレコードを手動/自動で切り替える仕組みが必要です。
自動だったら、家庭向けサーバでよく使われてるDDNSの技術が参考になると思います。

1.に関しては、ルータなりサーバなりの、2つの経路への振り分けを担当している
機器において、通信可否状況に応じて経路を切り替えるような機能が使えれば
実現できるでしょう。この辺は具体的なことは実際にやったことがないので
具体的な技術は思いつかないんですが、
・ネットワーク稼動状況の監視
・監視状態の変化に応じたルーティングテーブル書き換え
という感じのことを実現できればいいんじゃないかと。
UNISON
会議室デビュー日: 2005/03/06
投稿数: 2
お住まい・勤務地: 関西
投稿日時: 2005-03-07 13:16
引用:

kazさんの書き込み (2005-03-06 16:49) より:
こんにちわ.

iproute2 についてお調べください.
以前,Solaris で同じようなことが出来ないかを
ここで問わせていただいたことがありますが,
まさに iproute2 ならそのようなことができると思います.



ありがとうございます。
kazさまの過去ログを拝見して、iproute2でとりあえず解決できました。

しかし、Linuxはこういった資産があって便利ですね。
以前、FreeBSDでbondingする必要があったときには、どう探しても解決法が
見つかりませんでしたので、kernelレベルで新機能がガンガン取り込まれて
いくのは便利ではあります。
逆に言えば、明示的に機能を除いてkernelの再構築をしなければ、セキュ
リティ的に激しく不安ですが。


引用:

Mattunさんの書き込み (2005-03-06 17:04) より:
大きく2つの側面の側面があります。
両方の回線が使える場合と片方のみしか使えない場合、それぞれ
1. サーバ側からの通信がどちらの経路を利用するか
2. クライアント側からの通信がどちらの経路を利用するか
ということです。



私もMattunさんのように、DNSラウンドロビンは「落ちた側で名前
解決されたらどうするの?」と思っていたのですが、どうも最近の
アプリケーションはmultiple IP addressの場合、片方に繋がらない
場合は自動的にもう片方にリトライするようです。
(これはkazさんの書込みにもありましたね)

実際にはリクエストのたびに最大2回ルーティングする必要があるので、
それなりのオーバヘッドにはなりますが、まあ、費用対効果としては
なかなかのものだと思っています。

問題は、回線に障害が発生していないときでも2つの経路を通ってしまう
ため、BフレッツとADSLのように速度が同一でない環境ではADSL回線側に
かなりの負担を強いてしまうことになることでしょうか。

一応、下記の3パターンを考えていたのですが、どれも一長一短な気がします。
異なるセグメントのWANポートを2つ持てるような逆型の負荷分散装置が
安価であればいいんですけどねぇ。。。


    1.DNSレコードのTTLを短くしておく。
    常にルータにpingしておき、一定回数反応がなかったら、AレコードをADSL
    側NICに自動更新。復帰したら戻す。

    2.平常時はBフレッツ側の経路しかルーティング対象にしない。(default GWを
    Bフレッツ側だけに設定)
    常にルータにpingしておき、一定回数反応がなかったらGWをADSL側に書き
    換える。復帰したら戻す。

    3.ipconfigで別のIPアドレスをaliasで割り振って、Bフレッツ側のNICが持って
    いるIPアドレスを理論的に増やし、DNSラウンドロビンの対象とする。
    これにより、例えば2つIPアドレスを追加すれば、単純計算でADSL側の経路を
    通る確立は1/4になるはずなので、一応ADSL側の負荷は低くなる。
    (ただ、障害発生時の経路探索のオーバヘッドが・・・)


[ メッセージ編集済み 編集者: UNISON 編集日時 2005-03-07 13:17 ]
未記入
会議室デビュー日: 2005/05/03
投稿数: 2
投稿日時: 2005-05-03 23:06
こんにちわ
5年以上前から同じ問題に悩んでいる者です。
OSPFを使えば理論上は実現できるはずですが、非現実的ですね。

調べてみたんですが、Linuxサーバを
>異なるセグメントのWANポートを2つ持てるような逆型の負荷分散装置
(非対称な負荷分散)に設定できそうですね。
http://lartc.org/howto/lartc.rpdb.multiple-links.html
http://www.ssi.bg/~ja/dgd-usage.txt
http://routeskeeper.sourceforge.net/cgi-bin/twiki/view/Routeskeeper/MultihomingWithLinux

でも、肝心なところ
>やりたいことは「理想は、普段はeth0(メイン回線。Bフレッツ)を利用してアクセス
>させるが、メイン回線が落ちた場合はeth1(バックアップ回線。ADSL)を利用して
>アクセスさせたい」
を実現するには、DNSレコードを回線状況に応じて更新するしかなさそうですね。

[ メッセージ編集済み 編集者: azamino156 編集日時 2005-05-04 20:33 ]
kaz
ぬし
会議室デビュー日: 2003/11/06
投稿数: 5403
投稿日時: 2005-05-05 18:02
こんにちわ.
引用:

azamino156さんの書き込み (2005-05-03 23:06) より:

でも、肝心なところ
>やりたいことは「理想は、普段はeth0(メイン回線。Bフレッツ)を利用してアクセス
>させるが、メイン回線が落ちた場合はeth1(バックアップ回線。ADSL)を利用して
>アクセスさせたい」
を実現するには、DNSレコードを回線状況に応じて更新するしかなさそうですね。


DNS の round-robbin であれば,両方の IP address を送り込んでくれませんか?
検証して普通に接続できましたけど,client application によるのかな?
ping でも WWW Browser でも,自動的に切り替わってくれました.
それと,bind であれば「決まった順序で」という設定も出来ます.
なので,一方をあくまでも「優先的に」というのは実現できると思います.
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=10&topic=18222

以上,ご参考までに.


[ メッセージ編集済み 編集者: kaz 編集日時 2005-05-05 18:07 ]
未記入
会議室デビュー日: 2005/05/03
投稿数: 2
投稿日時: 2005-05-06 00:12
kazさん コメントありがとうございます。
bindもずいぶんと進化しているんですね。
勉強になりました。
1

スキルアップ/キャリアアップ(JOB@IT)