web-dev-qa-db-ja.com

Linuxの複数のインターネット接続の負荷分散とフェイル処理

2つのISP接続があり、それらの間で自動負荷分散が必要です。また、失敗した接続を処理する必要があります(機能しない接続は使用しないでください)。

最初のリンクはPPTP接続(ppp0)、2番目は通常のイーサネットです。システムはGentooLinuxです。

現在、ip routeで基本的なバランス調整を行っていますが、うまく機能していないようです。これが私が使ったものです:

ip rule $ADD from $IP1 table rt_link1
ip rule $ADD fwmark 1 lookup rt_link1
ip rule $ADD from $IP2 table rt_link2
ip rule $ADD fwmark 2 lookup rt_link2
$NET2 dev eth2 src $IP2 table rt_link2
default via GW2 table rt_link2
$NET2 dev eth2 src $IP2
$NET1 dev ppp0 src $IP1 table rt_link1
default via GW1 table rt_link1
$NET1 dev ppp0 src $IP1
default scope global nexthop via $GW1 weight 1 nexthop via $GW2 dev eth2 weight 1
7
sss123next

LVSプロジェクトの元コアチームメンバーとして、複数のインターネット接続のバランスを取るためにこのテクノロジーを使用しないことを強くお勧めします。実際、期待どおりに機能しないことはほぼ保証できます。

現在、障害が発生したプロバイダーリンクの処理は、デッドゲートウェイ検出(DGD)と呼ばれることが多く、ネイバー到達不能検出(NUD)と呼ばれることもあります。 RFC816とRFC1122によると、DGDを実行する方法は複数ありますが、実際に見たのはそのうちの3つだけです( 私の古い投稿 からLVSメーリングリストまで):

  • ホストの障害(ARPANET Destination Deadメッセージなど)を確実に検出して報告するリンク層情報は、否定的なアドバイスとして使用する必要があります。
  • 特定のゲートウェイからのICMPリダイレクトメッセージは、そのゲートウェイに関する前向きなアドバイスとして使用する必要があります。
  • 特定のリンク層アドレスから到着するパケットは、このアドレスのシステムが稼働している証拠です。ただし、この情報をゲートウェイに関するアドバイスに変換するには、リンク層アドレスをIPアドレスにマッピングしてから、そのIPアドレスをルートキャッシュが指すゲートウェイと照合する必要があります。これはおそらく法外に非効率的です。

2006年にアクティブなLinuxカーネルネットワーク開発を辞めたとき、NUDの状態変更を実装する方法について明確な決定はまだありませんでした。私の友人でLVSのコア開発者であるJulianAnastasovは、2002年にあなたの課題を解決する必要がありました。そこで、ある晩、彼は座って、FIBにNUD状態を追加することで静的ルーティング用のDGDの作業バージョンを作成しました(転送情報ベース)。彼のパッチ ここ とドキュメント ここここここ を見つけることができます。これにより、この重要なタスクに対処するためのさらなる探求に関する多くの情報が得られるはずです。パッチはまだ乱暴に使用されているため、最近のカーネルで最新の状態に保たれていることがわかります。次のようなスクリプトから始めることをお勧めします( Robert Kurjata によって書かれました):

#!/bin/bash
# This script is done by : Robert Kurjata Sep, 2003.
# feel free to use it in any useful way

# CONFIGURATION
IP=/sbin/ip
PING=/bin/ping

#--------------- LINK PART -----------------
# EXTIFn - interface name
# EXTIPn - outgoing IP
# EXTMn  - netmask length (bits)
# EXTGWn - outgoing gateway
#-------------------------------------------

# LINK 1
EXTIF1=eth2
EXTIP1=
EXTM1=
EXTGW1=

# LINK 2
EXTIF2=eth1
EXTIP2=
EXTM2=
EXTGW2=

#ROUTING PART
# removing old rules and routes

echo "removing old rules"
${IP} rule del prio 50 table main
${IP} rule del prio 201 from ${EXTIP1}/${EXTM1} table 201
${IP} rule del prio 202 from ${EXTIP2}/${EXTM2} table 202
${IP} rule del prio 221 table 221
echo "flushing tables"
${IP} route flush table 201
${IP} route flush table 202
${IP} route flush table 221
echo "removing tables"
${IP} route del table 201
${IP} route del table 202
${IP} route del table 221

# setting new rules
echo "Setting new routing rules"

# main table w/o default gateway here
${IP} rule add prio 50 table main
${IP} route del default table main

# identified routes here
${IP} rule add prio 201 from ${EXTIP1}/${EXTM1} table 201
${IP} rule add prio 202 from ${EXTIP2}/${EXTM2} table 202

${IP} route add default via ${EXTGW1} dev ${EXTIF1} src ${EXTIP1} proto static table 201
${IP} route append prohibit default table 201 metric 1 proto static

${IP} route add default via ${EXTGW2} dev ${EXTIF2} src ${EXTIP2} proto static table 202
${IP} route append prohibit default table 202 metric 1 proto static

# mutipath
${IP} rule add prio 221 table 221

${IP} route add default table 221 proto static \
            nexthop via ${EXTGW1} dev ${EXTIF1} weight 2\
            nexthop via ${EXTGW2} dev ${EXTIF2} weight 3

${IP} route flush cache

while : ; do
  ${PING} -c 1 ${EXTGW1}
  ${PING} -c 1 ${EXTGW2}
  sleep 60
done

さらに、動的ルーティングプロトコルを実行するオプションを確認することもできます。

3
Moreaki

Lvs-kissと組み合わせてLVSを使用します。または同様のもの。

LVSは基本的にìpvsadmコマンド。そのロードバランサーの唯一の欠点は、監視しないことです。したがって、それを実行し、構成からデッドリンクを削除する(そしてそれを再び生きたまま追加する)プログラムが必要です。

ハートビートスタックからのldirectordは、(lvs-kissの代わりに)別のlvs-additionである可能性があります。

0
Nils