ФЭНДОМ


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