Аннотация
В прошлой публикации рассматривался вопрос организации резервирования для шлюзов локальной сети. Как вариант решения был предложен скрипт, который на тот момент решал задачу, однако имел ряд недостатков. Спустя некоторое время получилось эти недостатки устранить, частично переписать код и на выходе получить уже что-то приемлемое. Сейчас можно говорить, что скрипты достаточно протестированы, чтобы называться стабильными. Для упрощения понимания всей системы основные моменты по настройке второстепенных сервисов (с точки зрения темы статьи) будут частично продублированы ниже. Причина проста — за это время были переработаны также правила ipfw, dns отправился жить в AD на Samba4 с bind-frontend и безопасным обновлением записей из isc-dhcpd с использованием kerberos, а также вторичными dns-серверами в виде bind-а на шлюзах, был настроен CARP… В общем, стало сильно интереснее, но подробнее о том, что и как работает — ниже. Всё, что можно будет давать ссылками на первоисточник, будет оформлено именно таким образом, дабы не плодить сущности. То, что бралось из каких либо других мест, но что более недоступно, будет приводиться здесь с соответствующими комментариями.
в прошлый раз(начало раздела «предварительная настройка» внутри раскрывающегося меню).
Потребуется также скрипт для безопасного обновления записей dns в AD средствами samba4. Сам сервер samba4 должен быть просто установлен. Настройка и запуск не требуется, нас интересуют только инструменты управления, идущие в комплекте. Прочую информацию желающие могут найти в разделе «DHCP with dynamic DNS updates» по адресу.
Выглядит страшно, но работает.
На этом с настройкой стороннего софта закончено.
[/spoiler]
Немного о ToFoIn
Весь текст проекта вместе с установочным скриптом доступен на gitlab.
[spoiler=В завершение, рассмотрен пример параметров файла настроек 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, который, как предполагается логикой, должен совпадать с номером таблицы.
Параметры модуля Tester:
Число адресов, по которым будет происходить проверка:
TNUMBER=2
Адреса машин, по которым отправляются ping-запросы. Лучше всего использовать в первом случае доменное имя, и только после этого ip адреса:
PTARGET_0=ya.ru
PTARGET_1=8.8.8.8
Число ping пакетов, отправляемых одной целе:
PNUMBER=2
Настройки модуля Judge
Число успешных тестирований основного канала перед возвращением на него. Время возврата на основной канал после возобновления его работы приблизительно рассчитывается по формуле: (WNUMBER+1)*JUDGEPERIOD секунд.
WNUMBER=3
Настройки модуля Logger
Данные 2 параметра означают, с какой частотой Logger будет записывать повторяющиеся события. После записи о событии в следующий раз сообщается о LOGFREQ1 числе повторов, далее о LOGFREQ2 числе повторов. Учитываются только события идущие подряд.
LOGFREQ1=5
LOGFREQ2=20
Таймеры запуска модулей в секундах
Период запуска модуля Tester. Имеет смысл рассчитывать исходя из времени неудачных попыток тестирования всех целей.
TESTERPERIOD=240
Период запуска модуля Judge. Не стоит устанавливать меньше TESTERPERIOD.
JUDGEPERIOD=300
Период запуска модуля Scout.
SCOUTPERIOD=360
Период ожидания перед проверкой таймеров запуска модулей Tester и Judge. Логично устанавливать меньше или равным значению 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
Пути к настройкам bind
BINDSETDEF=/usr/local/etc/namedb/named.conf
Настройки bind для основного внешнего канала:
BINDSET_0=/usr/local/etc/namedb/named.conf.0
Настройки bind для резервного внешнего канала, при необходимости можно продолжать далее 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
[/spoiler]
Итог
Получился вполне работоспособный и надежный набор скриптов, который хорошо справляется с задачей переключения на рабочий канал в случае 2 роутеров с 2 внешними каналами связи.
Планы
Мои планы относительно этого проекта касаются, разве что, переписывания с bash на чистый sh, чтобы избавиться от лишнего ПО на сервере. С другой стороны — сейчас всё работает изумительно и вмешиваться в данный процесс крайне не хочется, к тому же переход на sh чреват более страшными языковыми конструкциями, необходимыми для достижения того же результата.
В остальном, наверное, стоило бы подумать над лучшей реализацией тестовых модулей.
Ссылки:
<- Предыдущая статья
Страница проекта ToFoIn на gitlab-е
[spoiler=Остальные]DNS BIND 9:
Ли К., Альбитц П. — DNS и BIND (5-е издание)
DNS сервер BIND
DHCP:
Failover DHCP
DHCP with dynamic DNS updates
samba-dnsupdate
SETFIB:
Multiple default routes in FreeBSD without BGP or similar
setfib и переключение между таблицами маршрутизации
FreeBSD два провайдера. setfib
IPFW + NAT:
Подробное руководство по ipfw nat
FreeBSD 9 + ipfw + ipfw nat
Подробное руководство по ipfw nat
DUMMYNET
Kernel NAT
BASH:
Основы BASH. Часть 2.
Advanced Bash-Scripting Guide
[/spoiler]
Источник: Хабр / Интересные публикации