« Назад

 

 Існує безліч компаній, бізнес яких абсолютно і повністю пов’язаний з глобальною мережею. А можливість отримати надійний та гарантований канал зв’язку для доступу в інтернет, вони не можуть – складне географічне розташування, монополізм тощо. А працювати щось потрібно. У таких ситуаціях виникає необхідність підключення додаткового каналу зв’язку для забезпечення безперебійної роботи мережі інтернет.

Вихідні дані

Отже, ми маємо два канали доступу в інтернет від “Воля-кабель” та “Укртелеком”. Крім того, наш сервер виступає в ролі openvpn-клієнта. ІР-адреси обох провайдерів є фіксованими. Зовнішній інтерфейс – eth0. Завдання зробити канал від “Воля-кабель” основним, а від “Укртелеком” резервним і при цьому забезпечити роботу vpn-клієнта. Ці інтернет-провайдери обрані не випадково. По-перше, це одні з найпопулярніших провайдерів України, а по-друге, вони мають різні способи підключення. Почнемо. 

Реалізація

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

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

#Для "Воля-Кабель" ip шлюзу постійний. Він буде шлюзом за замовчуванням за його доступності:
#Для "Укртелеком" 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.  

 

May 17, 2013

Якщо у вас виникли питання

ЗВ'ЯЖІТЬСЯ З НАМИ!

Залишіть свої дані і ми зв'яжемося з вами найближчим часом