Возникает проблема как переключать с основного канала на резервный. Можно пингать шлюз или какой-либо хост в в основном канале и переключать по пропаданию, можно балансировать нагрузку на каналы. А можно и вручную, например вот так:
/var/www# cat prov.html
<html> <head> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8"> <meta http-equiv="pragma" content="no-cache"> <TITLE> Переключение провайдера </TITLE> </head> <body> В данный момент подключен: <b>ПРОВ-ОСН</b><br> Нажмите кнопку для переключения (переключение будет осуществлено в течении 1 минуты)<br> <form action="cgi-bin/1.cgi"> <input type=radio name="flag" value="OSN">ПРОВ-ОСН<br> <input type=radio name="flag" value="DOP">ПРОВ-ДОП<br> <input type=submit> </form> </body> </html>
/var/www# cat cgi-bin/1.cgi
#! /bin/bash echo Content-type: text/plain echo "" flg=`echo $QUERY_STRING|cut -d= -f2` case "$flg" in OSN) echo "OK переключаем на ПРОВ-ОСН" /bin/sed -r -i "s/<b>(ПРОВ-ОСН|ПРОВ-ДОП)<\/b>/<b>ПРОВ-ОСН<\/b>/" ../prov.html 2>&1 echo $flg > flag ;; DOP) echo "OK переключаем на ПРОВ-ДОП" /bin/sed -r -i "s/<b>(ПРОВ-ОСН|ПРОВ-ДОП)<\/b>/<b>ПРОВ-ДОП<\/b>/" ../prov.html 2>&1 echo $flg > flag ;; *) echo "Фигню пишешь, начальник" ;; esac
/var/www# cat /etc/crontab
#cut * * * * * root /root/change_prov
/var/www# cat /root/change_prov
#! /bin/bash flg=`cat /var/www/cgi-bin/flag` rout=`/sbin/ip r l 0/0|awk '{print $3}'` #echo $rout $flg if [ $rout = "8x.xx.xx.xx" -a $flg = "OSN" ] ; then exit 0 fi if [ $rout = "7x.xx.xx.xx" -a $flg = "DOP" ] ; then exit 0 fi case $flg in OSN) /sbin/ip r d default /sbin/ip r a default via 8x.xx.xx.xx dev eth2 /root/firewall_osn cp -f /etc/resolv.conf.osn /etc/resolv.conf /etc/init.d/dnsmasq restart >/dev/null echo "change to PROV-OSN" ;; DOP) /sbin/ip r d default /sbin/ip r a default via 7x.xx.xx.xx dev eth0 /root/firewall_dop cp -f /etc/resolv.conf.dop /etc/resolv.conf /etc/init.d/dnsmasq restart >/dev/null echo "change to PROV-DOP" ;; *) ;; esac