Linuxでのマルチインターネット接続のロードバランシングとトラブルシューティング

Linuxでのマルチインターネット接続のロードバランシングとトラブルシューティング

2つのISP接続があり、それらの間に自動ロードバランシングが必要です。また、機能しない接続を使用せずに失敗した接続を処理する必要があります。

最初のリンクは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(Dead Gateway検出)とも呼ばれ、NUD(Neighbor Unreachable検出)とも呼ばれます。 RFC816とRFC1122によると、DGDを実行する方法はいくつかありますが、そのうち3つしか見ていません(出典:私の古い投稿LVSメーリングリストとして):

  • ホストエラー(ARPANETターゲットエラーメッセージなど)を確実に検出して報告するリンク層情報は、否定的なアドバイスとして使用する必要があります。
  • 特定のゲートウェイからのICMPリダイレクトメッセージは、そのゲートウェイに対する肯定的な推奨事項として使用する必要があります。
  • 特定のリンク層アドレスのパケットは、そのアドレスのシステムがアクティブであることを証明します。ただし、この情報をゲートウェイの推奨事項に変換するには、リンク層アドレスをIPアドレスにマッピングしてから、そのIPアドレスをルートキャッシュが指すゲートウェイと比較して確認する必要があります。これは非常に非効率的かもしれません。

2006年に私が活発なLinuxカーネルネットワークの開発を去ったとき、NUDの状態変更をどのように実装するかについての明確な決定はまだありませんでした。私の友人であり、LVSのコア開発者であるJulian Anastasovは、2002年にあなたの問題を解決しなければなりませんでした。それで、ある夜、彼はFIBにNUDステータス(情報転送)を追加し、静的ルーティングのための動作中の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

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

おすすめ記事