Tofoin — Переключение Аварийного Переключения Интернета Или Переключение Между Двумя Внешними Каналами Во Freebsd.



Аннотация Одним из вариантов повышения стабильности вашего интернет-соединения является использование двух внешних каналов связи, что подразумевает автоматическое переключение между ними.

В статье кратко рассмотрены некоторые варианты решения данной проблемы.

Мы предлагаем свой метод решения с использованием bash-скриптов в ОС FreeBSD, приводим инструкцию по созданию финальной системы и исходные тексты необходимых для этого скриптов.



Введение

Для повышения стабильности интернет-соединения корпоративные решения предполагают использование двух и более внешних сетевых каналов.

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

Вот некоторые из них:

  1. Маршрутизаторы класса SOHO с двумя выходами во внешнюю сеть (далее по тексту под внешней сетью подразумевается Интернет, а под внутренней – локальная сеть предприятия);
  2. Коммутаторы уровня 3, как правило, являются операторскими, имеющими большое количество изменяемых параметров, в частности позволяющих решить описанную выше задачу;
  3. Множество самописных скриптов на разных языках для различных unix- и linux-подобных систем, чаще всего сомнительного качества;
  4. Балансировка каналов с использованием правил NAT;
  5. Балансировка или переключение с использованием прокси-сервера.

Каждый из вышеперечисленных подходов имеет свои преимущества и недостатки.

Вариант первый, маршрутизаторы SOHO: Преимущества:

  • низкая цена;
  • простота установки и настройки.

Недостатки:
  • недостаточная надежность для корпоративного сегмента из-за отсутствия резервирования;
  • отсутствие гибкости настройки, низкая функциональность.

    (Обычно такие устройства способны решать весьма ограниченный круг задач и либо вообще не могут сделать «шаг в сторону», либо это связано с различными трудностями.

    )

Второй вариант, коммутаторы уровня 3: Преимущества:
  • надежность;
  • гибкость настройки;
Недостатки:
  • цена (Обычно цены на такие устройства выходят за пределы 50 тысяч рублей);
  • сложность настройки (устройство профессионального уровня требует соответствующего подхода).

Третий вариант, переключение скриптов: Преимущества:
  • цена (бесплатно, без учета рабочего времени на настройку).

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

Четвертый вариант, балансировка с использованием правил NAT: Преимущества:
  • цена (бесплатно, без учета рабочего времени на настройку);
  • относительная простота установки.

Недостатки:
  • необходимо иметь каналы примерно равной пропускной способности.

Есть сомнения в скорости работы в случае «падения» одного из внешних каналов.

И, наконец, пятый вариант с использованием прокси-сервера: Преимущества:

  • цена (бесплатно, без учета рабочего времени на настройку);
  • гибкость настройки.

Недостатки:
  • замедление потока данных;
  • необходимость дополнительной настройки на пользовательских машинах;
  • Сложность настройки в нестандартных ситуациях.

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

Во-первых, цена.

По этому критерию из второго пункта исключаются коммутаторы уровня 3. В локальной сети на 10 машин решения корпоративного уровня — непозволительная роскошь.

К сожалению, автор на момент принятия решения не знал об устройствах из первого пункта.

Кстати, для точки «стабильности» сейчас они уже не подходят. А вот решение из четвертого пункта не подходит, потому что.

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

Кроме того, добавляются сомнения в качестве связи с внешней сетью в случае «падения» одного из каналов.

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

Соответственно остался пункт 3, где после изучения чужих сценариев и попыток их адаптации было решено отказаться от этой идеи и написать свой сценарий.

Со временем рядом с основным «роутером» на FreeBSD был установлен резервный, а настройки dns, dhcp, nat и ipfw менялись не раз.

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

системы, а также простота добавления новых модулей.



Цели и задачи

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

При этом агент является «сборщиком» информации о состоянии внешних и внутренних соединений в текущий момент, а сервер — частью программы, которая решает, какое соединение имеет приоритет и при необходимости выдает команды на переключение.

к этому соединению.

В этом случае агент может не работать на сервере (в данном контексте).

Так:

  • У нас есть n «маршрутизаторов» по m внешних каналов на каждом.

    В этом случае все n «маршрутизаторов» находятся в строгой иерархии.

  • На всех машинах независимо друг от друга запускается агент, задачей которого является сбор и «сохранение» результатов тестирования внешних каналов на сервер или «роутер» с текущим высшим приоритетом (предполагается, что серверная часть будет обязательной).

    дополнение к агенту, при этом в качестве агента не требуется выполнять серверные функции), а также определять его (серверную) доступность.

  • Сервер, в свою очередь, анализирует полученные данные и определяет, какой канал и на каком «маршрутизаторе» в данный момент является приоритетным.

    Именно для этого в статье и рассматриваются настройки DHCP-сервера, потому что.

    Для смены шлюза меняются настройки dhcpd.

  • В случае сбоя сервера на всех агентах активируется программа, которая выбирает и назначает новый сервер из числа агентов по заранее заданным приоритетам и делегирует ему функции сбора информации о текущем состоянии внешних соединений и принятие решений о переключении.

    После восстановления работоспособности исходного сервера происходит обратный процесс – автоматическое переключение на него.

Детали алгоритма можно описывать очень долго, вышеизложенное лишь обрисовывает общую суть.

Я не спорю, что и n, и m (из примера выше) принимают значения больше 2 крайне редко, но встречаются, так почему бы не сделать универсальный инструмент? В процессе написания скриптов я столкнулся с некоторыми ограничениями языка bash, поэтому на данный момент очень туманно, существует ли более элегантное решение вышеописанной проблемы.

Пока существует решение для автономного «маршрутизатора», спроектированное с упором на дальнейшее расширение возможностей.



Решение

По многим причинам было решено использовать старую машину (Pentium 3, 512 OP) с FreeBSD, на данный момент версии 9.2, в качестве основы локальной сети, а также шлюза в Интернет. Впоследствии для повышения надежности была установлена вторая аналогичная машина, работающая в паре с существующей.

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

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

Также есть 2 внешних канала от разных интернет-провайдеров.

Общая схема представлена ниже: Синие и красные стрелки — внешние каналы связи.

Черные стрелки – внутренние каналы связи.

Эта система выглядит следующим образом:

ToFoIn — переключение аварийного переключения Интернета или переключение между двумя внешними каналами во FreeBSD.

Коммутатор отделяет трафик от провайдеров с помощью вланов.

В данном конкретном случае это Cisco SF300-08. Подробнее, что работает и с какой помощью на самих машинах: Брандмауэр — IPFW NAT – «основной» NAT от IPFW. DNS — Bind 9 (использует последнюю версию для FreeBSD) DHCP — isc-dhcpd ToFoIn — главный виновник этой статьи.

В статье не будут описываться тонкости настройки DNS и DHCP, поскольку, вообще говоря, предполагается, что читатель уже знаком с такими системами.

Кроме того, материалов по этой теме предостаточно, а некоторые ссылки будут упомянуты в конце статьи.

В технической части собраны полные правила Firewall и NAT для ipfw практически без комментариев (опять же материала на эту тему тоже предостаточно), доступные на данный момент, а также параметры ядра и rc.conf. Теперь давайте подробнее рассмотрим, как работает скрипт. Для начала какие модули доступны и их функции: Демон – как следует из названия, это основной процесс, который запускает тестирование и переключение модулей с помощью таймера.

Тестер – проверяет наличие связи по внешним каналам с помощью команды ping. Судить – по результатам проверки определяет, какой внешний канал работает и необходимо ли переключение.

Регистратор – Отвечает за ведение журнала событий.

Это необходимо для того, чтобы информация о событиях не дублировалась и журнал было легче читать.

Сторожевая собака – запускается по расписанию из crontab. Определяет зависания всех модулей и по возможности пытается решить возникшие проблемы.

Помимо самих скриптов, есть еще несколько важных файлов, на которые стоит обратить внимание: Tofoin.conf – единый файл настроек.

Tofoin.log – один файл журнала событий.

Результат_< внутренний номер канала > — рабочий файл, сюда добавлены результаты тестирования Также используется ряд рабочих файлов и, конечно же, каждый скрипт создает pid -file, и в процессе выключения удаляет его.

Подробно работа Logger и Watchdog описываться не будет, но любой желающий может прочитать при желании.

Давайте подробнее рассмотрим работу основных модулей: Daemon, Tester и Judge. Демон запускает Tester и Judge на основе таймеров, которые хранятся в файле конфигурации.

Выглядит это так: при запуске запускаются тесты, а также запоминается временная метка, затем, исходя из чувствительности, каждые n секунд проверяется, превышено ли время для запуска следующего теста, или для оценки текущего состояния коммуникация.

Таким образом, Daemon запоминает последнюю временную метку для тестов и проверок и сравнивает их с текущей временной меткой.

Если разница больше, чем указано в файле конфигурации, то запускается тест или проверка соответственно и временная метка заменяется на текущую.

И т. д. Tester — самый простой модуль на данный момент. Принимает 2 переменные в качестве входных данных следующим образом:

  
  
   

.

/tester.sh a b

, где a — номер таблицы маршрутизации, b — задача (в обычном варианте b=10, что означает полное тестирование и запись результата).

Также модуль Тестер имеет пробные режимы, где b=0 – пинговать только первую цель (из файла конфигурации), b=1 – пинговать только вторую цель (из файла конфигурации), b= , например, b=habrhabr. ru – в этом режиме пингуется произвольная цель.

В этом случае для таблицы маршрутизации 0 команда будет выглядеть так:

.

/tester.sh 0 habrahabr.ru

Основным компонентом программы, очевидно, является модуль «Судья».

Алгоритм его работы в общих чертах следующий:

  1. На основании текущих правил ipfw определяется текущий внешний канал.

  2. В цикле формируется массив текущих данных о состоянии внешних каналов.

  3. Следующий цикл определяет предпочтительный внешний канал.

  4. Далее запускается функция определения необходимости переключения канала, а при необходимости запускается функция переключения, которой передается внутренний номер переключаемого канала.

    (Возврат на основной канал происходит не сразу.

    Это сделано для того, чтобы в случае нестабильной работы основного канала не было скачков туда-сюда, а переключение происходило только тогда, когда основной внешний канал начинает работать стабильно) .

  5. В конце при необходимости запускается функция переключения, которая подставляет необходимые настройки ipfw, перезапускает его, а также перезапускает с необходимой таблицей маршрутизации Bind.
Разумеется, все ключевые действия записываются в журнал событий, а в случае нештатной ситуации опять же фиксируется причина ошибки и вызывается Watchdog. Итак, основные принципы работы рассмотрены, предлагаю вам ознакомиться с тем, как это все реализуется на практике.



Техническая часть



Оборудование
Об оборудовании уже упоминалось, в этом разделе я постараюсь рассказать подробнее.

Для обеспечения работы DNS, DHCP, NAT и IPFW в моем случае (внутренняя сеть примерно на 30 машин) нужен Celeron на базе Pentium III, 512 МБ ОЗУ и HDD на 40 ГБ, а также блок питания на 350 Вт с поддержкой для соответствующих разъемов материнской платы достаточно.

Также подключены 2 дополнительные сетевые карты PCI. По мощности оба роутера примерно одинаковы.

Здесь можно утверждать, что местами мощность даже избыточна, но эти машины не закупались специально, а собирались из того, что осталось после обновления парка пользовательских машин.

Скорее всего, минимально необходимый набор сервисов можно запустить и на гораздо более слабом оборудовании.

Также было бы неплохо перестраховаться и организовать зеркальный RAID. К сожалению, я не подумал об этом заранее и сейчас это связано с некоторыми трудностями, но это совсем другая история.

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



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

Сначала настройте основной и дополнительный DNS-серверы.

Если у вас только один «маршрутизатор», то для начала достаточно только Первичного DNS-сервера.

В этой задаче, как уже упоминалось, использовался Bind 9. Некоторые ссылки на настройку приведены в конце статьи.

В этом случае очень поможет учебник «DNS и BIND» Крикета Ли и Пола Альбитца.

Во-вторых, вам необходимо настроить узел аварийного переключения DHCP. Если у вас только один «роутер», то обычных настроек автономного DHCP-сервера будет достаточно.

Опять же, ссылки приведены в конце статьи.

В случае, если по каким-то причинам статья о настройке Failover dhcp Peer по ссылке недоступна (а в последние несколько месяцев именно такая ситуация), я приведу здесь скрипт для синхронизации настроек, а также ключевые моменты для настройки это вверх.

Настройка аварийного переключения dhcpd Для настройки узла DHCP для переключения при отказе вам необходимо:

  1. Создайте основной файл настроек dhcpd.conf в /usr/local/etc, на который есть ссылка в rc.conf. Мой выглядит так: /usr/local/etc/dhcpd.conf

    # dhcpd.conf # # option definitions common to all supported networks. option domain-name "companyname.local"; option domain-name-servers 10.0.0.2, 10.0.0.1; option ntp-servers 10.0.0.2, 10.0.0.1; option log-servers 10.0.0.1; update-static-leases on; # 1 hour default-lease-time 3600; # 1 day max-lease-time 86400; # Use this to enable / disable dynamic dns updates globally. ddns-update-style interim; # If this DHCP server is the official DHCP server for the local # network, the authoritative directive should be uncommented. authoritative; # Use this to send dhcp log messages to a different log file (you also # have to hack syslog.conf to complete the redirection).

    log-facility local7; set vendorclass = option vendor-class-identifier; # DNS key include "/usr/local/etc/dhcpd/dns.key"; zone companyname.local.{

Теги: #Shells #FreeBSD #bash программирование #bash скрипты #bash-скрипты #переключение настроек Интернета)
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.