Привет! Появился второй провайдер. Потребности в балансировке трафика нет, но зафейловерить линк во внешний канал не помешает. Основной провайдер предоставляет прямой линк (30 мегабит), резервный дает PPPoE (5 мегабит). Шлюзом выступает Debian 7.
Для выполенения задачи было решено держать оба линка поднятыми и в случае падения первого - переключать default gateway, подгружать альтернативный конфиг iptables и удаленно замеменять конфигурацию squid через SSH на прокси-сервере. Другой конфиг сквида разрешает доступ в интернет только тем пользователям, которым внешняя сеть критична для работы (Это около 15% всех пользоватлей). Учитывая специфику предприятия и то, что ширина резервного канала довольно мала, мне показалось это оптимальным решением.
Для автоматизации процесса я написал скрипт, который запускается по крону каждые пять минут. В моей ситуации это приемлемое время недоступности внешнего канала.
Проблема вот в чем. Мне нужно проверять доступность обоих каналов независимо от того, какой сейчас используется. Для этого я выбрал самый простой способ - ping -I $iface. Правильно ли? Есть что-то лучше?
Когда активный основной линк, я могу пинговать с обоих интерфейсов, -I eth6 и -I ppp0 работают и отвечают. Когда шлюз по умолчанию меняется на резервный, -I ppp0 работает, а вот -I eth6 перестает, - «destination host unreachable». В итоге, после переключения на резервный канал, обратно я уже не возвращаюсь, потому что проверка основного канала заканчивается провалом независимо от его состояния. Почему так?
# основной
# ip r
default via 85.1.1.45 dev eth6
10.0.0.0/21 dev eth1 proto kernel scope link src 10.0.0.2
90.2.66.97 dev ppp0 proto kernel scope link src 90.2.2.2
85.1.1.44/30 dev eth6 proto kernel scope link src 85.1.1.46
# резервный
# ip r
default dev ppp0 scope link
10.0.0.0/21 dev eth1 proto kernel scope link src 10.0.0.2
90.2.66.97 dev ppp0 proto kernel scope link src 90.2.2.2
85.1.1.44/30 dev eth6 proto kernel scope link src 85.1.1.46
Любую информацию предоставлю. Скрипт прикладываю. Баш только изучаю, если есть замечания, ошибки, предложения - пожалуйста, расскажите :)
#!/bin/bash
LOG="/var/log/isp-connect.log"
exec &>>$LOG
CURRENT_IF=$(ip r | grep "default" | awk '{print $5}')
PINGHOST1="8.8.8.8"
PINGHOST2="8.8.4.4"
WAN1_IF="eth6"
WAN1_IP="85.1.1.46"
WAN1_GW="85.1.1.45"
WAN2_IF="ppp0"
WAN2_IP="90.2.2.2"
DATE=$(date "+%m/%d/%y %H:%M:%S")
SENDEMAIL="sendemail -f gw01@domain.ru -t log@domain.ru -u \"WAN STATUS\" -s mail01.my.domain.ru"
#
CHECK_WAN1() { ping -q -c 5 -I $WAN1_IF $PINGHOST1 > /dev/null || ping -q -c 5 -I $WAN1_IF $PINGHOST2 > /dev/null; }
CHECK_WAN2() { ping -q -c 5 -I $WAN2_IF $PINGHOST1 > /dev/null || ping -q -c 5 -I $WAN2_IF $PINGHOST2 > /dev/null; }
ROUTE_WAN1() { route del default; route add default gw $WAN1_GW $WAN1_IF; sleep 5; }
ROUTE_WAN2() { route del default; route add default dev $WAN2_IF; sleep 5; }
#
if [ "$CURRENT_IF" == $WAN1_IF ]; then
CHECK_WAN1
if [ $? -ne 0 ]; then
echo "[FAIL] $DATE WAN1 link is DOWN."
echo "[INFO] $DATE Checking WAN2."
CHECK_WAN2
if [ $? -ne 0 ]; then
echo "[FAIL] $DATE ISP-SWITCH failed. Cannot connect to WAN2."
$SENDEMAIL -m "[FAIL] $DATE WAN1 and WAN2 are down. Switching is not possible."
exit
else
ROUTE_WAN2
echo "[OK] $DATE WAN2 connection established."
bash /etc/iptables/wan2.ipt
# ssh to squid-server placeholder
# echo "[OK] $DATE squid configuration changed to EMERGENCY."
$SENDEMAIL -m "[WARN] WAN1 is down. Switched to WAN2."
exit
fi
else
echo "[INFO] $DATE WAN1 link is UP. There is nothing to do."
exit
fi
#
elif [ "$CURRENT_IF" == $WAN2_IF ]; then
CHECK_WAN1
if [ $? -ne 0 ]; then
echo "[INFO] $DATE WAN1 link is still DOWN."
exit
else
echo "[INFO] $DATE WAN1 link looks like UP."
echo "[INFO] $DATE Trying WAN1."
ROUTE_WAN1
CHECK_WAN1
if [ $? -ne 0 ]; then
echo "[FAIL] $DATE Cannot verify WAN1 connection."
echo "[INFO] $DATE ISP-SWITCH was canceled."
ROUTE_WAN2
exit
else
echo "[OK] $DATE WAN1 connection established."
echo "[OK] $DATE Changing squid3 configuration to MAIN."
$SENDEMAIL -m "[OK] WAN1 is back. Switched to WAN1."
bash /etc/iptables/wan1.ipt
# ssh to squid-server placeholder
exit
fi
fi
fi
Помоги ЛОР там, где не смог помочь гугл :(