Модераторы: powerfox, ZeeLax
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> два провайдера, Настройка отказоустойчивости 
V
    Опции темы
mihanik
Дата 28.8.2013, 14:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 1
Всего: 109



Коллеги!

Прошу прокомментировать то, что я сделал.
Если будут замечены откровенные ляпы, буду рад, если скажете.
Жду отзывов, критики и т.п.

Итак.
Есть у меня два провайдера.
Хочу обеспечить некоторую отказоустойчивоасть

Сначала при загрузке ПК я настраиваю маршруты так, что к 8.8.8.8 трафик идёт через одного провайдера, а к 8.8.4.4 через другого

Код

 cat ./rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

# Опишем путь поиска команд
PATH='/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin'

# Пакеты к 8.8.8.8 отправляем через основного провайдера
GW1=62.16.92.233

# Пакеты к 8.8.4.4 отправляем через запасного провайдера
GW2=84.16.138.241

# Таблицы google1 и google2 были заранее внесены в файл /etc/iproute2/rt_tables

ip rule add to 8.8.8.8 table google1
ip rule add to 8.8.4.4 table google2

ip route add default via $GW1 dev eth5 table google1
ip route add default via $GW2 dev eth2 table google2

# Очищаем кеш, изменения вступают в силу
ip route flush cache



А теперь каждую минуту проверяю состояние каждого провайдера...

Код

#!/bin/sh

# Установим переменные окружения
PATH='/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin'

# Проверим, что сеть поднята.
# Если сети нет, то выходим с ошибкой. Делать нечего.
[ "${NETWORKING}" = "no" ] && exit 6

# Установим значение кое-каких переменных
PID_FILE="/tmp/MyBalancer.pid"

# Проверим, а не запущен ли уже скрипт?
# Если запущен, то выходим из скрипта
if [ -e $PID_FILE ]; then
    echo "Ещё предыдущая копия скрипта не отработала. Выходим."
    exit 0
fi

# Создаём свой PID_файл
touch $PID_FILE

echo Start `date`

# Провайдеры
# Элвис
DEV1='eth5'                             # Интерфейс первого провайдера
LINKSTAT1=''                            # Статус линка первого провайдера
GATE1='default via 62.16.92.233'        # Шлюз первого провайдера
ISPSTAT1=0                              # Статус тырнета через первого провайдера
GATESTAT1=0                             # Статус гейта через первого провайдера

# Стартел
DEV2='eth2'                             # Интерфейс второго провайдера
LINKSTAT2=''                            # Статус линка второго провайдера
GATE2='default via 84.16.138.241'       # Шлюз второго провайдера
ISPSTAT2=0                              # Статус тырнета через второго провайдера
GATESTAT2=0                             # Статус гейта через второго провайдера

# Ещё немного переменных
LINKSTAT=0                              # Суммарное состояние линков
ISPSTAT=0                               # Суммарное состояние провайдеров

# Проверим статус линков обоих провайдеров
# Проверим линк первого провайдера

ip link show "$DEV1" | grep DOWN

if [ $? -eq 0 ]
    then
        LINKSTAT1=0
        echo "Нет линка с первым провайдером."
    else
        LINKSTAT1=1
fi

ip link show "$DEV2" | grep DOWN

if [ $? -eq 0 ]
    then
        LINKSTAT2=0
        echo "Нет линка со вторым провайдером."
    else
        LINKSTAT2=1
fi

# Смотрим, через какого провайдера выходим в Интернет
ip route > /tmp/mygate.txt

grep "$GATE1" /tmp/mygate.txt  >> /dev/null
if [ $? -eq 0 ]
    then
        echo "Интернет через первого провайдера"
        GATESTAT1=1
fi

grep "$GATE2" /tmp/mygate.txt
if [ $? -eq 0 ]
    then
        echo "Интернет через второго провайдера"
        GATESTAT2=1
fi

# Анализируем состояние линков

LINKSTAT=$(($LINKSTAT1+$LINKSTAT2))

# Теперь мысль 1... Если оба линка в дауне, то делать нечего. Выходим из скрипта со статусом ошибки.
if [ $LINKSTAT -eq 0 ]
    then
        echo "Оба провайдера в дауне!"
        rm -f $PID_FILE
        exit 1
fi

# Мысль 2. Если с одним из провайдеров нет линка, то маршрут по умолчанию
# в любом случае должен быть через "живого" провайдера (даже если у него нет тырнета)

# Если первый провайдер в дауне, выходим в тырнет через второго
if [ $LINKSTAT1 -eq 0 ]
    then
    echo "Линк с первым провайдером отсутствует. Выходим в тырнет через второго"
    if [ $GATESTAT1 -eq 1 ]
        then
                ip route del default
                ip route add $GATE2
                ip route flush cache
    fi
    rm -f $PID_FILE
    exit 1
fi

# Если второй провайдер в дауне, выходим в тырнет через первого
if [ $LINKSTAT2 -eq 0 ]
    then
        echo "Линк со вторым провайдером отсутствует. Выходим в тырнет через первого."
        if [ $GATESTAT2 -eq 1 ]
            then
                ip route del default
                ip route add $GATE1
                ip route flush cache
        fi
        rm -f $PID_FILE
        exit 1
fi

# Теперь мысль 3 ... Если оба линка апнуты, то проверяем работу тырнета через них.
if [ $LINKSTAT -eq 2 ]
    then
        echo "С обоими провайдерами есть линки."
fi

# Анализируем состояние интернета через провайдеров

# Проверяем состояние первого провайдера
ping -c 4  8.8.8.8  >> /dev/null

if [ $? -eq 0 ]
    then
        ISPSTAT1=1
        echo "Первый провайдер жив."
fi

# Проверяем состояние второго провайдера
ping -c 4  8.8.4.4  >> /dev/null

if [ $? -eq 0 ]
    then
        ISPSTAT2=1
        echo "Второй провайдер жив."
fi

ISPSTAT=$(($ISPSTAT1+$ISPSTAT2))

# Если интернета через обоих провайдеров нет, то выходим.
if [ $ISPSTAT -eq 0 ]
    then
        echo "Интернета нет у обоих провайдеров!"
        rm -f $PID_FILE
        exit 1
fi

# Если шлюз через первого провайдера и интернет через первого провайдера есть, то выходим
if [ $GATESTAT1 -eq 1 ]
    then
        if [ $ISPSTAT1 -eq 1 ]
            then
                echo "Интернет через первого провайдера. Он жив."
                rm -f $PID_FILE
            exit
        fi
fi

# Если шлюз через второго провайдера, но интернет через первого провайдера есть, то переключаемся на первого провайдера
if [ $GATESTAT2 -eq 1 ]
    then
        if [ $ISPSTAT1 -eq 1 ]
            then
                echo "Интернет через второго провайдера. Но и первый жив. Переключаемся на первого проайдера."
                ip route del default
                ip route add $GATE1
                ip route flush cache
                rm -f $PID_FILE
            exit
        fi
fi

# Если шлюз через первого провайдера, но интернета через первого провайдера нет, то переключаемся на второго провайдера
if [ $GATESTAT1 -eq 1 ]
    then
        if [ $ISPSTAT1 -eq 0 ]
            then
                echo "Интернет через первого провайдера, но он мёртв. Переключаемся на второго."
                ip route del default
                ip route add $GATE2
                ip route flush cache
                rm -f $PID_FILE
            exit
        fi
fi

rm -f $PID_FILE



Это сообщение отредактировал(а) mihanik - 28.8.2013, 14:52


--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
mihanik
Дата 29.8.2013, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 1
Всего: 109



Показал свой изврат вчера тех. диру одного из провайдеров.
Он сначала сказал: "Ну ты и накрутил".
А потом говорит: "Пожалуй, работать будет"


Это сообщение отредактировал(а) mihanik - 29.8.2013, 07:58


--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
mihanik
Дата 30.8.2013, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 1
Всего: 109



Тестирую эту схему на двух организациях.
Пока сбоев не обнаружено.

Отзывов не получил... :-(

Вопрос решён.



--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Linux/UNIX: Администрирование"
ZeeLax
Imple
nerezus
Этот форум предназначен для решения вопросов по администрации *n?x-систем, в частности по настройке сложных сетей и обслуживанию серверного оборудования.

  • Вы должны соблюдать правила форума.
  • Помните: какой вопрос, такой и ответ. Прежде чем задать вопрос прочитайте вот эту статью на форуме CIT.
  • Оскорблять запрещается.
  • Религиозные войны в Религиозных войнах.
  • Общение "просто так" в Клубе юнуксоидов. В отличие от многих других разделов, здесь разрешается сдержанно оффтопить и юморить в тему.

За интересные статьи, находки, решения, программы и просто реальную помощь будут ставиться + в репу).


В данный момент этот раздел модерируют nerezus, nickless, powerfox, pythonwin, Imple и ZeeLax. Если вы хотите помочь нам, пишите в ПМ и мы обсудим.


Спасибо. И use UNIX or die; С уважением, nerezus, nickless, powerfox, pythonwin, Imple, ZeeLax.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Администрирование *NIX систем | Следующая тема »


 




[ Время генерации скрипта: 0.0661 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.