internet-logo41

Cкрипт для проверки канала

 

Есть 3 АДСЛ канала.
В силу топологических особенностей подключения, выделена отдельная подсеть на модемы (поверх основной сети) вида 172.31.255.0/24, 252,253,254 - модемы, 1,2,3 - алиасы на сетевухе eth0, Настроена балансировка по образу и подобию "Linux Advanced Routing & Traffic Control".

Периодически модемы падают (виснут, отключают свет, отваливается pppoe сессия на прова и т.д.) при этом интернет начинает тупить: перестают открываться сайты, которые балансировщиком в данный момент времени завернуты на этот модем.

Вижу выход такой: bash скрипт, который пингует по каждому каналу DNS сервер прова (ping -I 172.31.255.25х xxx.xxx.xxx.xxx) и по результатам проверки меняет правила маршрутизации и шейпера.
Все бы хорошо, только вот в написании bash скриптов я полный ламер, а учиться некогда.
Как из bash сделать ping и получить ответ "есть пинг" или "нет пинга" (true or false)?

 

 

Этот скрипт,

 

Этот скрипт, запущенный в кроне, позволяет мне работать без разрывов с ноября месяца со стримом.

 
#!/bin/sh
 
ping -c 2 ya.ru 
 
if [ $? -ne 0 ]; then 
        # скрипт переинициализации правил фаерволла  
      sh /home/init.sh; 
      /etc/init.d/iptables save;
      /etc/init.d/iptables restart;
fi

»

Благодарю!

Благодарю! На основе этого наваял:


#! /bin/sh

OLDADSL1=0
OLDADSL2=0
OLDADSL3=0
IP=x.x.x.x

while [ 1 ]
do
ping -c 3 -s 100 $IP -I 172.31.255.1 > /dev/null
if [ $? -ne 0 ]; then
echo "ADSL1 down"
NEWADSL1=0
else
echo "ADSL1 up"
NEWADSL1=1
fi

ping -c 3 -s 100 $IP -I 172.31.255.2 > /dev/null
if [ $? -ne 0 ]; then
echo "ADSL2 down"
NEWADSL2=0
else
echo "ADSL2 up"
NEWADSL2=1
fi

ping -c 3 -s 100 $IP -I 172.31.255.3 > /dev/null
if [ $? -ne 0 ]; then
echo "ADSL3 down"
NEWADSL3=0
else
echo "ADSL3 up"
NEWADSL3=1
fi

if (( ($NEWADSL1!=$OLDADSL1) || ($NEWADSL2!=$OLDADSL2) || ($NEWADSL3!=$OLDADSL3) )); then
echo "Change routes"
ip route del default table main
#Добавляем маршрут
else
echo "Do not change routes..."
fi

OLDADSL1=$NEWADSL1
OLDADSL2=$NEWADSL2
OLDADSL3=$NEWADSL3

sleep 10
done

Собственно вопрос как сделать добавление маршрута
ip route add default table main scope global equalize nexthop via 172.31.255.252 nexthop via 172.31.255.253 nexthop via 172.31.255.254

При этом каждый "nexthop via 172.31.255.25*" должен присутствовать или отсутствовать в зависимости от значения переменной NEWADSL* (1 - присутствует, 0 - отсутствует)

»

Решил... Может и

Решил... Может и не оптимально, но работает...

#! /bin/sh

OLDADSL1=0
OLDADSL2=0
OLDADSL3=0

while [ 1 ]
do
ping -c 3 -s 100 195.54.2.1 -I 172.31.255.1 > /dev/null
if [ $? -ne 0 ]; then
echo "ADSL1 down"
NEWADSL1=0
else
echo "ADSL1 up"
NEWADSL1=1
fi

ping -c 3 -s 100 195.54.2.1 -I 172.31.255.2 > /dev/null
if [ $? -ne 0 ]; then
echo "ADSL2 down"
NEWADSL2=0
else
echo "ADSL2 up"
NEWADSL2=1
fi

ping -c 3 -s 100 195.54.2.1 -I 172.31.255.3 > /dev/null
if [ $? -ne 0 ]; then
echo "ADSL3 down"
NEWADSL3=0
else
echo "ADSL3 up"
NEWADSL3=1
fi

if (( ($NEWADSL1!=$OLDADSL1) || ($NEWADSL2!=$OLDADSL2) || ($NEWADSL3!=$OLDADSL3) )); then
echo "Change routes"
ip route del default table main

if (( $NEWADSL1 )); then
GW1='nexthop via 172.31.255.252'
else
GW1=''
fi
if (( $NEWADSL2 )); then
GW2='nexthop via 172.31.255.253'
else
GW2=''
fi
if (( $NEWADSL3 )); then
GW3='nexthop via 172.31.255.254'
else
GW3=''
fi

ip route add default table main scope global equalize $GW1 $GW2 $GW3
else
echo "Do not change routes..."
fi

OLDADSL1=$NEWADSL1
OLDADSL2=$NEWADSL2
OLDADSL3=$NEWADSL3

sleep 10
done

»

Странно. У меня

 

Странно. У меня pppd сам переподключается и на клиентских машинах разрывы связи почти не видны.

»

это если

 

это если интервал небольшой, а если полчасика - он падает

»

Про pppd речи

 

Про pppd речи даже не было, pppoe сессию устанавливает сам модем. а роутер всего лишь прописывает на него шлюз

 

#!/bin/sh GW1="ip1" GW2="ip2"

 

#!/bin/sh

GW1="ip1"
GW2="ip2"

IF1=eth1
IF2=eth0

rm -f /var/lock/prov1_down.id
rm -f /var/lock/prov2_down.id
rm -f /var/lock/prov1_up.id
rm -f /var/lock/prov2_up.id
rm -f /var/lock/prov1_checking.id
rm -f /var/lock/prov2_checking.id
rm -f /var/lock/prov1_nowup.id
rm -f /var/lock/prov2_nowup.id

while : ; do
check_real_gates()
{
if ping -I $IF1 -c5 -l5 -W2 $GW1 2>&1 | grep "100% packet loss" > /dev/null ;
then rm -f /var/lock/prov1_up.id ;
fi

if ping -I $IF2 -c5 -l5 -W2 $GW2 2>&1 | grep "100% packet loss" > /dev/null ;
then rm -f /var/lock/prov2_up.id ;
fi

if [ -f /var/lock/prov1_down.id ] ;
then touch /var/lock/prov1_checking.id ;
fi

if [ -f /var/lock/prov2_down.id ] ;
then touch /var/lock/prov2_checking.id ;
fi

if [ -f /var/lock/prov1_checking.id ] && [ -f /var/lock/prov1_up.id ] ;
then rm -f /var/lock/prov1_checking.id ; touch /var/lock/prov1_nowup.id ;
fi

if [ -f /var/lock/prov2_checking.id ] && [ -f /var/lock/prov2_up.id ] ;
then rm -f /var/lock/prov2_checking.id ;touch /var/lock/prov2_nowup.id ;
fi

if [ -f /var/lock/prov1_nowup.id ] && [ -f /var/lock/prov2_up.id ] ;
then rm -f /var/lock/prov1_nowup.id ;rm -f /var/lock/prov2_nowup.id ;/etc/rc.d/rc.routing ;
fi

if [ -f /var/lock/prov2_nowup.id ] && [ -f /var/lock/prov1_up.id ] ;
then rm -f /var/lock/prov2_nowup.id ;rm -f /var/lock/prov1_nowup.id ;/etc/rc.d/rc.routing ;
fi

if ping -I $IF1 -c5 -l5 -W2 $GW1 2>&1 | grep "64 bytes from" > /dev/null ;
then rm -f /var/lock/prov1_down.id ;touch /var/lock/prov1_up.id ;
fi

if ping -I $IF2 -c5 -l5 -W2 $GW2 2>&1 | grep "64 bytes from" > /dev/null ;
then rm -f /var/lock/prov2_down.id ;touch /var/lock/prov2_up.id ;
fi

if [ -f /var/lock/prov1_down.id ] ;
then return ;
fi

if [ -f /var/lock/prov2_down.id ] ;
then return ;
fi

if ping -I $IF1 -c5 -l5 -W2 $GW1 2>&1 | grep "100% packet loss" > /dev/null && ping -I $IF2 -c5 -l5 -W2 $GW2 2>&1 | grep "100
% packet loss" > /dev/null ;
then echo WARNING TWO GATEWAYS Is DOWN!!! ;/etc/rc.d/rc.hotpart2 ; exit;
elif ping -I $IF1 -c5 -l5 -W2 $GW1 2>&1 | grep "100% packet loss" > /dev/null ;
then rm -f /var/lock/prov1_up.id ;touch /var/lock/prov1_down.id ;/etc/rc.d/rc.prov2 ;
elif ping -I $IF2 -c5 -l5 -W2 $GW2 2>&1 | grep "100% packet loss" > /dev/null ;
then rm -f /var/lock/prov2_up.id ;touch /var/lock/prov2_down.id ;/etc/rc.d/rc.prov1 ;
fi
}

check_real_gates
sleep 3
done

»