Коллеги! Прошу прокомментировать то, что я сделал. Если будут замечены откровенные ляпы, буду рад, если скажете. Жду отзывов, критики и т.п. Итак. Есть у меня два провайдера. Хочу обеспечить некоторую отказоустойчивоасть Сначала при загрузке ПК я настраиваю маршруты так, что к 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
--------------------
Программистами не рождаются, - это родовая травма...  
|