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

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

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

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

現在、 で基本的なバランス調整を実現しています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

答え1

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

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

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

2006 年に Linux カーネル ネットワーク開発から私が離れたとき、NUD 状態の変更をどのように実装するかについてはまだ明確な決定がありませんでした。私の友人で LVS のコア開発者の Julian Anastasov は、2002 年にあなたの課題を解決する必要がありました。そこで、ある晩、彼は座って、NUD 状態を FIB (フォワード情報ベース) に追加することで、静的ルーティング用の DGD の実用的なバージョンを作成しました。彼のパッチは、ここおよびドキュメントここここそしてここ。これにより、この重要なタスクに取り組むためのさらなる探求について、十分な情報が得られるはずです。パッチは今でも広く使用されており、最新のカーネルで最新の状態に保たれていることがわかります。次のようなスクリプトから始めるとよいでしょう(ロバート・クルジャタ):

#!/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

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

答え2

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

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

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

関連情報