Автор Тема: автопереключение на резервный канал интернет  (Прочитано 2536 раз)

Оффлайн rits

  • Завсегдатай
  • *
  • Сообщений: 1 031
  • ITS
Подскажите. кто нибудь использует программное переключение сети на резервный шлюз интернета. Поделитесь опытом.
Вот мой пробный вариант пока еще на стадии тестирования. Советы приветствуются.

В сети 192.168.8.0/24 имеется два шлюза с интернетом 1 (192.168.8.1) и с  интернетом 2 (192.168.8.12)
интернет 1 (192.168.8.1) - основной
интернет 2 (192.168.8.12) - резервный
Скрипт испытывал на резервном шлюзе (192.168.8.12), сеть управляется с помощью etcnet

Настройка сети на 192.168.8.12 шлюзе:
# ip -4 a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ether1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 192.168.88.12/24 brd 192.168.88.255 scope global ether1
       valid_lft forever preferred_lft forever
3: ether0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 192.168.8.12/24 brd 192.168.8.255 scope global ether0
       valid_lft forever preferred_lft forever
# ip -4 r s
default via 192.168.88.1 dev ether1 metric 10
default via 192.168.8.1 dev ether0 metric 5
192.168.0.0/16 via 192.168.8.1 dev ether0
192.168.8.0/24 dev ether0 proto kernel scope link src 192.168.8.12
192.168.88.0/24 dev ether1 proto kernel scope link src 192.168.88.12

Скрипт прописан в crontab и опрашивается каждую минуту.
# crontab -l
*/1 * * * * /var/adm/crons/chgw
Сам скрипт:
#!/bin/bash
#При пропадании канала у основного провайдера автоматически переключаемся
#на резервного и переодически проверяем наличие канала у первого
#провайдера. Как только интернет появляется у первого провайдера сразу
#переключаемся на него. Трафик идет по шлюзу с меньшей метрикой по этому
#меняем только метрику основного канала.

#GW1=IP_шлюза_основного_провайдера metric 5
GW1=192.168.8.1

#GW2=IP_шлюза_резервного_провайдера metric 10
GW2=192.168.88.1

# метрика шлюзов по умолчанию
DEFMETRIC1=$(ip r s | grep "default via $GW1" | cut -f7 -d " ")
DEFMETRIC2=$(ip r s | grep "default via $GW2" | cut -f7 -d " ")

# Interfaces
#iface..=основного_провайдера
ifaceun=ether0

#iface..=резервного_провайдера
ifacemg=ether1

# Удаленный адрес для проверки на доступность
srctest=77.88.8.1

# Пинг тест через сетевой интерфейс основного провайдера
result1=$(ping -c 3 -I $ifaceun $srctest -W 1  2<&1 | grep -icE 'unknown|expired|unreachable|time out|100% packet loss')

if [ ${result1} != 0 ] && [ $DEFMETRIC1 -lt $DEFMETRIC2 ]; then
echo "Перейти на резервный канал"
/sbin/ip route del default via $GW1
/sbin/ip route add default via $GW1 metric 15
ip route flush cache
#/etc/init.d/bind restart >> /dev/null
service openvpn restart
fi

if [ ${result1} = 0 ] && [ $DEFMETRIC1 -gt $DEFMETRIC2 ]; then
echo "вернуться на основной канал"
/sbin/ip route del default via $GW1
/sbin/ip route add default via $GW1 metric 5
ip route flush cache
#/etc/init.d/bind restart >> /dev/null
service openvpn restart
fi

Еще интересен такой момент:
Цитировать
# Пинг тест через сетевой интерфейс основного провайдера
result1=$(ping -c 3 -I $ifaceun $srctest -W 1  2<&1 | grep -icE 'unknown|expired|unreachable|time out|100% packet loss')
Этот пинг тест в интернете подсмотрел.
Можно, как то еще упростить скрипт и какие могут быть еще проверки доступности тестового хоста?
« Последнее редактирование: 29.09.2021 14:21:41 от rabochyITs »

Оффлайн yaleks

  • Мастер
  • ***
  • Сообщений: 6 222
а не надежнее детектировать рост числа ретрансмиссий и потерь пакетов? Это должно быстрее говорить о необходимости смены канала....

Оффлайн rits

  • Завсегдатай
  • *
  • Сообщений: 1 031
  • ITS
а не надежнее детектировать рост числа ретрансмиссий и потерь пакетов? Это должно быстрее говорить о необходимости смены канала....
Каким образом это сделать ( пример кода), чтобы переменная ${result1} получила число не равное нулю?

Оффлайн genand1947

  • Давно тут
  • **
  • Сообщений: 225
Поменялся адрес шлюза: был 192.168.0.1   ,  стало  192.168.1.1
Что можно сделать так, чтобы  не менять адрес рабочей станции для работы интернета. Например 192.168.0.50 - оставить таким же.  Сейчас временно поставил 192.168.1.50.
 (в сети есть сервер домена на AltLinux, все станции altlinux)

Оффлайн rits

  • Завсегдатай
  • *
  • Сообщений: 1 031
  • ITS
Поменялся адрес шлюза: был 192.168.0.1   ,  стало  192.168.1.1
Что можно сделать так, чтобы  не менять адрес рабочей станции для работы интернета. Например 192.168.0.50 - оставить таким же.  Сейчас временно поставил 192.168.1.50.
 (в сети есть сервер домена на AltLinux, все станции altlinux)

Если у тебя альты и одна машина, то самое простое, на мой взгляд, добавить второй виртуальный ip при загрузке. Из консоли
# ip addr add 192.168.1.10/24 dev ethX-твое_значение
и остаться в 192.168.0.50

Оффлайн rits

  • Завсегдатай
  • *
  • Сообщений: 1 031
  • ITS
Доработал скрипт переключения на резервный шлюз.

Роутинг после первого запуска системы.
# ip r s
default via 192.168.88.1 dev ether1 metric 5
default via 192.168.8.1 dev ether0 metric 10
192.168.0.0/16 via 192.168.8.1 dev ether0
192.168.8.0/24 dev ether0 proto kernel scope link src 192.168.8.12
192.168.88.0/24 dev ether1 proto kernel scope link src 192.168.88.12

#!/bin/bash
#При пропадании канала у основного провайдера автоматически переключаемся
#на резервного и переодически проверяем наличие канала у первого
#провайдера. Как только интернет появляется у первого провайдера сразу
#переключаемся на него

#GW1=IP_шлюза_основного_провайдера_первый_запуск metric 5
# default via 192.168.88.1 dev ether1 metric 5
GW1=192.168.88.1

#GW2=IP_шлюза_резервного_провайдера_первый_запуск metric 10
# default via 192.168.8.1 dev ether0 metric 10
GW2=192.168.8.1

# Interfaces
#iface..=основного_провайдера
iface1=ether1

#iface..=резервного_провайдера
iface2=ether0

# Удаленный адрес для проверки на доступность
srctest=77.88.8.1

# Шлюз установленный по умолчанию
ROUTESTR1=$(ip r s | grep "default via $GW1" | sed -n '/metric/p')
ROUTESTR2=$(ip r s | grep "default via $GW2" | sed -n '/metric/p')

if [ -z "$ROUTESTR1" ] || [ -z "$ROUTESTR2" ]; then
echo "${iface1}_metric=$DEFMETRIC1 ${iface2}_metric=$DEFMETRIC2"
echo "Метрика шлюза не определена, проверте наличие правильного роутинга 'ip r s'"
exit 1
fi

# ${ROUTESTR1##*"metric "} - Удаление с начала строки, до последнего совпадения
DEFMETRIC1=$((${ROUTESTR1##*"metric "} | cut -f1 -d " "))
DEFMETRIC2=$((${ROUTESTR2##*"metric "} | cut -f1 -d " "))

# Пинг тест через сетевой интерфейс основного провайдера
result1=$(ping -c 3 -I $iface1 $srctest -W 1  2<&1 | grep -icE 'unknown|expired|unreachable|time out|100% packet loss')

if [ ${result1} != 0 ] && [ $DEFMETRIC1 -lt $DEFMETRIC2 ]; then
echo "Перейти на резервный канал"
#/sbin/ip route change default via $GW2
/sbin/ip route del default via $GW1
/sbin/ip route del default via $GW2
/sbin/ip route add default via $GW1 metric 10
/sbin/ip route add default via $GW2 metric 5
ip route flush cache
#/etc/init.d/bind restart >> /dev/null
#service openvpn restart
fi

if [ ${result1} = 0 ] && [ $DEFMETRIC1 -gt $DEFMETRIC2 ]; then
echo "Перейти на основной канал"
/sbin/ip route del default via $GW1
/sbin/ip route del default via $GW2
/sbin/ip route add default via $GW1 metric 5
/sbin/ip route add default via $GW2 metric 10
ip route flush cache
#/etc/init.d/bind restart >> /dev/null
#service openvpn restart
fi
« Последнее редактирование: 30.09.2021 13:20:03 от rabochyITs »