Обсуждение статьи тематического каталога: Пример скрипта для переключения выделенок, при падении. (leased trouble script example)Ссылка на текст статьи: http://www.opennet.me/base/net/leased_degluk.txt.html
а вот на 3 канала переделано! но теперь без ошибок ;))#!/bin/sh
PATH="/sbin:/usr/bin"ISP1="*.*.*.*"
ISP2="*.*.*.*"
ISP3="*.*.*.*"
OVER_ISP1="*.*.*.*"
OVER_ISP2="*.*.*.*"
OVER_ISP3="*.*.*.*"netstat -nr | grep ${OVER_ISP1} >/dev/null 2>&1
if [ $? != 0 ]; then
echo "Add static route to ${OVER_ISP1} via ${ISP1}"
route add ${OVER_ISP1} ${ISP1} -static
fi
netstat -nr | grep ${OVER_ISP2} >/dev/null 2>&1
if [ $? != 0 ]; then
echo "Add static route to ${OVER_ISP2} via ${ISP2}"
route add ${OVER_ISP2} ${ISP2} -static
finetstat -nr | grep ${OVER_ISP3} >/dev/null 2>&1
if [ $? != 0 ]; then
echo "Add static route to ${OVER_ISP3} via ${ISP3}"
route add ${OVER_ISP3} ${ISP3} -staticfi
current_now=`netstat -nr | grep default | awk '{print $2}'`
echo -n "ping ISP1:"
ping -c 2 ${OVER_ISP1} >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo " [OK]"
ISP1_stat=0
else
echo " [FAILED]"
ISP1_stat=1
fiecho -n "ISP2:"
ping -c 1 ${OVER_ISP2} >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo " [OK]"
ISP2_stat=0
else
echo " [FAILED]"
ISP2_stat=1
fiecho -n "ping ISP3:"
ping -c 1 ${OVER_ISP3} >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo " [OK]"
ISP3_stat=0
else
echo " [FAILED]"
ISP3_stat=1
fi
if [ ${ISP1_stat} -eq 1 -a ${ISP2_stat} -eq 0 -a ${current_now} = ${ISP1} ]; then
echo "ISP1 suck"
route delete default
route add default ${ISP2}
fiif [ ${ISP1_stat} -eq 1 -a ${ISP2_stat} -eq 1 -a ${ISP3_stat} -eq 0 -a ${current_now} != ${ISP3} ]; then
echo "ISP1 ISP2 suck"
route delete default
route add default ${ISP3}
fiif [ ${ISP1_stat} -eq 0 -a ${current_now} != ${ISP1} ]; then
echo "Back to ISP1"
route delete default
route add default ${ISP1}
fi
У меня этот скрипт так и не пошёл, написал свой на основе этого первого из приведенных:
#!/bin/sh
#----------------------------------------------------------------------
# Description: Channel emergency switching script
# Author: Britvin Danila <>
# Computer: router
# System: FreeBSD 5.2.1-RELEASE on i386
#----------------------------------------------------------------------# Variables
#### First channel description
FRST="1.1.1.1"
FRSTGW="gw1.gw1.gw1.gw1"
FRSTIF="if0"
#### Second channel description
SCND="2.2.2.2"
SCNDGW="gw2.gw2.gw2.gw2"
SCNDIF="if1"
#Target for ping
TGT="194.226.96.8" #ns4.ripn.net
#### Reading current channel
netstat -rn | grep default > /log.txt
if [ $? -ne 0 ];then
current_link="gw1.gw1.gw1.gw1"
else
current_link=`awk '{print $2}' /log.txt`
rm /log.txt
fi
echo "Current link is $current_link"#### Pinging target via first GW
route delete $TGT
route add -host $TGT $FRSTGW -static
ping -c 3 $TGT >/dev/null 2>&1
if [ $? -ne 0 ];then
echo "Ping on first channel: [ BAD ]"
frst_status=bad
else
echo "Ping on first channel: [ OK ]"
frst_status=good
fi
#### Pinging target via second GW
route delete $TGT
route add -host $TGT $SCNDGW -static
ping -c 3 $TGT >/dev/null 2>&1
if [ $? -ne 0 ];then
echo "Ping on second channel: [ BAD ]"
scnd_status=bad
else
echo "Ping on second channel: [ OK ]"
scnd_status=good
fi#### Switching channel
#### All good
if [ "good" = $frst_status -a "good" = $scnd_status -a $current_link = $FRSTGW ];then
echo "All good."
exit
fi
if [ $current_link = $SCNDGW -a "bad" = $frst_status -a "good" = $scnd_status ];then
echo "First channel is still down =("
exit
fi
#### First channel is UP!
if [ "good" = $frst_status -a $current_link = $SCNDGW ];then
echo First channel is UP now, switching. Current time `date`
EXT=$FRST
EXTGW=$FRSTGW
EXTIF=$FRSTIF
NATD="natd"
fi
#### If first channel is down
if [ "bad" = $frst_status -a "good" = $scnd_status -a $current_link = $FRSTGW ];then
echo First channel is going down, switching. Current time `date`
EXT=$SCND
EXTGW=$SCNDGW
EXTIF=$SCNDIF
NATD="8678"
fi
#### If both channels down
if [ "bad" = $frst_status -a "bad" = $scnd_status ];then
echo "Both channels down... How we can live without net?!?!?! "
echo "I will try to find live channel again"
echo `date`
exit
fi
route delete default 2>&1
route add default $EXTGW 2>&1
/sbin/ipfw -q flush
#генерим новые правила для ipfw
####### VARIABLES #######
ext=$EXTIF #External interface
int="dc0" #Internal Interface
intip="192.168.0.10" #Internal IP
extip="$EXT" #External IP
dnsfwd="193.138.70.2" #Forward DNS server
fw="/sbin/ipfw" #Path to IPFW
echo $ext "is an external interface"
echo $int "is an internal interface"
echo "Applying IPFW settings"
####### GLOBAL RULES #######
## Allow rules
${fw} add 20000 allow icmp from $intip/24 to any via $int #Allow ping requests from intranet
## Deny rules
${fw} add 40000 deny ip from $intip/24 to $extip via $int
# ну и далее как вам нужно . . . . .
##NATD
#Главное не забыть вот это ! ! !
${fw} add 60000 divert $NATD ip from any to any via $ext #Enable natd
#В запуск системы поставить два natd –
#natd –s –n if0
#natd –s –p 8678 if1.......................................................................
Поставил этот скрипт в крон на каждые пять минут
*/5 * * * 1-7 root //usr/local/etc/cron-scripts/switch.shВ принципе, могу порекомендовать удалить все эхо про пинг и прочее типа "Done" и оставить только в случе переключения а то кроновские репорты достанут =)
Не судите строго сей скрипт - он у меня первенький =), но факт что работает...
>Не судите строго сей скрипт - он у меня первенький =), но
>факт что работает...Работает, говоришь... :-)
а попробуй выдерни из второй карты провод и подожди 5 мин...у тебя и работающий ляжет...
...Подсказка
route delete default 2>&1
route add default $EXTGW 2>&1Этот случай в if не попадает, поэтому переменная $EXTGW , которая там определяется остается неопределенной
default удаляется, а нового то и нету...
подскажите плиз, что если основной шлюз
#роутер основного пройдера
ISP1="xxx.xxx.xxx.xxx"
может измениться, как нужно написать скрипт, что бы он автоматом менялся и в скрипте?