Переключение на резервный канал

Материал из Wiki Open book
Перейти к: навигация, поиск

Содержание

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

  • Linux роутер с минимум 3-мя сетевыми картами.
  • Два подключения к разным провайдерам.
  • Один канал основной, второй резервный.

Задача.

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

Решение.

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

Текст скрипта switchroute.sh

 #! /bin/bash

 MAIN=192.168.100.1
 SECOND=192.168.100.100

 # Получаем текущий роутер по умолчанию.
 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
		logger "Default route switch to MAIN: $MAIN"
		# echo "Default route switched to MAIN: $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
                logger "Default route switch to SECOND: $SECOND"
		# echo "Default route switched to SECOND: $SECOND"
                exit 0
	fi
 fi

Переменная MAIN должна содержать ip адрес роутера провайдера на основном канале.

Переменная SECOND должна содержать ip адрес роутера провайдера на дополнительном канале.

ВАЖНО! В файерволе NAT должен быть на обеих выходных интерфейсах. Например, если выходные интерфейсы eth0 и eth1

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

Вместо MASQUERADE можно использовать SNAT.

Также следует проверить разрешения IP форвардинга

# cat /proc/sys/net/ipv4/ip_forward
1

Сам скрипт необходимо добавить в виде задания в Cron. Скрипт должен выполняться с правми пользователя root. Например для проверки раз в пять минут, в список заданий root добавтье следующую строку:

*/5 * * * * /usr/local/sbin/switchroute.sh

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

Недостатки.

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

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

Инструменты
    
Личные инструменты