Скрипт переключения каналов интернет FreeBSD

Раздел: FreeBSD
Написано: 8.09.2016
Автор: Antonio

Модернизированный скрипт для переключения каналов интернет FreeBSD, с небольшими доработками или возможно даже без них должен работать и на Linux.

крутой дата центр

Эпопея с каналами интернет продолжается. До сих пор в операционных системах нет простого и удобного штатного способа переключения шлюза по-умолчанию интернет.


Есть масса различных программ роутеров, которые зачастую могут вносить свои проблемы в работу системы, требуют сложной настройки или просто банально стоят денег, которых обычно как всегда не хватает.

Один из простых вариантов — скрипт для переключения каналов интернет путем переключения шлюза по-умолчанию операционной системы сервера роутера.

Пример.
Есть 2 канала в интернет, допустим основной и резервный. Есть два роутера для этих каналов и один роутер, который прописан на компьютерах пользователей, так же задан в настройках DHCP (серверы могут быть даже не физическими, а виртуальными).

Этот роутер для пользователей направляет пользователей через основной канал или в случаях его поломки через резервный. На роутере должен быть механизм анализа через какого провайдера ему направлять людей. Этим как раз и занимается наш несложный, однако модернизированный скрипт.

Консольный скрипт переключения провайдеров интернет (работает в FreeBSD)

cat inet_change.sh
 
#!/bin/sh
LANG=ru_RU.KOI8-R; export LANG
MM_CHARSET=KOI8-R; export MM_CHARSET
 
# Основной оптика
GW1=10.0.0.2
# Резервный Радио
GW2=10.0.0.3
 
# Устанавливаем в переменную время и дату в нужном нам формате
DT=`date +"%T %d.%m.%Y"`
 
# Для проверки каналов интернет на работоспособность используем пинг на сервисы Yandex, разные IP для разных каналов
# вы можете использовать свои эталонные адреса для проверки
 
# Проверяем добавлены ли маршруты на эталонные IP для проверки, если нет, то добавляем
check_node=`netstat -rn | grep "77.88.8.1" | awk '{print $1}'`
    if [ "$check_node" != "77.88.8.1" ]; then
    # добавляем маршрут для Яндекса через оптику для проверки
    /sbin/route add 77.88.8.8 $GW1
    # через Радио
    /sbin/route add 77.88.8.1 $GW2
    else
    fi
 
# Проверяем, если включен основной интернет и файл состояния установлен на резервный канал, то стираем файл состояния
# Такая ситуация может возникнуть, например, если сервер был на резервном и потом его резко выключили,
# А после включения опять включился основной канал (маршрут по-умолчанию)
check_gw=`netstat -rn | grep default | awk '{print $2}'`
    if [ "$check_gw" = "10.0.0.2" ]; then
 
    if [ -f /tmp/.inet_reserv_work ]; then
    /bin/rm /tmp/.inet_reserv_work
    /bin/echo Стираем файл .inet_reserv_work $DT, так как шлюз $GW1, а не резервный $GW2! >> /data/scripts/inet_change.log
    else
    fi
 
    else
    fi
 
# Проверяем работает ли основной канал
    is=`/sbin/ping -c 7 77.88.8.8 | grep -c "64 bytes"`
    if (/bin/test $is -gt "4") then
 
# Если основной канал работает и файл состояния резервного канала существует, то стираем файл состояния и переключаемся
# на основной канал, пишем запись в лог и отправляем письмо администратору о переключении
    if [ -f /tmp/.inet_reserv_work ]; then
    /sbin/route change default $GW1
    /bin/rm /tmp/.inet_reserv_work
    /bin/echo Основной канал [Оптика] включен $DT >> /data/scripts/inet_change.log
    echo "$DT Переключились на Оптику" | mail -s "Интернет переключился" admin@admin.com -f root@admin.com
    else
    exit
    fi
 
else
 
# Если основной не работает, то проверяем резервный и переключаемся на него
    is2=`/sbin/ping -c 7 77.88.8.1 | grep -c "64 bytes"`
    if (/bin/test $is -gt "4" || /bin/test $is2 -gt "4") then
 
    if ! [ -f /tmp/.inet_reserv_work ]; then
    /sbin/route change default $GW2
    /usr/bin/touch /tmp/.inet_reserv_work
    /bin/echo Резервный канал [Радио] включен $DT >> /data/scripts/inet_change.log
    echo "$DT Переключились на Радио" | mail -s "Интернет переключился" admin@admin.com -f root@admin.com
    fi
    fi

Скрипт запускается по крону каждую минуту, выполняет описанные процедуры и останавливается до следующей минуты.

Добавляем выполнение в крон.

*/1     *       *       *       *       root    /data/scripts/inet_change.sh > /dev/null 2>&1

Для проверки работы системы отключаем основной канал и смотрим на письма и на переключение интернет, если все успешно, включаем основной и смотрим на переключение назад на основной канал.

Недостатки такого метода переключения.
1. Один из недостатков предыдущих версий — это пинг шлюза провайдера, он устранен, раньше обычно пинговали шлюз и если он недоступен, то переключались. Однако много раз бывало, что шлюз провайдера пингуется, а интернета все равно нет (поломка у провайдера). В данном случае мы пингуем сторонние ресурсы и зависим от надежности и настроек этих ресурсов, ведь если эталонный сервер перестанет отвечать, то скрипт будет переключать интернет, даже если он работает нормально. И если оба сервера не будут отвечать, то вообще не хорошо.

2. Очень давно как-то на одном из провайдеров была такая ситуация — пинг есть, а интернет зафильтрован. В таком случае скрипт тоже не переключит канал. Получается нужно переделывать скрипт на проверку не пингом, а сканировать порт, например 80-й

3. Небольшая задержка до переключения каналов (в пределах 1 минуты).

4. Я не вынес все изменяемые параметры в переменные, это сделаю при очередной доработке, чтобы сразу все оттестировать.

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

6. В данной версии возможность переключаться только между 2 каналами интернет.

Плюсы такого метода.
1. Простота.
2. Не нужно никакого стороннего программного обеспечения.
3. Отправка на почту уведомлений о переключении (для статистики).
4. Скрипт при проверке (пинге) считает количество успешно пройденных «пингов» и если количество больше 4-х из 7, то считается что интернет работает. Необходимое количество «успешных» пингов можно менять.

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

Поделиться с друзьями или в соц.сетях (спасибо)
Ещё похожие заметки:

3 комментария

PаdonaK
Май 28, 2019 22:14

А сам скрипт проверял ? Похоже на копипаст :)
Скрипт не работает. Переделывать надо . Много лишних «else» в коде ..

 
Antonio
Май 29, 2019 11:45

Это скрипт я сделал и использовал на работающем роутере.
Так что должно быть все ок.

 
PаdonaK
Май 29, 2019 12:25

Если что, вариант под Linux,
ссылка в подписи

 

Написать

Копирование информации с сайта возможно только с указанием прямой ссылки - https://nemcd.com