nano /etc/reserv
#!/bin/bash CheckHost="194.87.0.50" # Контрольный адрес через основного провайдера, который должен быть доступен при его нормальной работе. # Адрес не должен быть адресом шлюза или адресом хоста, к который должен быть постоянно доступным. # Параметры основного канала GW1="gateway 112.19.1.12" # Основной шлюз, основного провайдера (для PPP не указываем шлюз GW1="") NC1="eth1" # Имя сетевого адаптера основного провайдера # Параметры резервного канала GW2="gateway 22.10.10.7" # Основной шлюз, резервного провайдера (для PPP не указываем шлюз GW2="") NC2="eth2" # Имя сетевого адаптера резервного провайдера MaxLoss="80" # Наибольший процент потерь до контрольного адреса через шлюз основного провайдера log="/var/log/reserv.log" # Путь к log-файлу ####################################### Контроль и переключение ############################################################# # Запоминаем текущий адаптер на котором прописан маршрут по умолчанию EthDo=`/sbin/route -n | /usr/bin/awk '{print $1 " " $3 " " $8}'| /bin/grep "0.0.0.0 0.0.0.0"|/usr/bin/awk '{print $3}'` # Проверяем, есть ли вообще маршрут по умолчанию и если нет, добавляем главный. if [ -n "${EthDo}" ] then : else echo `date +"%d.%m.%Y %T %:z"`. "- Отсутствовал шлюз по умолчанию, назначен на интерфейсе ${NC1}" >> ${log} /sbin/route add default ${GW1} ${NC1} fi # Добавляем временный точный маршрут до контрольного адреса через основного провайдера /sbin/route add ${CheckHost}/32 ${GW1} ${NC1} # Проверяме контрольный адрес и запоминаем процент потерь pgw=`/bin/ping -I ${NC1} -c20 -l20 -q -W3 ${CheckHost} | /bin/grep loss | /usr/bin/awk '{print $(NF-4)}' | /usr/bin/cut -d"%" -f1` # Пишем в лог, если потери больше нуля if [ 0 = "${pgw}" ] then : else echo `date +"%d.%m.%Y %T %:z"`. "- Потери пакетов до контрольного адреса ${CheckHost} составили ${pgw}%" >> ${log} fi # Удаляем временный маршрут /sbin/route del ${CheckHost}/32 ${GW1} ${NC1} # Проверяем процент потерь и если он больше допустимого значения, переключаем шлюз по умолчанию на резервный интерфейс if [ "${MaxLoss}" -le "${pgw}" ] then if [ "${EthDo}" = "${NC1}" ] then echo `date +"%d.%m.%Y %T %:z"`. "- Переход на резервный канал - ${NC2}. Потери пакетов до ${CheckHost}: ${pgw}%. Порог: ${MaxLoss}%" >> ${log} /sbin/route del default $NC1 /sbin/route add default $GW2 $NC2 fi fi # Проверяем не восстановилась ли связь по основному интерфейсу и если да, возвращаемся на него if [ "${EthDo}" = "${NC2}" ] then if [ "${pgw}" -le "${MaxLoss}" ] then echo `date +"%d.%m.%Y %T %:z"`. "- Переход на основной канал - шлюз ${GW1}, интерфейс ${NC1}." >> ${log} /sbin/route del default $NC2 /sbin/route add default $GW1 $NC1 fi fi
chmod +x /etc/reserv
Добавим задание в cron для выполнения ежеминутной проверки работы основного канала
crontab -e
# Переменные среды для выполняемых заданий SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin LC_ALL=ru_RU.UTF-8 LC_CTYPE=ru_RU.UTF-8 LC_NUMERIC=ru_RU.UTF-8 LC__TIME=ru_RU.UTF-8 LC_COLLATE=ru_RU.UTF-8 LC_MONETARY=ru_RU.UTF-8 LC_MESSAGES=ru_RU.UTF-8 LC_PAPER=ru_RU.UTF-8 LC_NAME=ru_RU.UTF-8 LC_ADDRESS=ru_RU.UTF-8 LC_TELEPHONE=ru_RU.UTF-8 LC_MEASUREMENT=ru_RU.UTF-8 LC_IDENTIFICATION=ru_RU.UTF-8 LANG=ru_RU.UTF-8 # m h dom mon dow command * * * * * /etc/reserv