Назад | Перейти на главную страницу

Отказоустойчивость Ubuntu с Ethernet-ADSL-модема на USB-адаптер 3G

У меня есть подключенный к Интернету сервер Ubuntu, подключенный через Ethernet к жилой линии ADSL. В большинстве случаев этого достаточно, но я не могу рассчитывать на то, что связь ADSL будет настолько надежной, насколько мне хотелось бы. Закон Мерфи уже предписал, что время простоя наступает тогда, когда это наименее удобно.

Я хотел бы использовать USB-ключ 3G с оплатой по мере использования для обеспечения аварийного переключения. Мне не хватает информации как об образцах конфигураций, которые подходят другим людям, так и о наиболее подходящем (недорогом) оборудовании для моих целей. Цель состоит в том, чтобы, когда моя линия ADSL отключилась, сервер обнаружил это и подключился к услуге 3G, отслеживая линию ADSL и беспрепятственно переключаясь обратно при восстановлении соединения.

Основная услуга, о которой я забочусь, - это туннель OpenVPN - через UDP к удаленному серверу. Другой полезный сервис - это Squid - так что у меня все равно будет веб-доступ из моей локальной сети, когда ADSL отключен.

Вопросы:

  1. Насколько сложно это было бы настроить?
  2. Придется ли мне «свернуть свой собственный» - или есть пакеты / инструкции, которые я пропустил?
  3. Какое (недорогое) оборудование рекомендуется (в основном, для обеспечения надежности без участия оператора)?
  4. Есть какие-нибудь анекдоты об успехе или неудаче от тех, кто уже занимался этим?

Я делал это каждый раз для клиентов, и я не нашел разработанной системы, чтобы сделать это, поэтому я когда-либо катался самостоятельно, шаги, которые Manwe дал вам, более или менее соответствуют тому, что я делаю, когда они мне нужны, но я вставлю сюда любые грубые сценарии bash, которые я использую (когда у меня есть время, я хочу сделать это намного лучше на python).

В основном я проверяю, есть ли у меня Интернет или нет, и использую ли я резервную копию WAN, и вношу необходимые изменения

#!/bin/bash
PATH="/bin:/sbin:/usr/bin:/usr/sbin"
primary_gw="192.168.1.1" #for example.
check_one="8.8.8.8"
check_two="8.8.4.4"

#first we check internet connection.
if `ping -c 1 -W 1 $check_one |grep -E '(unreachable|100\%\ packet\ loss)' &> /dev/null` &&\
   `ping -c 1 -W 1 $check_two |grep -E '(unreachable|100\%\ packet\ loss)' &>/dev/null`
  then #if we don't have internet
    if [ -e /tmp/wan_backup ]
      #if we are using backup right now we try to change to primary connection
      then ./script_change_to_primary.sh && rm /tmp/wan_backup
      #else we change to wan backup.
      else ./script_change_to_backup.sh && touch /tmp/wan_backup
    fi
fi

#if we are using wan backup right now we check if primary connection works.
if [ -e /tmp/wan_backup ]
  then
    if `ip route add $check_one via $primary_gw; ip route add $check_two via $primary_gw;\
        sleep 2; ping -c 1 -W 1 $check_one | grep -E '(unreachable|100\%\ packet\ loss)' &> /dev/null &&\
        ping -c 1 -W 1 $check_two | grep -E '(unreachable|100\%\ packet\ loss)' &> /dev/null`
      then #don't works we clean the routes and stay using backup
        ip route del $check_one via $primary_gw
        ip route del $check_two via $primary_gw
      else #it works so we change active connection 
        ip route del $check_one via $primary_gw
        ip route del $check_two via $primary_gw
        ./script_change_to_primary.sh
        rm /tmp/wan_backup
    fi
fi

Учитывая, что вы хотите, чтобы ваш сервер использовал 3g только в случае сбоя adsl, я бы использовал iptables snat или masquerade только в adsl iface и заблокировал бы доступ к squid в ./script_change_to_secondary.sh, ваши файлы могут быть:

script_change_to_secondary.sh

#!/bin/bash
pon 3gIsp #this one it is going to change the default route of server anyway
#drop squid connections, you could disable here the boot snat or masquerade for adsl
#but given your adsl is not active i don't see the need anyway
iptables -I INPUT -s LAN_IP_RANGE -d SERVER_IP -p tcp --dport 3128 -j DROP

script_change_to_primary.sh

#!/bin/bash
poff 3gIsp
iptables -D INPUT -s LAN_IP_RANGE -d SERVER_IP -p tcp --dport 3128 -j DROP
/etc/init.d/openvpn restart

У вас также должен быть в /etc/ppp/ip-up.d/ сценарий bash с "/etc/init.d/openvpn restart", таким образом каждый раз, когда вы подключаетесь к провайдеру ppp, ваш openvpn будет перезапускаться автоматически.

Ну, как я уже сказал, это немного уродливо и грубо, но оно работает :) если вы найдете интегрированное чистое решение для этого, дайте мне знать, пожалуйста :), одна хорошая вещь в рулонах - это то, что у вас есть полный контроль системы, это чрезмерное упрощение того, что я делаю с любыми клиентами, у которых есть два или три активных соединения одновременно и которые выполняют балансировку нагрузки и QoS, все интегрировано со скриптами, которые обнаруживают проблемы с соединениями и изменяют маршруты и QoS.

Если вы предпочитаете интегрированное решение для самостоятельной работы, вы можете использовать такой дистрибутив, как Zentyal, он поддерживает то, что вы хотите использовать, но это полный дистрибутив, предназначенный для создания сервера SmallBusiness, я обычно предпочитаю настраивать свои серверы на своем собственном, но это хороший дистрибутив, которым можно управлять через Интернет.

У нас есть несколько меньших маршрутизаторов edimax 3g, которые имеют 1 wlan, 1 lan и usb для 3G-флешки. Порт локальной сети может быть настроен как часть локальной сети или как основной порт порта WAN (3g действует как аварийное переключение). Я не связан с edimax, и мы используем их в дороге или на конвенциях из-за их размера (и один из тех, что у нас есть, работает от батареи).

Сказав, что я бы пошел с настройкой на сервере ubuntu.

Ответы:

  1. Легко, если вы опытный администратор сервера. В противном случае, если вы готовы проводить время Чтобы узнать и понять, что вы делаете, это выполнимо для опытного пользователя.
  2. Не знаю о доступных пакетах, но

сменить на 3g - пример скрипта:

pon YourIsp-name
route del default gw "your_adls_defaultGW"
route add -host "ping_or_other_test_host_for_checking_adsl_route" gw  "your_adls_defaultGW"
"do_other_stuff_like_restart_openvpn_maybe"

изменить на adsl - пример скрипта:

poff YourIsp-name
route add default gw "your_adls_defaultGW"
route del -host "ping_or_other_test_host_for_checking_adsl_route" gw  "your_adls_defaultGW"
"do_other_stuff_like_restart_openvpn_maybe"

Использование dhcp с adsl приведет к неудачам в этом простом примере, и вам придется либо изменять /etc/resolv.conf при каждом изменении, либо использовать открытые DNS-серверы, такие как google 8.8.8.8 (или ваш собственный преобразователь). Теперь ... мониторинг немного сложнее, но размещение чего-то подобного в cron (не надо, это наивный пример) даст вам переключение на 3g и обратно.

ping -q -c 2 "ping_or_other_test_host_for_checking_adsl_route"  && TARGETUP=1 || TARGETUP=0 ;  echo $TARGETUP ; if [ "$TARGETUP" == 1 ] ; then ( rm /tmp/.adsl_down ; [ -e /tmp/.adsl_up ] || ( PATH_TO_YOUR_ADSL_UP_SCRIPT && touch /tmp/.adsl_up ) ); else  ( rm /tmp/.adsl_up ; [ -e /tmp/.adsl_down ] || ( PATH_TO_YOUR_3G_UP_SCRIPT && touch /tmp/.adsl_down )) ; fi

Три) Видеть Edimax 3g роутеры ( zeroshell linuxfw-распределение похоже, что у zeroshell есть отказоустойчивость, поэтому возьмите дешевый компьютер для маршрутизатора и используйте zeroshell. Хотя я не тестировал)

Четыре) Протестируйте, сохраните, и когда отказоустойчивость потребуется в первый раз, она выйдет из строя (из-за чего-то глупого ...).

Я не уверен, что вам понадобится squid для этой настройки, если только не ускорите 3g-соединение с локальным кешем наиболее часто посещаемых страниц ..

Рассматривали ли вы какие-либо аппаратные решения, поскольку я могу видеть большинство плакатов с использованием программных решений?

Не уверен, сколько вы хотите потратить, но DrayTek Vigor 2830n удовлетворит ваши потребности. Могут быть более дешевые альтернативы, но это тот, который я использовал на двух разных сайтах, и он отлично работает.

Это устройство поддерживает 3 подключения к глобальной сети, стандартную линию ADSL, подключение к сети Ethernet и адаптер 3G. Вы можете настроить это, просто используя адаптер ADSL и 3G и используя сам маршрутизатор. Ключ 3G не обязательно должен находиться в «режиме балансировки нагрузки», а только в режиме чистого WAN-резервного копирования.

Перечитав исходный пост, я хотел бы добавить, что вы даже можете ограничить трафик VPN только через ключ 3G, чтобы минимизировать затраты на пропускную способность вашего ключа 3G.

1) Не слишком сложно - запустите задачу и проверьте состояние вашего DSL - когда он выйдет из строя, запустите 3G-интерфейс и перейдите по маршруту по умолчанию. Возможно, вам также может потребоваться перезапустить VPN.

2 и 3) Я никогда не проверял наличие предварительно собранных пакетов, так как мой любимый брандмауэр по умолчанию включает эту функцию. Посетите сайт www.astaro.com (программное обеспечение бесплатно для домашнего использования или вы можете использовать 30-дневную пробную версию по умолчанию для тестирования)

4) Никогда не было серьезных проблем с переключением на WAN (кроме того, что резервная линия тоже не работает)

tsg

Я думаю, вы могли бы использовать keepalived для проверки связи с удаленным интернет-адресом (возможно, Google) каждые .. 30 секунд с некоторым таймаутом. Если время ping истекло, настройте keepalived для выключения eth0 и включения интерфейса 3G, а затем перезапустите VPN.

Вы должны учитывать задержки и т. Д. При настройке keepalived, чтобы он не переключал интерфейсы, когда он не нужен. Потребуются некоторые испытания / эксперименты. Я не могу придумать способ вернуться к линии ADSL, когда она снова активна.

Если у вас есть маршрутизатор между модемом ADSL и вашим сервером, или у модема есть внешний адрес, который вы можете пропинговать, вы, вероятно, можете использовать его в качестве критерия для восстановления соединения.

Сайт KeepaliveD

Надеюсь, это поможет вам начать!

Вы можете использовать shorewall (доступен пакет ubuntu) и очень полезный скрипт под названием gwping для создания собственного решения.