Tofoin V 1. Резервирование Шлюза И Переключение Между Внешними Каналами Во Freebsd



Аннотация В предыдущей статье рассмотрен вопрос организации резервирования шлюзов локальной сети.

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

Через некоторое время нам удалось устранить эти недостатки, частично переписать код и в итоге получить что-то приемлемое.

Теперь можно сказать, что скрипты достаточно протестированы, чтобы называться стабильными.

Для упрощения понимания всей системы основные моменты настройки вторичных сервисов (с точки зрения темы статьи) будут частично продублированы ниже.

Причина проста - за это время были переработаны и правила ipfw, днс стал жить в AD на Samba4 с бинд-фронтендом и безопасным обновлением записей от isc-dhcpd с помощью kerberos, а также вторичных днс серверов в виде бинда на шлюзах был настроен CARP. В общем, стало намного интереснее, но подробнее о том, что и как работает - ниже.

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

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



Введение

Итак, существует два пути повышения помехоустойчивости канала связи с внешним миром со стороны потребителя: резервирование шлюза и резервирование точки подключения.

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

Если первая проблема для FreeBSD решена КАРП , то второе, после организации второго внешнего канала, можно опять же решить несколькими способами.

Как минимум, можно организовать балансировку трафика или переключение между каналами.

Из-за большой разницы в пропускной способности внешних каналов первый вариант меня не устроил, поэтому главным виновником публикации было написано: ТоФоИн — набор bash-скриптов, направленный на решение задач диагностики и переключения на работающий внешний канал.

После модификации его можно использовать для n шлюзов и m каналов.

Трудно представить ситуацию, когда n и m больше 2, но приведенные ниже скрипты должны работать до больших значений n и m, поскольку логически здесь не установлено ограничение.

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



ToFoIn v 1. Резервирование шлюза и переключение между внешними каналами во FreeBSD

Примерно такая топология сети в своей простейшей форме предполагает использование набора скриптов ToFoIn. Конечно, скрипты должны работать и в случае одного роутера, но в этом случае вам придется сильно менять модуль Daemon, чтобы убрать зависимость последовательности действий от состояния CARP, которая просто будет отсутствовать.

из системы.

Дальнейшее резервирование этих и других узлов зависит только от степени важности соответствующих сервисов.



Цели и задачи

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

В общих чертах логика следующая:

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

    В этом случае все n «маршрутизаторов» находятся в строгой иерархии и связаны друг с другом с помощью CARP по всем необходимым интерфейсам.

  • Агент запускается на всех машинах независимо друг от друга, чья задача в зависимости от текущего статуса CARP его машины:
    • Если резервная копия — определите и настройте машину на маршрутизаторе, который в данный момент является главным;
    • Если мастер - проверьте состояние соединений на текущий момент и при необходимости переключитесь между внешними каналами.



Решение

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

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

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

Правила ipfw различаются в зависимости от того, какой канал считается основным в данный момент, и перезапускаются модулем Daemon при изменении роли.

Наконец, о самих скриптах.

Теперь файлы расположены в соответствующих каталогах, запускаются от своего пользователя и имеют стартовый скрипт в rc.d. Задачи, требующие root-доступа, выполняются с помощью sudo. Имеется скрипт установки, учитывающий возможное наличие установленной версии, а также достаточно подробный файл настроек.

Модули те же с небольшими изменениями, некоторые остались практически без изменений по функционалу: Демон – как следует из названия, это основной процесс, который запускает тестирование и переключение модулей по таймеру, а также контролирует CARP. Тестер – проверяет наличие связи по внешним каналам, по-прежнему используя команду ping. (при запуске считает, что у машины CARP в состоянии Master) Судить – по результатам тестирования определяет, какой внешний канал работает и необходимо ли переключение, осуществляет переключение (если оно запущено, то считает, что у машины CARP в состоянии Master).

Скаут - новый модуль.

Запускается, когда CARP находится в состоянии резервного копирования.

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

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

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

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

Те.

убить всех, проще говоря.

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

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

Результат_ — рабочий файл, сюда «добавлены» результаты тестирования, созданные в /tmp рядом с .

pid и другими рабочими файлами.

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



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



Оборудование

По сравнению с прошлым разом шлюзы перешли на P4, получили 1536 Мб ОЗУ и три HDD по 40 Гб (зеркало + запасной).

Сетевые карты по-прежнему PCI, блок питания обычный, естественно с ИБП.

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

ОС FreeBSD 11.1, ФС zfs.

Настройки компонентов системы

Подробнее Ядро собирается со следующими дополнительными параметрами (кое-что можно задать в загрузчике, но лучше так):
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
   

options IPFIREWALL # ipfw firewall options IPFIREWALL_VERBOSE options IPFIREWALL_VERBOSE_LIMIT=50 options IPFIREWALL_NAT options LIBALIAS options DUMMYNET options HZ=1000 options ROUTETABLES=4 options KSTACK_PAGES=4 options KVA_PAGES=512 device carp

Настройки /boot/loader.conf:

geom_mirror_load="YES" zfs_load="YES" kern.geom.label.gptid.enable="0" vm.kmem_size="1024M" vm.kmem_size_max="1024M" vfs.zfs.arc_max="512M" vfs.zfs.vdev.cache.size="30M" vfs.zfs.prefetch_disable=1 kern.vty=vt

Настройки /etc/rc.conf на первой машине (основной интерес представляют настройки CARP):

ifconfig_eth0="up" vlans_eth0="vlan111 vlan222" create_args_vlan111="vlan 111" create_args_vlan222="vlan 222" ifconfig_eth1="up" vlans_eth1="vlan333 vlan444 vlan555" create_args_vlan333="vlan 333" create_args_vlan444="vlan 444" create_args_vlan555="vlan 555" ifconfig_eth2="up" vlans_eth2="vlan666 vlan777 vlan888" create_args_vlan666="vlan 666" create_args_vlan777="vlan 777" create_args_vlan888="vlan 888" ifconfig_vlan666="inet 192.168.0.1/24" ifconfig_vlan666_alias0="vhid 1 advskew 100 pass MyPassword alias 192.168.0.5/32" ifconfig_vlan777="inet 192.168.1.1/24" ifconfig_vlan777_alias0="vhid 1 advskew 100 pass MyPassword alias 192.168.1.5/32" ifconfig_vlan888="inet 192.168.2.1/24" ifconfig_vlan888_alias0="vhid 1 advskew 100 pass MyPassword alias 192.168.2.5/32" ifconfig_vlan111="inet 192.168.3.1/30" ifconfig_vlan111_alias0="vhid 1 advskew 100 pass MyPassword alias 1.1.1.2/24" ifconfig_vlan222="inet 192.168.4.1/30" ifconfig_vlan333="inet 192.168.5.1/30" ifconfig_vlan333_alias0="vhid 1 advskew 100 pass MyPassword alias 2.2.2.2/30" ifconfig_vlan444="inet 192.168.6.1/30" ifconfig_vlan444_alias0="vhid 1 advskew 100 pass MyPassword alias 3.3.3.2/30" ifconfig_vlan555="inet 192.168.7.1/30" defaultrouter="1.1.1.1" setfib1_enable="YES" setfib1_defaultrouter="3.3.3.1" setfib2_enable="YES" setfib2_defaultrouter="2.2.2.1" zfs_enable="YES" named_enable="YES" dhcpd_enable="YES" firewall_enable="YES" firewall_logging="YES" firewall_script="/etc/firewall.sh" gateway_enable="YES" tofoin_enable="YES"

Легенда: eth0,eth1,eth2 — физические адаптеры vlan666, vlan777, vlan888 — виртуальные локальные сетевые адаптеры, vlan222 и vlan555 — адаптеры для резервной связи между внешними сетевыми картами (возможно, уже не нужны, раньше активно использовались) vlan111 — основной внешний канал vlan444 — резервный внешний канал vlan333 — телефония Настройки /etc/rc.conf на второй машине (основной интерес представляют настройки CARP, некоторые повторяющиеся строки удалены):

ifconfig_vlan666="inet 192.168.0.2/24" ifconfig_vlan666_alias0="vhid 1 advskew 0 pass MyPassword alias 192.168.0.5/32" ifconfig_vlan777="inet 192.168.1.2/24" ifconfig_vlan777_alias0="vhid 1 advskew 0 pass MyPassword alias 192.168.1.5/32" ifconfig_vlan888="inet 192.168.2.2/24" ifconfig_vlan888_alias0="vhid 1 advskew 0 pass MyPassword alias 192.168.2.5/32" ifconfig_vlan111="inet 192.168.3.2/30" ifconfig_vlan111_alias0="vhid 1 advskew 0 pass MyPassword alias 1.1.1.2/24" ifconfig_vlan222="inet 192.168.4.2/30" ifconfig_vlan333="inet 192.168.5.2/30" ifconfig_vlan333_alias0="vhid 1 advskew 0 pass MyPassword alias 2.2.2.2/30" ifconfig_vlan444="inet 192.168.6.2/30" ifconfig_vlan444_alias0="vhid 1 advskew 0 pass MyPassword alias 3.3.3.2/30" ifconfig_vlan555="inet 192.168.7.2/30" defaultrouter="1.1.1.1" setfib1_enable="YES" setfib1_defaultrouter="3.3.3.1" setfib2_enable="YES" setfib2_defaultrouter="2.2.2.1"

Некоторые правила, которые будут полезны при настройке ipfw(nat): чтобы разрешить трафик CARP:

/sbin/ipfw -q add allow carp from any to any

"ядерный" физ:

/sbin/ipfw -q nat 1 config log ip vlan111 reset same_ports deny_in unreg_only /sbin/ipfw -q add nat 1 ip from any to any in

использование определенных таблиц маршрутизации с конкретными адаптерами:

/sbin/ipfw -q add setfib 0 all from any to any via vlan666

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



Стороннее программное обеспечение

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

И было бы неплохо, если бы эти таблицы создавались сами при запуске.

В этом поможет скрипт rc.d setfib. Логика, используемая в ToFoIn, предполагает, что имя файла (setfib1, setfib2 и т. д.) совпадает с номером таблицы, к которой конкретный сценарий добавляет маршрут по умолчанию.

Номер таблицы по умолчанию — «0».

DNS-серверы с Bind в главной роли работают в вторичном режиме, а samba4+bind, скрытый в локальной сети, выступает в качестве основного.

Настройка вторичных привязок прекрасно описана в книге Крикета Ли и Пола Альбитца «DNS и BIND».

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

Возможно, для разных интернет-каналов может понадобиться создать 2 разных файла, которые потом скрипт ToFoIn скопирует в то место, откуда его прочитает сам бинд. Это сделано из-за того, что при указании адресов DNS-серверов обоих провайдеров в одном файле, с учетом того, что бинд работает только с одной таблицей маршрутизации, возникает проблема, связанная с разрешением адресов от вышестоящих серверов, которые недоступны в определенный момент. Отработка отказа isc-dhcpd. Dhcpd не обязателен для работы ToFoIn, более того, его отсутствие совершенно не повлияет на работу скриптов, однако мне кажется вполне логичным разместить dhcp-сервера на шлюзах и тогда еще вопрос аварийного переключения возникает. А тут по сравнению с прошлым разом стало интереснее.

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

Вам также понадобится скрипт для безопасного обновления DNS-записей в AD с помощью samba4. Сам сервер samba4 нужно просто установить.

Никакой настройки или запуска не требуется; нас интересуют только инструменты управления, входящие в комплект. Желающие могут найти другую информацию в разделе «DHCP с динамическими обновлениями DNS».

по адресу .

Это выглядит пугающе, но это работает. На этом настройка стороннего ПО завершена.



Немного о ТоФоИн

Полный текст проекта вместе со сценарием установки доступен на gitlab .

Наконец, вот пример параметров файла настроек ToFoIn: Количество маршрутизаторов, используемых в системе:

RNUMBER=2

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

Здесь вы можете указать номер соответствующего файла setfib, который будет перезапущен.

В этом примере setfib2:

ADDITLAN=2

Имя внутреннего адаптера:

INT_IF=vlan666

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

ALL_IF="vlan111 vlan333 vlan444 vlan666 vlan777 vlan888"

vhid, который использовался при настройке CARP:

CARP_VHID=1

IP-адреса во внутренней сети других роутеров в порядке важности, если необходимо, то просто используйте ASERV_IP_2, ASERV_IP_3 и т.д.

ASERV_IP_1=192.168.0.2

Количество внешних каналов подключения:

CNUMBER=2

Настройки основного внешнего канала подключения: Название адаптера:

EXT_0_IF=vlan111

Номер таблицы маршрутизации:

RTABLE_0=0

Шлюз по умолчанию:

DEFAULT_GATEWAY=2.2.2.1

Настройки резервного внешнего канала связи: Название адаптера:

EXT_1_IF=vlan444

Номер таблицы маршрутизации:

RTABLE_1=1

Шлюз по умолчанию не требуется, поскольку для всех таблиц маршрутизации, кроме основной, скрипт rc.d setfib

TNUMBER=2

Адреса машин, на которые отправляются пинг-запросы.

Лучше всего в первом случае использовать доменное имя и только после этого IP-адрес:

PTARGET_0=ya.ru PTARGET_1=8.8.8.8

Количество пинг-пакетов, отправленных одной цели:

PNUMBER=2

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

Время возврата на основной канал после возобновления его работы примерно рассчитывается по формуле: (WNUMBER+1)*JUDGEPERIOD секунд.

WNUMBER=3

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

После записи события в следующий раз сообщается количество повторений LOGFREQ1, а затем количество повторений LOGFREQ2. Учитываются только последовательные события.



LOGFREQ1=5 LOGFREQ2=20

Таймеры запуска модулей в секундах Период запуска модуля тестера.

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



TESTERPERIOD=240

Период запуска Судейского модуля.

Не следует устанавливать значение меньше TESTERPERIOD.

JUDGEPERIOD=300

Период запуска модуля Scout.

SCOUTPERIOD=360

Период ожидания перед проверкой таймеров запуска модулей тестера и судьи.

Логично установить значение меньше или равное значению TESTERPERIOD.

SENSITIVITY=60

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

Используется модулем Watchdog.

TESTERLIMIT=40 JUDGELIMIT=30 LOGGERLIMIT=20 SCOUTLIMIT=120 WATCHDOGLIMIT=150

Пути к файлам и каталогам Путь к скрипту ipfw.

FIRESCRIPT=/etc/firewall.sh

настройки ipfw. Если настройки ipfw не вынесены в отдельный файл, то FIRESCRIPT=FIRESETDEF.

FIRESETDEF=/etc/firewall/config

Путь к настройкам ipfw для основного внешнего канала:

FIRESET_0=/etc/firewall/config_0

Путь к настройкам ipfw для резервного внешнего канала, при необходимости можно продолжить дальше FIRESET_2 и т.д.:

FIRESET_1=/etc/firewall/config_1

Пути привязки настроек

BINDSETDEF=/usr/local/etc/namedb/named.conf

Настройки привязки для основного внешнего канала:

BINDSET_0=/usr/local/etc/namedb/named.conf.0

Привяжите настройки для резервного внешнего канала, при необходимости можно продолжить дальше BINDSET_2 и т.д.:

BINDSET_1=/usr/local/etc/namedb/named.conf.1

Пути ко всем исполняемым файлам ToFoIn:

DAEMON=/local/sbin/tofoin/daemon.sh TESTER=/usr/local/sbin/tofoin/tester.sh JUDGE=/usr/local/sbin/tofoin/judge.sh LOGGER=/usr/local/sbin/tofoin/logger.sh SCOUT=/usr/local/sbin/tofoin/scout.sh WATCHDOG=/usr/local/sbin/tofoin/watchdog.sh

Журнал событий.

Этот файл НЕ создается в настоящее время во время установки:

LOGFILE=/var/log/tofoin.log

Временные файлы и каталоги создаются при запуске соответствующих модулей, некоторые удаляются при остановке:

DIR_TMP=/tmp/tofoin DIR_PID=/var/run/tofoin JUDGEMETER=/tmp/tofoin/judgemeter PREVSTATE=/tmp/tofoin/prevstate SCOUTGATE=/tmp/tofoin/scoutgate LOGTMP=/tmp/tofoin/logger.tmp LOGMETER=/tmp/tofoin/logmeter DAEMON_PID=/var/run/tofoin/daemon.pid TESTER_PID=/var/run/tofoin SCOUT_PID=/var/run/tofoin/scout.pid JUDGE_PID=/var/run/tofoin/judge.pid LOGGER_PID=/var/run/tofoin/logger.pid WATCHDOG_PID=/var/run/tofoin_watchdog.pid



Нижняя граница

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



Планы

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

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

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



Ссылки:

← Предыдущая статья → Страница проекта ToFoIn на gitlab Отдых DNS-ПРИВЯЗКА 9: Ли К.

, Альбитц П.

- DNS и BIND (5-е издание) DNS-сервер BIND DHCP: Отказоустойчивый DHCP DHCP с динамическими обновлениями DNS самба-dnsupdate СЕТФИБ: Несколько маршрутов по умолчанию во FreeBSD без BGP или аналогичного setfib и переключение между таблицами маршрутизации У FreeBSD есть два провайдера.

сетфиб ИПФВ + НАТ: Подробное руководство по ipfw nat FreeBSD 9 + ipfw + ipfw nat Подробное руководство по ipfw nat ДУММИНЕТ Ядро NAT БАШ: Основы БАШ.

Часть 2. Расширенное руководство по написанию сценариев Bash Теги: #*nix #Сетевые технологии #bash #FreeBSD #networking #vlan #carp

Вместе с данным постом часто просматривают: