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

от автора

Решил написать, так как в основном есть статьи по резервированию основного 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:\Users\calc>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:\Users\calc>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:\Users\calc> 

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

ссылка на оригинал статьи http://habrahabr.ru/post/170169/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *