Резервный канал на linux

Автоматическое переключение на резервный интернет-канал на шлюзе небольшого офиса

Для начала уточним (на всякий случай) как именно привязать ppp-соединение к ppp-интерфейсу с конкретным номером. Для этого нужно в соответствующий файле в «/etc/ppp/peers&quto; добавить строку:

Далее добавим ещё один параметр в тот же файл: метку соединения:

Кроме того этот интерфейс не должен при подъёме трогать маршрут по умолчанию. Это достигается примерно вот так:

# Следующие строки закомментированы чтобы не трогать маршрут по умолчанию #defaultroute #replacedefaultroute

Это нам пригодиться чуть позже. Сейчас нам нужно описать две дополнительные таблицы роутинга (по одной для каждого провайдера). Для этого в файл «/etc/iproute2/rt_tables» добавим следующие строки:

190 net_tbt 195 net_tattelecom

Теперь нам надо явно указать с какого интерфейса через какую таблицу роутинга искать маршруты. Для этого нужно выполнить вот такие команды (и заодно добавить в «/etc/rc.local» чтобы выполнялись при загрузке):

/sbin/ip rule add from 1.1.1.2 lookup net_tattelecom pref 20000 /sbin/ip rule add from 2.2.2.2 lookup net_tbt pref 20000

Разумеется надо чтобы в нужных таблицах были и нужные маршруты (как минимум маршрут по умолчанию). Для резервного канала это достигается созданием скрипта «/etc/ppp/ip-up.d/tbt» примерно такого содержания:

#!/bin/sh # Если это подключение к ТВТ (вот тут пригождается ipparam!) if [ $ = "tbt" ]; then # Заворачиваем трафик через этот интерфейс для соответствующей таблицы /sbin/ip route add default dev $ table net_tbt fi

Для eth0 всё ещё проще: открываем файл «/etc/network/interfaces» и приводим конфигурацию eth0 к такому виду:

auto eth0 iface eth0 inet static address 1.1.1.2 netmask 255.255.255.0 gateway 1.1.1.1 dns-nameservers 127.0.0.1 metric 100 post-up /sbin/ip route add default via 1.1.1.1 table net_tattelecom

Теперь нужно перезагрузить сервер и после этого сервер будет по умолчанию идти в интернет через eth0, но при этом снаружи будет доступен по обоим каналам. Теперь создадим скрипт «/usr/local/scripts/check_internet.sh» следующего содержания:

#!/bin/sh # Доступность этого хоста будет означать корректную работу оснвного канала # 8.8.8.8 это DNS от Google. За его доступность можно не беспокоиться # А значит вероятность ложного срабатывания минимальна HOST="8.8.8.8" # Файл-флаг. Появляется при переключении на резервный канал LOCKFILE="/tmp/check_internet.lock" # Файл журнала LOGFILE="/var/log/check_internet.log" # Пингуем проверочный хост через основной канал ping -I 1.1.1.2 -c 3 -n -q $ > /dev/null # Если возникла ошибка (хост не доступен) if [ $? -ne "0" ]; then # Если нет файла-флага if [ ! -f $ ]; then # Меняем маршрут по умолчанию в основной таблице роутинга ip route del default ip route add default dev ppp999 metric 100 # Создаём файл флаг touch $ # Делаем запись в файл журнала echo `date +'%Y/%m/%d %H:%M:%S'` Internet connection changet to TBT >> $ fi # Если же всё хорошо else # Если есть файл-флаг if [ -f $ ]; then # Меняем маршрут по умолчанию в основой таблице роутинга ip route del default ip route add default via 1.1.1.1 metric 100 # Удаляем файл-флаг rm -f $ # Записываем событие в файл журнала echo `date +'%Y/%m/%d %H:%M:%S'` Internet connetction changed to TatTeleCom >> $ fi fi

Этот скрипт нужно запускать каждую минуту. Для этого в «/etc/crontab» нужно добавить строку:

* * * * * root /usr/local/scripts/check_internet.sh

Далее ещё нужно включить пересылку пакетов (forwarding) и поднять NAT для локальной сети на обоих интерфейсах. Примеры можно найти например тут и тут.

Читайте также:  Midnight commander linux mint

На этом всё. Приятной работы!

Источник

2 канала инета, скрипт автопереключения на резервный и обратно

Тут есть подобные темы, но «боевых» вариантов так и не нашёл, поэтому можете кидаться яйцами и помидорами, но добавлю свои 3 копейки.

— основной канал со статическим ip, имя интерфейса ens19

— резервный канал динамический, имя интерфейса wwx0c5b8f279a64 (да, это модем)

— метрика роута для основного канала по умолчанию 100

— метрика роута для резервного канала по умолчанию 700

— последовательно добавляем, проверяем и удаляем маршруты до тестируемых узлов, это сделано потому, что при поднятии резервного канала пакеты даже при указании ping -I «net» не пойдут через основной канал

— если все 9 пакетов icmp потерялись, то включаем роут через резервный канал с метрикой 50 и присваиваем переменной gw2 значение off

— если хоть до одного из 3 узлов все ответы пришли, то проверяем переменную gw2, если она on, то на паузу и далее по кругу. Если она off, то удаляем маршрут с метрикой 50 и присваиваем переменной gw2 значение on и далее на круг

Пауза проверки основного канала 20+9, основного (при включенном резервном) 300+9 (сек)

Сам скрипт (/etc/auto_net_switch.sh):

#!/bin/bash # Основные переменные # gw2 - шлюз резервного канала, состояние on или off, default=off # net1 - имя сетевого интерфейса основного канала # net2 - имя сетевого интерфейса резервного канала # net1_gw_ip - ip адрес шлюза основного канала # net2_gw_ip - ip адрес шлюза резервного канала динамический, поэтому определяем его каждый цикл # net2_ip - ip адрес сетевой карты резервного канала динамический, поэтому определяем его каждый цикл # ip1 - ip адреса узлов для проверки соединения основного канала # Изменить нужно только эти 5 переменных: net1=ens19 net2=wwx0c5b8f279a64 ip1="1.1.1.1" ip2="2.2.2.2" ip3="3.3.3.3" # Далее переменные менять не надо gw2=off net1_gw_ip=`ip route | awk '/'$net1'.*static/ < print $3 >'` # Файл логов logfile=/var/log/net_switch.log echo `date +%Y.%m.%d__%H:%M:%S`' Скрипт автопереключения канала запущен' >> $ # бесконечный цикл while [ true ]; do net2_gw_ip=`ip route | awk '/default.*'$net2'/ < print $3 >'` net2_ip=`ifconfig | grep $net2 -A1 | grep -E "(4\.)3" | awk '< print $2 >' | cut -f2 -d:` route add $ip1 gw $net1_gw_ip result1=$(ping -c 3 -I $ -W 1 $ 2 <&1| grep -icE 'unknown|expired|unreachable|time out|100% packet loss') route del $ip1 route add $ip2 gw $net1_gw_ip result2=$(ping -c 3 -I $-W 1 $ 2 <&1| grep -icE 'unknown|expired|unreachable|time out|100% packet loss') route del $ip2 route add $ip3 gw $net1_gw_ip result3=$(ping -c 3 -I $-W 1 $ 2<&1| grep -icE 'unknown|expired|unreachable|time out|100% packet loss') route del $ip3 if [[ $result1 == 0 && $result2 == 0 && $result3 == 0 ]]; then if [[ $gw2 == on ]]; then route del -net default gw $net2_gw_ip metric 50 dev $net2 ip route flush cache real_ip=`wget -q -O /dev/stdout http://checkip.dyndns.org/ | awk '< print $6 >' | cut -d \< -f1` echo `date +%Y.%m.%d__%H:%M:%S`' Основной канал активирован, внешний ip' $real_ip >> $ gw2=off fi sleep 20 else if [[ $gw2 == off ]]; then route add -net default gw $net2_gw_ip metric 50 dev $net2 ip route flush cache real_ip=`wget -q -O /dev/stdout http://checkip.dyndns.org/ | awk '< print $6 >' | cut -d \< -f1` echo `date +%Y.%m.%d__%H:%M:%S`' Основной канал деактивирован, включен резевный канал, внешний ip' $real_ip >> $ gw2=on fi sleep 300 fi done 

Даём права на исполнение и закидываем в автозагрузку крона

sudo chmod 700 /etc/auto_net_switch.sh sudo sh -c 'echo "@reboot root sleep 120; /etc/auto_net_switch.sh" >> /etc/crontab' 

Источник

Читайте также:  Linux root get user password

Резервный канал на linux

Сейчас я вкратце опишу, как я сделал у себя резервирование Интернет каналов на Debian.

Основной скрипт, который мониторит доступность интернета и переключает маршруты выглядит так:

####################################################################################################################
#!/bin/bash
# Доступность этого хоста будет означать корректную работу основного канала
HOST=»8.8.4.4″
# Файл-флаг. Появляется при переключении на резервный канал
LOCKFILE=»/tmp/internet.lock»
# Файл журнала
LOGFILE=»/var/log/internet.log»
# Пингуем проверочный хост через основной канал
ping -I eth0 -c 3 -n -q $ > /dev/null
# Если возникла ошибка (хост не доступен)
if [ $? -ne «0» ]; then
# Если нет файла-флага
if [ ! -f $ ]; then
# Меняем маршрут по умолчанию в основной таблице роутинга
/root/route_3g
# Создаём файл флаг
touch $
# Делаем запись в файл журнала
echo `date +’%Y/%m/%d %H:%M:%S’` Internet connection changed to 3G >> $
fi
# Если же всё хорошо
else
# Если есть файл-флаг
if [ -f $ ]; then
# Меняем маршрут по умолчанию в основой таблице роутинга
/root/route_lan
# Удаляем файл-флаг
rm -f $
# Записываем событие в файл журнала
echo `date +’%Y/%m/%d %H:%M:%S’` Internet connetction changed to LAN >> $
fi
fi
################################################################

Скрипты изменения маршрута:

route add default gw 10.0.0.1

И сам скрипт, который мы закинем в cron (он будет каждые 5 секунд проверять доступность назначенного узла):

# cat ./inet_check
while (true)
do /root/reserv_chan;
sleep 5;
done;

Запишем его в cron:
# crontab -e

На всякий случай в я прописал в /etc/network/interfaces

up route add -net 8.8.4.4/32 gw 192.168.1.1 dev eth0

Чтобы наш проверочный хост (8.8.4.4) пинговался именно через eth0, хоть эту и указывается в скрипте (ping -I eth0)

Главное, что в /etc/network/interfaces у нас 192.168.1.1 был просто gateway, а не defaultgateway. Иначе нужно будет изменять переключающие скрипты. Вот и все. Теперь при пропадании 8.8.4.4 на eth0 мы переключимся на 3G и обрачно, когда интернет появится на канале Lan.

Источник

Скрипт переключения каналов интернет Debian Linux

В 2016 году я писал о скрипте, который использую на FreeBSD-роутере для переключения основного канала интернет на резервный.

cat internet off, кот отключили интернет

Не так давно (в 2019 году) один из линуксоидов переделал скрипт для использования в Linux Debian, и я решил опубликовать его у себя, чтобы вам было проще и не нужно было искать аналоги команд для Linux при адаптации. Так как Linux все-таки больше распространено плюс лучше работает в виртуальных системах и новые проекты я уже давно делаю на Linux, обычно это Debian.

Читайте также:  Linux режим работы процессора

В скрипте я ничего не менял, даже IP-адреса Яндекс (некоторые его очень не любят), конечно нужно указать адреса тех сервисов, которые авторитетны и доступны именно для вас.

#!/bin/sh # Основной Оптика GW1=10.0.0.2 # Резервный Радио GW2=10.0.0.3 # Устанавливаем в переменную время и дату в нужном нам формате DT=`date +"%T %d.%m.%Y"` # Для проверки каналов интернет на работоспособность используем пинг на сервисы Yandex, разные IP для разных каналов # вы можете использовать свои эталонные адреса для проверки # Проверяем добавлены ли маршруты на эталонные IP для проверки, если нет, то добавляем check_node=`netstat -rn | grep "77.88.8.1" | awk ''` if [ "$check_node" != "77.88.8.1" ]; then # добавляем маршрут для Яндекса через оптику для проверки /sbin/route add 77.88.8.8 $GW1 # через Радио /sbin/route add 77.88.8.1 $GW2 else fi # Проверяем, если включен основной интернет и файл состояния установлен на резервный канал, то стираем файл состояния # Такая ситуация может возникнуть, например, если сервер был на резервном и потом его резко выключили, # А после включения опять включился основной канал (маршрут по-умолчанию) check_gw=`netstat -rn | grep default | awk ''` if [ "$check_gw" = "10.0.0.2" ]; then if [ -f /tmp/.inet_reserv_work ]; then /bin/rm /tmp/.inet_reserv_work /bin/echo Стираем файл .inet_reserv_work $DT, так как шлюз $GW1, а не резервный $GW2! >> /data/scripts/inet_change.log else fi else fi # Проверяем работает ли основной канал is=`/sbin/ping -c 7 77.88.8.8 | grep -c "64 bytes"` if (/bin/test $is -gt "4") then # Если основной канал работает и файл состояния резервного канала существует, то стираем файл состояния и переключаемся # на основной канал, пишем запись в лог и отправляем письмо администратору о переключении if [ -f /tmp/.inet_reserv_work ]; then /sbin/route change default $GW1 /bin/rm /tmp/.inet_reserv_work /bin/echo Основной канал [Оптика] включен $DT >> /data/scripts/inet_change.log echo "$DT Переключились на Оптику" | mail -s "Интернет переключился" [email protected] -f [email protected] else exit fi else # Если основной не работает, то проверяем резервный и переключаемся на него is2=`/sbin/ping -c 7 77.88.8.1 | grep -c "64 bytes"` if (/bin/test $is -gt "4" || /bin/test $is2 -gt "4") then if ! [ -f /tmp/.inet_reserv_work ]; then /sbin/route change default $GW2 /usr/bin/touch /tmp/.inet_reserv_work /bin/echo Резервный канал [Радио] включен $DT >> /data/scripts/inet_change.log echo "$DT Переключились на Радио" | mail -s "Интернет переключился" [email protected] -f [email protected] fi fi

Добавляем скрипт в планировщик крон.

### Переключение каналов */1 * * * * root cd /data/ && ./inet_change.sh > 1>/dev/null 2>&1

Спасибо за linux-версию скрипта ссылка

Фразы: как переключать интернет на резервный автоматически в Linux, Линукс и резервный интернет, доработанный скрипт переключения каналов.

P.S. Давно не было острой необходимости в резервировании каналов, так как сейчас уже во многие офисные здания приходит оптика от провайдера, такие подключения являются более скоростными и стабильными, однако проблемы все равно бывают.

Поэтому рекомендую познакомится с технологией OpenMPTCProuter, которая позволяет использование нескольких каналов интернет одновременно.

И это действительно честное «одновременное», не такое как у многих производителей оборудования с мульти WAN портами.

Источник

Оцените статью
Adblock
detector