Linux переключение между каналами.
Выкладываю небольшой скрипт, который автоматизирует работу по переключению интернет каналов. Например есть у нас два провайдера один например на "основной" 100Мбит/с а второй на 12Мбит/с. И нужно что когда падал основной канал в 100Мбит/с переключался на резервный. А когда основной подымался возвращался назад. Скрипт коментирован так, что разобраться будет несложно.
#! /bin/bash
MAIN=172.18.19.1
SECOND=192.168.35.1
# Получаем текущий роутер по умолчанию.
CURRENT=$(route -n | tail -1 | awk '{ print $2}')
#echo $CURRENT
# Проверяем, пингуется ли основной роутер.
if ping -c4 $MAIN > /dev/null 2>&1; then
# echo "MAIN working"
# Если пингуется, значит основной канал поднялся или находится в рабочем состояний, #проверяем, является ли он
# сейчас роутером по умолчанию.
if [ $MAIN = $CURRENT ]; then
# Если да, то просто выходим, т.к мы и так на основном канале
# echo "MAIN current. Exit"
exit 0
else
# Если нет, то меняем маршрут на основной роутер, то бишь канал поднялся, но маршрут #еще не добавлен
MAIN=172.18.19.1
SECOND=192.168.35.1
# Получаем текущий роутер по умолчанию.
CURRENT=$(route -n | tail -1 | awk '{ print $2}')
#echo $CURRENT
# Проверяем, пингуется ли основной роутер.
if ping -c4 $MAIN > /dev/null 2>&1; then
# echo "MAIN working"
# Если пингуется, значит основной канал поднялся или находится в рабочем состояний, #проверяем, является ли он
# сейчас роутером по умолчанию.
if [ $MAIN = $CURRENT ]; then
# Если да, то просто выходим, т.к мы и так на основном канале
# echo "MAIN current. Exit"
exit 0
else
# Если нет, то меняем маршрут на основной роутер, то бишь канал поднялся, но маршрут #еще не добавлен
# echo "MAIN not Current, switch yo MAIN"
route del default 2> /dev/null
route add default gw $MAIN
/etc/sysconfig/main_firewall.sh
echo "Default chanel switched to MAIN_Provider: $MAIN" | mail -s "Internet chanel switched to MAIN_Provider" some@some.com
logger "Default chanel switched to MAIN_Provider: $MAIN"
exit 0
fi
else
# echo "MAIN not working"
# Если MAIN не является маршрутом по умолчанию
# Проверяем, является ли SECOND маршрутом по умолчанию.
if [ $SECOND = $CURRENT ]; then
# Если является, то ничего не далаем, т,е основной отпал и мы на резервном
route del default 2> /dev/null
route add default gw $MAIN
/etc/sysconfig/main_firewall.sh
echo "Default chanel switched to MAIN_Provider: $MAIN" | mail -s "Internet chanel switched to MAIN_Provider" some@some.com
logger "Default chanel switched to MAIN_Provider: $MAIN"
exit 0
fi
else
# echo "MAIN not working"
# Если MAIN не является маршрутом по умолчанию
# Проверяем, является ли SECOND маршрутом по умолчанию.
if [ $SECOND = $CURRENT ]; then
# Если является, то ничего не далаем, т,е основной отпал и мы на резервном
# echo "Second = Current. Exit"
exit 0
else
# Если не является, то меняем маршрут
# на вспомогательный роутер/
# echo "Second not Current. switch to Second"
route del default 2> /dev/null
route add default gw $SECOND
/etc/sysconfig/second_firewall.sh
echo "Default chanel switched to Second_Provider: $SECOND"| mail -s "Internet chanel switched to Second_Provider" some@some.com
logger "Default chanel switched to Second_Provider: $SECOND"
exit 0
fi
fi
exit 0
else
# Если не является, то меняем маршрут
# на вспомогательный роутер/
# echo "Second not Current. switch to Second"
route del default 2> /dev/null
route add default gw $SECOND
/etc/sysconfig/second_firewall.sh
echo "Default chanel switched to Second_Provider: $SECOND"| mail -s "Internet chanel switched to Second_Provider" some@some.com
logger "Default chanel switched to Second_Provider: $SECOND"
exit 0
fi
fi
Поместим содержимое этого скрипта например в /etc/sysconfig/chanel_switch.sh
Затем добавим этот файл в cron, чтобы состояние каналов проверялось через некоторый промежуток времени я взял 5 мин. Для этого создадим файл jobs следующего содержания
*/5 * * * * /etc/sysconfig/chanel_switch.sh
И добавим в Cron
crontab jobs
Хотелось бы отметить что main_firewall.sh и second_firewall.sh - это правила вашего файрвола, например iptables, отличаются они тем что в основном у нас прописаны eth1 а в резервном eth2.
Комментариев нет:
Отправить комментарий