- - PR -
マルチホーミングの場合の上位ネットワークの監視
1
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-07-03 09:50
おはようございます.
http://www.atmarkit.co.jp/bbs/phpBB/reply.php?topic=12727&forum=11 よりの続きです. マルチホーミングをする際の仕組みを考えています. A と B というそれぞれの ISP で, 一方が何らかの理由で切れた場合, Web-Proxy が Internet を参照する経路を切り替えたいのです. 例えば,通常 A を使って http proxy しているものを, A との回線上の機器の故障が起きたので自動的に B に切り替わるようにするとか... で,前スレでは下記のように「dynamic routing したら?」というご意見をいただいています.
Linux で dynamic な routing ってやったことがないのですが, そもそも「ISP と切れた」のをどうやって検知するのでしょう? 個人的には「yahoo とか参照しといて繋がらなければ切れたと判定」なんてことができれば良いかなと思ってました.BGP などは Internet 上にこちらの構成などを流してしまうことになるので「やめた方が良いよ」と助言を受けたりしてます. 一部の Firewall Appliance にはその手の機能があるようです.つまり Internet 上の URL へ定期的に接続して,「繋がらない -> 切れた」と判定してるっぽいです.Linux で,或いは汎用 OS でもできそうな気がするのですが,具体的な内容が思い浮かばず,皆様のお知恵を拝借いたしたく,よろしくお願いいたします. | ||||||||||||||||
|
投稿日時: 2004-07-03 13:42
検知するのはルータで、それを通知してもらうのです。 ルータだと一番簡単に検出できる方法は"WAN回線が切断された"と云う情報になります。
所謂keepalive機能ですね。 中程度のルータ(YAMAHAルータとか)にも搭載されています(但し、Ciscoのkeepaliveは別機能)。 UNIXだと実際に行ったことはないですが、次のようなシェルで実現できないかと考えます。 ------ ここから ------ 1.複数経路にping 2.全てNG→次へ。それ以外、5へ。 3.1〜2を複数回実行 4.DefaultGatewayがGW-AならGW-Bへ。それ以外はGW-A 5.一定期間sleep後、1へ。 # ルータのアドレスをそれぞれGW-A、GW-Bとしています。 ------ ここまで ------ cronで行う場合には、4の判定をnetstatでの戻り値で行う必要がありそうです。cronで行わない場合はdefaultgatewayの設定を外したうえで起動時に走らせればOK。 またSolarisだとpingの戻り値は取りやすそうですがLinuxでの取り方はやったこと無いので不明ですf(^^;) # ISPのDNSあたりにping出来る場合はもう少し楽かも。 | ||||||||||||||||
|
投稿日時: 2004-07-03 14:23
フローティングスタティックと同等の機能を実装しよう、 ということですね。なるほど〜。 シェルスクリプトだと、タイムアウトまわりが問題になるかも しれません。仮に問題になったとしても、別の言語で書いて しまえばいいことですが。
戻り値がダメでも、grep かけて wc -l とか、手はいろいろと ありますからたぶんなんとかなりそうな... 追記。 man で ping(8) をみると、戻り値で判定できそうですね。 ついでに NetBSD でも O.K. [ メッセージ編集済み 編集者: ぽんす 編集日時 2004-07-03 14:29 ] | ||||||||||||||||
|
投稿日時: 2004-07-03 15:49
具体的な実装方法については記載されていませんが、こちらの記事も参考になるかもしれません。
・ 連載 ロードバランサの本質(全3回) (@IT さんより) | ||||||||||||||||
|
投稿日時: 2004-07-03 16:01
厚かましいですが,ついでにサンプルなどお示しいただけると... でも確かに Solaris の戻り値はあっさりしてますね. > 4.DefaultGatewayがGW-AならGW-Bへ。それ以外はGW-A > 5.一定期間sleep後、1へ。 route で default を「削除 -> 別の default gateway を設定」を別ルーチンで入れたら切り替えが簡単になりそうな気も.
alive 監視ってアテにならないものなのでしょうか? ping とあまり違わない気がしてます.ご意見賜りたく. 実は「対岸の router まで活きているか?」という WAN 回線の切断よりも, その向こうの ISP が「よく停止する」らしいのです.これを「計画停止」と称しているようですが,突発的に計画立ててくれるようで...さらには,その ISP をそうそう切り捨てられない事情がありまして. *INET とか名前出すとやっぱりまずいかな? そういう意味では,監視対象は一方の ISP に絞っても良いかなと考えたりしていますが,やはり「両方監視して切り替える」が実現できるほうがスッキリですね. | ||||||||||||||||
|
投稿日時: 2004-07-03 16:42
現在UNIX(&Linux)の環境は無いし、もう何年もまともにシェルを組んでいませんので、そちらは他の方にお任せするとしてkeepaliveについて。
対岸のRouter迄の回線監視はCiscoのものになります。 それに対し、例えばYAMAHAのルータに実装されているものはIPアドレスの指定が可能ですので、そのISP上のサーバなりにとばしておけば回線に限らない監視が可能となります。 http://www.rtpro.yamaha.co.jp/RT/docs/backup/network-backup.html この機能はICMPにより行われるのでPingと同等ですよ。 # もしかしたらFreeBSDベースのOSで同じようなシェルを組むことになるかも知れないので何処かにサンプルがあれば私も欲しい(^^; | ||||||||||||||||
|
投稿日時: 2004-07-03 19:24
マルチホームはおろか、Linux が動いている環境すら手元にないので、
使えるサンプルを出すのはご勘弁を :p とりあえず、 for i in `seq $2` do ping -c 1 -w 5 $1 > /dev/null 2>&1 if test $? != 0 then echo ng sleep 5 else exit fi done echo "link dead" こんな感じで如何でしょう? 第一引数が相手のIPアドレス、 第二引数が ping を飛ばす回数です。 動作確認をしてませんので、間違ってるところは直して下さい :p 最後に echo してるところを、実際には route(8) で ゲートウェイの変更を行うようにする、ということで。 bash 依存のコマンドを使ってるとか、最後の回の ping の 後にも sleep してしまうとか、ルーティングを変えた後に チェックしないとか、問題は多々ありますので、そのあたりも 書き直して頂く、ということで :p # code を指定すると $n が消されてしまうし、指定しないと # インデントがなくなってしまうのね... [ メッセージ編集済み 編集者: ぽんす 編集日時 2004-07-03 19:32 ] | ||||||||||||||||
|
投稿日時: 2004-07-03 20:17
ありがとうございます. 参考にさせていただき,検証環境で練り上げてみます. その他,引き続きアイデア募集中です -> 皆様 検証してみて「こうしたらもっとこうなる」というのもいただきたく. よろしくお願いいたします. |
1