Подскажите. кто нибудь использует программное переключение сети на резервный шлюз интернета.
Поделитесь опытом. Вот мой пробный вариант пока еще на стадии тестирования.
Советы приветствуются.В сети 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 s1: 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 sdefault 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')
Этот пинг тест в интернете подсмотрел.
Можно, как то еще упростить скрипт и какие могут быть еще проверки доступности тестового хоста?