UbuntuサーバーをNATルーターとして使用しています。WAN インターフェイスはeth1
で、LAN インターフェイスはeth0
です。フェールオーバーのために LAN 側で ucarp 仮想 IP を使用します。WAN リンクまたはデフォルト ゲートウェイがダウンした場合に LAN インターフェイスをダウンさせるスクリプトを作成していますeth0
(LAN インターフェイスがダウンした場合、ucarp は NAT ゲートウェイ IP をネットワーク上の別のルーターに解放できます)。また、WAN IP が ping されると、LAN インターフェイスが起動し、WAN IP が ping されるまで起動したままになります。
バッシュスクリプト:
#!/bin/bash
t1=$(ifconfig | grep -o eth0)
t2="eth0"
#RMT_IP = "8.8.8.8"
SLEEP_TIME="10"
ping -c 2 8.8.8.8 > /dev/null
PING_1=$?
if [ $PING_1 = 1 ]; then
if [ "$t1" != "$t2" ]; then
ifconfig eth0 up
echo "Iface brought up"
else
echo "Iface is already up"
fi
else
if [ "$t1" = "$t2" ]; then
ifconfig eth0 down
echo "Iface brought down"
else
echo "iface already down"
fi
fi
sleep $SLEEP_TIME
スクリプトが機能しません。私が望むのは、WAN IPにpingを実行できる場合、LANインターフェースは稼働eth0
したままにする必要があるということです。WAN IP に ping を実行できない場合は、インターフェイスを停止する必要があります。スクリプトは 10 秒ごとにループで実行する必要があります。WAN ip が長期間 ping できない場合は、eth0
停止したままにしておく必要があります。しばらくして WAN ip が ping された場合は、eth0
起動する必要があります。また、起動ジョブとして起動時にスクリプトを実行する予定です。
編集1: 私の最終的なスクリプト:
#!/bin/bash
timeout=5 # delay between checks
pingip='8.8.8.8' # what to ping
iface="eth0"
LOG_FILE="/var/log/syslog"
isdown=0 # indicate whether the interface is up or down
# start assuming interface is up
while true; do
LOG_TIME=`date +%b' '%d' '%T`
if ping -q -c 2 "$pingip" >> /dev/null ; then # ping is good - bring iface up
if [ "$isdown" -ne 0 ] ; then
ifup $iface && isdown=0
printf "$LOG_TIME $0: Interface brought up: %s\n" "$iface" | tee -a $LOG_FILE
fi
else # ping is bad - bring iface down
beep -f 4000
if [ "$isdown" -ne 1 ] ; then
ifdown $iface && isdown=1
printf "$LOG_TIME $0: Interface brought down: %s\n" "$iface" | tee -a $LOG_FILE
fi
fi
sleep "$timeout"
done