Аннотация Одним из вариантов повышения стабильности вашего интернет-соединения является использование двух внешних каналов связи, что подразумевает автоматическое переключение между ними.
В статье кратко рассмотрены некоторые варианты решения данной проблемы.
Мы предлагаем свой метод решения с использованием bash-скриптов в ОС FreeBSD, приводим инструкцию по созданию финальной системы и исходные тексты необходимых для этого скриптов.
Введение
Для повышения стабильности интернет-соединения корпоративные решения предполагают использование двух и более внешних сетевых каналов.Их одновременное (например, методом балансировки) или поочередное (с переключением между каналами) использование не совсем тривиальная задача, во многом уже решенная.
Вот некоторые из них:
- Маршрутизаторы класса SOHO с двумя выходами во внешнюю сеть (далее по тексту под внешней сетью подразумевается Интернет, а под внутренней – локальная сеть предприятия);
- Коммутаторы уровня 3, как правило, являются операторскими, имеющими большое количество изменяемых параметров, в частности позволяющих решить описанную выше задачу;
- Множество самописных скриптов на разных языках для различных unix- и linux-подобных систем, чаще всего сомнительного качества;
- Балансировка каналов с использованием правил NAT;
- Балансировка или переключение с использованием прокси-сервера.
Вариант первый, маршрутизаторы SOHO: Преимущества:
- низкая цена;
- простота установки и настройки.
- недостаточная надежность для корпоративного сегмента из-за отсутствия резервирования;
- отсутствие гибкости настройки, низкая функциональность.
(Обычно такие устройства способны решать весьма ограниченный круг задач и либо вообще не могут сделать «шаг в сторону», либо это связано с различными трудностями.
)
- надежность;
- гибкость настройки;
- цена (Обычно цены на такие устройства выходят за пределы 50 тысяч рублей);
- сложность настройки (устройство профессионального уровня требует соответствующего подхода).
- цена (бесплатно, без учета рабочего времени на настройку).
- непредсказуемая надежность (поскольку профессиональный уровень авторов этих скриптов часто неизвестен, без детального изучения сложно сделать вывод о качестве продукта);
- отсутствие гибкости и сложности настройки (обычно такие скрипты создаются под конкретные условия, и иногда проще написать свой вариант, чем разобраться в чужом, чем и объясняется такое разнообразие).
- цена (бесплатно, без учета рабочего времени на настройку);
- относительная простота установки.
- необходимо иметь каналы примерно равной пропускной способности.
И, наконец, пятый вариант с использованием прокси-сервера: Преимущества:
- цена (бесплатно, без учета рабочего времени на настройку);
- гибкость настройки.
- замедление потока данных;
- необходимость дополнительной настройки на пользовательских машинах;
- Сложность настройки в нестандартных ситуациях.
Во-первых, цена.
По этому критерию из второго пункта исключаются коммутаторы уровня 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 внешних канала от разных интернет-провайдеров.
Общая схема представлена ниже: Синие и красные стрелки — внешние каналы связи.
Черные стрелки – внутренние каналы связи.
Эта система выглядит следующим образом:
Коммутатор отделяет трафик от провайдеров с помощью вланов.
В данном конкретном случае это 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 переменные в качестве входных данных следующим образом:
, где a — номер таблицы маршрутизации, b — задача (в обычном варианте b=10, что означает полное тестирование и запись результата)..
/tester.sh a b
Также модуль Тестер имеет пробные режимы, где b=0 – пинговать только первую цель (из файла конфигурации), b=1 – пинговать только вторую цель (из файла конфигурации), b= , например, b=habrhabr. ru – в этом режиме пингуется произвольная цель.
В этом случае для таблицы маршрутизации 0 команда будет выглядеть так: .
/tester.sh 0 habrahabr.ru
Основным компонентом программы, очевидно, является модуль «Судья».
Алгоритм его работы в общих чертах следующий:
- На основании текущих правил ipfw определяется текущий внешний канал.
- В цикле формируется массив текущих данных о состоянии внешних каналов.
- Следующий цикл определяет предпочтительный внешний канал.
- Далее запускается функция определения необходимости переключения канала, а при необходимости запускается функция переключения, которой передается внутренний номер переключаемого канала.
(Возврат на основной канал происходит не сразу.
Это сделано для того, чтобы в случае нестабильной работы основного канала не было скачков туда-сюда, а переключение происходило только тогда, когда основной внешний канал начинает работать стабильно) .
- В конце при необходимости запускается функция переключения, которая подставляет необходимые настройки ipfw, перезапускает его, а также перезапускает с необходимой таблицей маршрутизации Bind.
Техническая часть
Оборудование
Об оборудовании уже упоминалось, в этом разделе я постараюсь рассказать подробнее.Для обеспечения работы 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 для переключения при отказе вам необходимо:
- Создайте основной файл настроек 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.{
-
Карманный Жк-Проектор 3M Mp-180
19 Oct, 24 -
Аспия 0.2.1
19 Oct, 24 -
Техническая Организация Хостинга
19 Oct, 24 -
Группа Пользователей Atlassian В Гостях У 1С
19 Oct, 24 -
Мотивация Персонала, А Точнее Программистов
19 Oct, 24