« Назад

 

 Существует множество компаний, бизнес которых, абсолютно и полностью связан с глобальной сетью. А возможность получить надежный и гарантированный канал связи для доступа в интернет, они не могут — сложное географическое расположение, монополизм и т.д. А работать то, нужно. В таких ситуациях и возникает необходимость подключения дополнительного канала связи для обеспечения бесперебойной работы сети интернет.

Исходные данные

Итак мы имеем два канала доступа в интернет от «Воля-кабель» и «Укртелеком». Кроме того наш сервер выступает в роли openvpn-клиента. IP-адреса обоих провайдеров являются фиксированными. Внешний интерфейс — eth0. Задача — сделать канал от «Воля-кабель» основным, а от «Укртелеком» резервным и при этом обеспечить работу vpn-клиента. Данные интернет-провайдеры выбраны не случайно. Во-первых — это одни из самых популярных провайдеров Украины, а во-вторых они имеют разные способы подключения. Приступим. 

Реализация

Для выполнения поставленной напишем скрипт используя встроенный командный интерпретатор /bin/bash. После чего, поместим скрипт в планировщик задач crontab для периодического выполнения сценария:

#!/bin/bash
#Создадим переменные, в которых укажем шлюзы для каждого подключения

#Для "Воля-Кабель" ip шлюза постоянный. Он будет являться шлюзом по-умолчанию при его доступности:
MAIN=77.120.255.129
#Для "Укртелеком" pppoe подключение и шлюз подставляется произвольно:
SECOND=`/sbin/ifconfig ppp0 | grep inet | sed s/^.*P-t-P:// | sed "s/ .*$//"`
#Создадим переменную, в которой будет указан текущий шлюз по-умолчанию:
CURRENT=$(route -n | tail -1 | awk '{ print $2}')
#Опрашиваем шлюз основного канала:
if ping -c 4 $MAIN > /dev/null 2>&1; then
# Если шлюз основного канала доступный, то проверяем является ли он текущим шлюзом по-умолчанию:
if [ $MAIN = $CURRENT ]; then
# Ничего не делаем, просто завершаем скрипт:
exit 0
#Если основной шлюз не явяляется текущим шлюзом по-умолчанию,назначим его таковым:
else
#Удаляем шлюз по-умолчанию
route del default 2> /dev/null
#Получаем от "Воля-кабель" новые настройки (DHCP):
dhclient eth0
#Добавляем соответствующую запись в системный журнал:
logger "Default route switch to MAIN: $MAIN"
# Поднимаем vpn-соединение:
/etc/init.d/openvpn restart
exit 0
fi
#Основной шлюз не пингуется:
else
#Опрашиваем дополнительный шлюз:
if ping -c 4 $SECOND > /dev/null 2>&1; then
#Дополнительный шлюз опрашивается и является шлюзом по-умолчанию. Завершаем скрипт:
if [ $SECOND = $CURRENT ]; then
# echo "Second = Current. Exit"
exit 0
#Дополнительный шлюз опрашивается, но не является шлюзом по-умолчанию. Исправим это:
else
#Удаляем текущий шлюз по-умолчанию:
route del default 2> /dev/null
#Назначаем новый шлюз по-умолчанию:
route add default gw $SECOND
#Заносим изменения в системный журнал:
logger "Default route switch to SECOND: $SECOND"
# Обновляем vpn-соединение:
/etc/init.d/openvpn restart
exit 0
fi
#Если ни один из шлюзов недоступен - завершаем скрипт и смотрим в сторону третьего провайдера:
else
exit 0
fi
fi

 

 Осталось лишь автоматизировать процесс запуска скрипта. Для этого добавим следующую строку в crontab:

#crontab -e
*/3 * * * * /путь_к_файлу_скрипта

 

Данная строка означает, что cron будет запускать скрипт каждые 3 минуты. Не забываем выставить разрешение на выполнение для пользователя root.  

 

17 мая, 2013

Если у вас возникли вопросы

СВЯЖИТЕСЬ С НАМИ!

Оставьте свои данные и мы свяжемся
с вами ближайшее время