воскресенье, 23 сентября 2012 г.

Скрипт для переключения на резервный канал


Имеется прокси-сервер на openSUSE 12.1:
eth0 - сетевой интерфейс с интернетом от основного провайдера
eth1 - сетевой интерфейс в локальную сеть
ppp0 - резервный канал реализуемый 3G модемом от Мегафона, работающий через wvdial

Нужно написать скрипт, чтобы при потере интернета на eth0 от основного провайдера он переключал на мегафон ppp0, а при появлении интернета на eth0 переключал обратно.

Пример скрипта (/usr/local/scripts/check_internet.sh):

################################################################
#!/bin/sh

# Доступность этого хоста будет означать корректную работу основного канала
# 8.8.8.8 это DNS от Google. За его доступность можно не беспокоиться
# А значит вероятность ложного срабатывания минимальна
HOST="8.8.8.8"

# Файл-флаг. Появляется при переключении на резервный канал
LOCKFILE="/tmp/check_internet.lock"

# Файл журнала
LOGFILE="/var/log/check_internet.log"

# Пингуем проверочный хост через основной канал
ping -I eth0 -c 3 -n -q ${HOST} > /dev/null

# Если возникла ошибка (хост не доступен)
if [ $? -ne "0" ]; then
# Если нет файла-флага
if [ ! -f ${LOCKFILE} ]; then
# Меняем маршрут по умолчанию в основной таблице роутинга
ip route del default
ip route add default dev ppp0 metric 10
# Создаём файл флаг
touch ${LOCKFILE}
# Делаем запись в файл журнала
echo `date +'%Y/%m/%d %H:%M:%S'` Internet connection changet to MEGAFON >> ${LOGFILE}
fi
# Если же всё хорошо
else
# Если есть файл-флаг
if [ -f ${LOCKFILE} ]; then
# Меняем маршрут по умолчанию в основой таблице роутинга
ip route del default
ip route add default via 172.168.0.1 metric 10
# Удаляем файл-флаг
rm -f ${LOCKFILE}
# Записываем событие в файл журнала
echo `date +'%Y/%m/%d %H:%M:%S'` Internet connetction changed to INTERNET >> ${LOGFILE}
fi
fi
################################################################

Этот скрипт нужно запускать каждую минуту. Для этого в "/etc/crontab" (подробнее о crontab) нужно добавить строку:

*   *   *   *   *   root    /usr/local/scripts/check_internet.sh

По мотивам группы Linux в VK и ylsoftware.com

5 комментариев:

  1. Полезная вещь. Нубский вопрос: я правильно понял, что "172.168.0.1" - это адрес шлюза на роутере (основного канала), через который и работает инет, через "eth0" ?
    3G модем соответственно также должен быть всегда подключен...

    ОтветитьУдалить
    Ответы
    1. От тебя-то и нубский? ;)
      Если я правильно понял твой вопрос, то - да ) только сам РОУТЕР - частный случай

      Удалить
  2. возврат на основной, канал, когда упадёт резерв - криво как-то.

    ОтветитьУдалить
  3. Не для всех подойдет. У Вас Возврат на основной только , когда падает резерв. :-(

    ОтветитьУдалить
  4. У меня не пингуется основной канал если нет в таблице

    ОтветитьУдалить