異なる ISP への 2 つのアップリンクによって提供されるファイアウォール システムがあります。ファイアウォールの管理には shorewall を使用しています。shorewall は、接続追跡を使用して両方のインターフェイスでトラフィックの負荷を分散します。すべてうまく機能しています。
インターフェースの 1 つが使用できなくなったことを検出したときに、インターフェースを起動/停止するスクリプトをいくつか作成しました。shorewall が提案する LSM (Ubuntu にはない) は気に入らなかったので、代わりにインターフェース監視用の netplugd と接続テスト用の cron の ping スクリプトを選択しました。
ping スクリプトは基本的に 1 回だけ実行しますping -I eth[01] 8.8.8.8
。ping が失敗した場合は再試行し、それでも失敗した場合は shorewall にインターフェイスを停止するように指示します。
問題は、ファイアウォールがインターフェイスを無効にしたときに発生し、 を実行できなくなります。直近のゲートウェイに ping を実行する場合を除き、ping
常に で応答します。Destination Host Unreachable
通常のトラフィックを送信せずに、インターフェース経由で実際のインターネット接続をテストする方法はありますか?
私が書いたスクリプトは次のとおりです。
チェックインターフェース: (cron および netplugd イベントから実行)
#!/bin/bash
#
# Verify state of interfaces
#
google_ping() {
if ! ping -I "$1" -n -c1 -w1 -q 8.8.8.8 >/dev/null 2>&1; then
# Try harder
ping -I "$1" -n -c2 -w5 -q 8.8.8.8 >/dev/null 2>&1
fi
}
REFRESH=
for i in eth0 eth1; do
if google_ping $i; then
if ! [ -e /tmp/shorewall-$i.up ]; then
echo Interface $i came up
touch /tmp/shorewall-$i.up
REFRESH=true
fi
else
if [ -e /tmp/shorewall-$i.up ]; then
echo Interface $i went down
rm /tmp/shorewall-$i.up
REFRESH=true
fi
fi
done
if [ -n "$REFRESH" ]; then
echo Kicking shorewall...
/sbin/shorewall refresh >/dev/null
fi
(shorewall を使用するとインターフェイスをダウンさせることができることは知っています/var/lib/shorewall/firewall disable eth1
が、不安定な点があったため、私は単に refresh を使用しています)
/etc/shorewall/isusable:
# Used by shorewall to check if interface is usable
# This is sourced instead of executed so don't exit but return
# Interface is up
if [ -e "/tmp/shorewall-$1.up" ]; then
return 0
elif ls /tmp/shorewall-*.up >/dev/null 2>&1; then
return 1
else
# No interfaces are up - pretend they're up and hope for the best
return 0
fi