Домашний/проводной интернет с резервным каналом по 3g

в 0:02, , рубрики: OpenWrt, интернет, Сетевое оборудование, метки: ,

Решил написать, так как в основном есть статьи по резервированию основного 3g канала на другой, а 3g как резервный при проводном интернете — почему то сложно найти.

Была поставлена задача организовать людям резервирование доступа в интернет с автоматическим переключением канала.

Покопав интернет, были найдены устройства с поддержкой 3g «свистков». Выбор был из Zyxel Keenetic, drytek и TP-Link (но всю жизнь работали с Asus и D-Link по объективным причинам и собственным статистическим данным). По опыту решения «всяких» задач, выбор пал на TP-Link. Выбрать было просто, Open WRT дружит со всеми TP-Link'ами (запасной вариант). Так же требования по 3g связи. Предоставили мне Huawei E367 от мегафона.

Коробка попала ко мне в руки. (описывать ее не буду, описаний много, сразу к делу). Приятные плюшки от TP-Link'а радовали всегда. В «поле» он у нас ни когда не тестился. Работа всегда велась с более стабильными роутерами. Но Open WRT в данном вопросе — перевесил все сомнения. И как оказалось — не зря, но об этом позже.

Базовая прошивка, базовая настройка, Wan preffered, запуск, тест. Эмуляция «сетевой кабель не подключен» работает на ура. В обе стороны как надо переключается канал. Но мы то знаем, что «падения» бывают не только на «крыше», но и дальше. Кто то что то копал, задел кабель, порвал. Свитч жив, линк по кабелю жив, роутер «думат» что всё ок. Нас это не устраивает.

Задача:
1) TP-LINK TL-MR3420 V2
2) 3g интернет Мегафон Huawei E367
3) Провайдер с настройками по Static IP и проводом с RJ-45

Сразу оговорюсь, что статья не для новичков, вы должны осознавать всё то, что вы делае

Обшарив прошивку — нужного нам не нашли. Да и прошивка отключает 3g если он не используется, так что переход на 3g занимает довольно много времени, пока включится, пока идентифицирует «свисток», пока подключится, проходит где то минута, полторы в лучшем случае.

Значит Open WRT. TP-Link обновил железо, официальной прошивки нет, но где то с 13 января 2013 года много положительных отзывов об использовании этого роутера на прошивках OpenWRT. Качаем, пробуем, завелась. (как шить Open WRT можно найти в интернете).

Далее настройка по шагам

Этап 1. Веб морда.
Заходим 192.168.1.1
root

image

Шаг 1.
Настройка провайдера — Static IP, всё интуитивно понятно, заработало сразу. IP, Маска, шлюз, 2 DNS. Advanced Settings — Use gateway metric ставим 20, не нужно спрашивать почему, не отвечу. Надо) Всё что угодно, отличное от 0.
Firewall Settings оставляем в wan

Шаг 2.
Настройка 3g.
UMTS/GPRS/EV-DO
/dev/ttyUSB0
UMTS/GPRS
APN: internet
username: megafon
password: megafon
Advanced Settings — Use gateway metric ставим 10.
Firewall Settings создаем зону wan_3g

image

Шаг 3.
Настройка lan
Делаем как нравится.

Все интерфейсы должны включаться при загрузке роутера (Bring up on boot)

Шаг 4.
Network – Firewall
Редактируем lan, Inter-Zone Forwarding добавляем и wan, и wan_3g.
Это избавит нас от головной боли с фаерволом (я не дружу с iptables)
для зоны wan_3g копируем галочки с зоны wan.

image

Шаг 5.
System — Scheduled Tasks
*/1 * * * * /etc/config/rezerv/t5t > /dev/null

image

Это наш скрипт проверки связи, запускается раз в минуту.
О файлах — ниже, сначала вебморда.

Шаг 6.
Имена хостов
Так как интернет домашний, или нам могут понадобиться другие наши хосты — добавляем то, что нам нужно.
Шаг важный. Для теста мы выбрали www.ru, будем его пинговать
Создаем хост alltimeallivehost.lan и берем IP с www.ru -194.87.0.50.
alltimeallivehost.lan — будет участвовать в проверке.

image

С мордой вроде бы всё.

Этап 2 SSH
берем putty, заходим 192.168.1.1

root@OpenWrt:~# cd /etc/config/
root@OpenWrt:/etc/config# mkdir rezerv
root@OpenWrt:/etc/config# cd ./rezerv

создаем файлики:

root@OpenWrt:/etc/config/rezerv# cat > имя_файла

Копируем текст
жмем Ctrl + Z
Файл создан.
Моя папка выглядит так:

root@OpenWrt:/etc/config/rezerv# ls -l
-rwxrwxrwx    1 root     root           190 Feb 19 20:49 3g_on
-rwxrwxrwx    1 root     root           186 Feb 19 21:14 t5t
-rwxrwxrwx    1 root     root          1136 Feb 20 13:44 test_sh
-rw-r--r--    1 root     root             0 Feb 20 13:44 wan
-rwxrwxrwx    1 root     root           100 Feb 20 12:13 wan_on

3g_on, wan_on, t5t, test_sh – исполняемые файлы
делаются так:

root@OpenWrt:/etc/config/rezerv# chmod 777 файл

Теперь алгоритм и файлы.
wan_on – включает wan интерфейс.
3g_on – включает 3g интерфейс.
test_sh – основной алгоритм работы
t5t – вызов test_sh 5 раз. (он же выше указывался в cron, System — Scheduled Tasks)

t5t:

/etc/config/rezerv/test_sh; sleep 8;
/etc/config/rezerv/test_sh; sleep 8;
/etc/config/rezerv/test_sh; sleep 8;
/etc/config/rezerv/test_sh; sleep 8;
/etc/config/rezerv/test_sh; sleep 8;

2 секунды на проверку, спим 8 секунд, итого 50 секунд. Всё прозрачно.

wan_on:

#wan
/sbin/ifconfig 3g-3g down
#ifconfig eth0 up
/sbin/route add default gw 10.112.28.253 metric 0

Файлик опускает один интерфейс и подымает второй, но! Нам eth0 нужен постоянно живым, что бы понять — поднялся основной канал или нет. По этому мы его не подымаем. (строка за комментирована). Дальше будет понятно почему.

3g_on:

#3g - vklu4aem 3g
/sbin/ifconfig eth0 down
/sbin/ifconfig 3g-3g up
/sbin/route add default gw 10.64.64.64 metric 0
/sbin/ifconfig eth0 up
/sbin/route add default gw 10.112.28.253 metric 20

Отключаем eth0, при отключении все маршруты интерфейса обнуляются, поднимаем 3g, прописываем маршрут для 3g, подымает eth0. Тут eth0 прописывает маршрут default с метрикой 20 (смотрите Этап 1, вебморда), и у нас 2 маршрута default с разными метриками.
Ну и дописываем маршрут, так как он все равно куда то терялся.

wan – файл флаг, говорит о том, что у нас проводной интернет в данный момент.

Последний файл — основной скрипт:

test_sh
root@OpenWrt:/etc/config/rezerv# cat test_sh
#!/bin/sh

#blok1
DIR=/etc/config/rezerv/
#DIR=/home/calc/rezerv/
ROUTE=/sbin/route
GREP=/bin/grep
RM=/bin/rm
TOUCH=/bin/touch

#blok2
#tested address www.ru
#WWW_RU=194.87.0.50
WWW_RU=alltimeallivehost.lan

#blok3
#flags
F3G=3g
FWAN=wan
FCUR=$FWAN

#blok4
#on
ON_3G=3g_on
ON_WAN=wan_on
ON_DEF=$ON_WAN

#blok5
#def routines
R_WAN=10.112.28.253
R_3G=10.64.64.64
R_CUR=$R_WAN

#blok6
#proverka flagov
if [ ! -f $DIR$F3G ]; then
  if [ ! -f $DIR$FWAN ]; then
    echo "no one file exist, use default iface"
    echo $DIR$ON_DEF
  else
    R_CUR=$R_WAN
    FCUR=$FWAN
  fi
else
  R_CUR=$R_3G
  FCUR=$F3G
fi

#blok7
#proverka tekushego marshruta
if [ "$ROUTE | $GREP default | $GREP $R_CUR | wc -l" != "0" ]; then
  echo "$FCUR route exist"
else
  echo "add $FCUR route"
  $ROUTE add default gw $R_CUR metric 0
fi

#blok8
#toggle if not work
##PING www.ru
if ping -w3 -c2 -I eth0  $WWW_RU > /dev/null 2>&1; then
  echo "MAIN working";
  if [ -f $DIR$F3G ]; then
    echo "3g used, wan_on"
    $DIR$ON_WAN
    $RM $DIR$F3G
    $TOUCH $DIR$FWAN
  fi
else
  echo "MAIN not working";
  #if [ -f $DIR$FWAN ]; then
    echo "wan used, 3g_on"
    $DIR$ON_3G
    $RM $DIR$FWAN
    $TOUCH $DIR$F3G
  #fi
fi

Блок 1
По опыту работы с разными Linux переменные окружения куда то пропадают, ну бывает, по этому всё в жесткую.

Блок 2
alltimeallivehost.lan — прописывали в морде в хосты.

Блок 3
Файлы — флаги.
Если файл есть, значит этот интерфейс используется.

Блок 4
Скрипты включения интерфейсов

Блок 5
Маршруты, с ними почему то возникали проблемы, по этому раз в 10 секунд будем проверять наличие этих маршрутов и добавлять их при необходимости.

Блок 6
Проверяет вообще наличие флагов, если их нет, то включаем интерфейс по умолчанию (wan, проводной). Так же смотрим какой интерфейс в данный момент используется.

Блок 7
Проверяем наличие маршрута default для используемого подключения, если нет ни одного, то добавляем маршрут.

Блок 8
Основная проверка работоспособности интерфейса.
Если пинтуется наш хост через eth0, то проверяем какой интерфейс включен, если 3g, включаем wan, если wan, ни чего не делаем.
Если не пингуется, и используется интерфейс wan, то включаем интерфейс 3g.

Основная логика готова.

Теперь забиваем последние гвозди.

root@OpenWrt:/etc/config/rezerv# cat /etc/rc.local
# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.

echo $((10*1024*1024)) > /sys/block/zram0/disksize
mkswap /dev/zram0
swapon /dev/zram0

#udalaem flagi
rm /etc/config/rezerv/wan
rm /erc/config/rezerv/3g

exit 0

Т.е. При загрузке роутера удаляем наши флаги.

в /etc/dnsmasq.conf дописываем строку

dhcp-option=lan,6,10.112.1.1,10.112.2.1,8.8.8.8

что бы на интерфейс компьютера сразу выдавались нужные нам dns. Я проблемы с DNS не решал, так оказалось проще и быстрее. Сказался недостаток знаний.

Надо не забыть включить сервис dnsmasq и cron, можно сделать через Веб морду.

Результат работы:

C:Userscalc>ipconfig /all
Ethernet adapter Подключение по локальной сети:

   DNS-суффикс подключения . . . . . : lan
   Описание. . . . . . . . . . . . . : Atheros AR8161/8165 PCI-E Gigabit Etherne
t Controller (NDIS 6.20)
   Физический адрес. . . . . . . . . : 10-BF-48-22-58-64
   DHCP включен. . . . . . . . . . . : Да
   Автонастройка включена. . . . . . : Да
   Локальный IPv6-адрес канала . . . : fe80::d1de:d8aa:f5c4:667b%13(Основной)
   IPv4-адрес. . . . . . . . . . . . : 192.168.1.112(Основной)
   Маска подсети . . . . . . . . . . : 255.255.255.0
   Аренда получена. . . . . . . . . . : 20 февраля 2013 г. 12:11:43
   Срок аренды истекает. . . . . . . . . . : 21 февраля 2013 г. 0:36:25
   Основной шлюз. . . . . . . . . : 192.168.1.1
   DHCP-сервер. . . . . . . . . . . : 192.168.1.1
   IAID DHCPv6 . . . . . . . . . . . : 353419080
   DUID клиента DHCPv6 . . . . . . . : 00-01-00-01-17-6E-9B-C2-10-BF-48-22-58-64

   DNS-серверы. . . . . . . . . . . : 10.112.1.1
                                       10.112.2.1
                                       8.8.8.8
   NetBios через TCP/IP. . . . . . . . : Включен

Схема: Интернет — зона провайдера — свитч — роутер — ноутбук
Рвем связь перед свитчем:

C:Userscalc>ping www.ru -t

Обмен пакетами с www.ru [194.87.0.50] с 32 байтами данных:
Ответ от 194.87.0.50: число байт=32 время=2мс TTL=57
Ответ от 194.87.0.50: число байт=32 время=2мс TTL=57
Ответ от 194.87.0.50: число байт=32 время=2мс TTL=57
#рвем савязь
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Ответ от 194.87.0.50: число байт=32 время=1946мс TTL=47
Ответ от 194.87.0.50: число байт=32 время=78мс TTL=47
Ответ от 194.87.0.50: число байт=32 время=56мс TTL=47
Ответ от 194.87.0.50: число байт=32 время=55мс TTL=47
Ответ от 194.87.0.50: число байт=32 время=64мс TTL=47
Ответ от 194.87.0.50: число байт=32 время=53мс TTL=47
Ответ от 194.87.0.50: число байт=32 время=52мс TTL=47
Ответ от 194.87.0.50: число байт=32 время=61мс TTL=47
Ответ от 194.87.0.50: число байт=32 время=60мс TTL=47
Ответ от 194.87.0.50: число байт=32 время=59мс TTL=47
Ответ от 194.87.0.50: число байт=32 время=57мс TTL=47
Ответ от 194.87.0.50: число байт=32 время=57мс TTL=47
Ответ от 194.87.0.50: число байт=32 время=55мс TTL=47
Ответ от 194.87.0.50: число байт=32 время=54мс TTL=47
#где то тут мы вставили кабель обратно
Ответ от 194.87.0.50: число байт=32 время=62мс TTL=47
Ответ от 194.87.0.50: число байт=32 время=61мс TTL=47
Ответ от 194.87.0.50: число байт=32 время=60мс TTL=47
Ответ от 194.87.0.50: число байт=32 время=59мс TTL=47
Ответ от 194.87.0.50: число байт=32 время=58мс TTL=47
#вернулись на wan
Ответ от 194.87.0.50: число байт=32 время=2мс TTL=57
Ответ от 194.87.0.50: число байт=32 время=2мс TTL=57
Ответ от 194.87.0.50: число байт=32 время=2мс TTL=57

Статистика Ping для 194.87.0.50:
    Пакетов: отправлено = 32, получено = 25, потеряно = 7
    (21% потерь)
Приблизительное время приема-передачи в мс:
    Минимальное = 2мсек, Максимальное = 1946 мсек, Среднее = 120 мсек
Control-C
^C
C:Userscalc>

Устройство стоит 1200 руб.
Хост проверки alltimeallivehost.lan при необходимости меняется в веб морде.
У меня всё.

Автор: Calc

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js