NetGWM

NetGWM (Network Gateway Manager) — утилита для автоматического переключения сетевых шлюзов в случае недоступности интернета в операционной системе GNU/Linux. NetGWM позволяет с лёгкостью создавать отказоустойчивые подключения к глобальной сети.

English description

For English documentation on this software, please refer to the README file or project's GitHub page.

Принципы работы, особенности и ограничения

  • Доступные сетевые шлюзы определяются в YAML-файле IP-адресом или названием устройства. Кроме того, для каждого шлюза задаётся приоритет.
  • Помимо сетевых шлюзов в конфигурационном файле определяется список сетевых адресов (IP или доменных имён), которые будут использоваться как контрольные для проверки доступности интернет-подключения.
  • Запускается демон NetGWM, который периодически вызывает основной скрипт. Скрипт отправляет ping-запросы через текущий шлюз по всем контрольным адресам. Если отсутствует ответ от всех контрольных адресов, шлюз считается неработающим — в таком случае NetGWM переключает текущий шлюз на другой (самый приоритетный из работающих в данный момент).
  • Шлюз считается вновь работающим, если проверка его статуса была успешной не один-единственный раз, а на протяжении настраиваемого интервала времени.
  • Если более приоритетный (чем текущий) шлюз вновь стал работающим, NetGWM автоматически переключится на него.
  • При переключении шлюза NetGWM может вызывать shell-скрипты, которым в качестве аргументов передаётся информация о старом и новом шлюзах.
  • NetGWM может постоянно поддерживать полный список статусов шлюзов для прочих применений (например, для использования этих данных в других программах).

Общие сведения

  • Язык программирования: Python.
  • Другие используемые технологии: наборы утилит iproute2 и conntrack, формат YAML для конфигурационного файла.
  • Лицензия: GNU GPLv2.
  • Автор оригинальной версии: Андрей Половов.
  • Исходный код: GitHub.
  • Анонс проекта: flant.ru, nixp.ru.

Инструкция по установке и использованию

Установка

Для дистрибутивов на основе Debian (в т.ч. Ubuntu Server) на apt.flant.ru доступен готовый пакет (netgwm). Кроме того, файлы с программой можно получить из Git:

git clone git://github.com/flant/netgwm.git netgwm

Для установки NetGWM достаточно выполнить команду (для записи файлов в системные директории понадобятся права root):

# make install

Основные файлы NetGWM:

  • /etc/default/netgwm — базовые параметры запуска NetGWM;
  • /usr/sbin/netgwm — простой shell-демон, периодически вызывающий основной скрипт (периодичность настраивается в /etc/default/netgwm);
  • /usr/lib/netgwm/netgwm.py — основной исполняемый файл (вызывается демоном);
  • /etc/netgwm/netgwm.yml-sample — пример конфигурационного файла (после правки необходимо переименовать в netgwm.yml или указывать полный путь к нему с помощью аргумента при вызове netgwm.py);
  • /etc/netgwm/post-replace.d — каталог с shell-скриптами, которые вызываются при переключении шлюза (более подробное описание см. в скрипте-примере script.sh);
  • /etc/netgwm/crontab.sample — пример crontab-файла для ежеминутного вызова netgwm.py в cron (необходимо скопировать в /etc/cron.d или аналогичный каталог в зависимости от вашей системы);
  • /etc/netgwm/rt_tables.sample — пример файла с таблицами маршрутизации для iproute (необходимо скопировать в /etc/iproute2 или аналогичный каталог в зависимости от вашей системы).

Обратите внимание, что NetGWM зависит от наличия в системе:

Настройка

Основной конфигурационный файл NetGWM хранится в формате YAML. При установке программы в /etc/netgwm/netgwm.yml-sample копируется пример конфига, который после настройки необходимо переименовать в /etc/netgwm/netgwm.yml (его можно поместить и в любое другое место в системе, а при вызове netgwm.py указывать полный путь до конфига с помощью параметра -c).

Конфигурационный файл с комментариями:

gateways: # IP-адреса или названия устройств шлюзов
          # и соответствующие этим шлюзам приоритеты
          # (1 -- основной, самый приоритетный шлюз)
  thebestone: {ip: 42.42.42.42,  priority: 1}
  notsogood:  {ip: 42.84.168.42, priority: 2}
  gprsbackup: {dev: ppp333,      priority: 3}

# Минимальное время, в течение которого шлюз должен
# успешно пинговаться, чтобы считаться работающим
# (указывается в секундах)
min_uptime: 900 # 15 минут

# Сетевые адреса (IP или домены), которые будут
# пинговаться через тестируемые шлюзы для проверки
# доступности интернет-подключения. Если для какого-то
# шлюза все эти адреса недоступны, считается, что шлюз
# в данный момент не работает
check_sites:
  - 8.8.4.4 # Google public DNS
  - 4.2.2.2 # Verizon public DNS
  - something.in.the.wheel.com

# Опция для обязательной проверки доступности всех
# шлюзов при каждом вызове NetGWM. По умолчанию
# отключена. Может применяться для поддержания
# актуального списка таблицы со всеми статусами
# (например, чтобы использовать в других программах)
check_all_gateways: false

Кроме того, для работы NetGWM в системе необходимо добавить дополнительную таблицу маршрутизации под названием netgwm_check — её NetGWM будет использовать для проверки доступности шлюзов. В дистрибутивах Ubuntu/Debian для этого достаточно добавить в конец файла /etc/iproute2/rt_tables строку подобного вида:

100    netgwm_check

При установке NetGWM из deb-пакета строчка для файла rt_tables будет добавлена автоматически.

В файле /etc/default/netgwm можно задавать интервал для периодичности проверки шлюзов NetGWM (по умолчанию проверка осуществляется раз в минуту).

Наконец, в /etc/netgwm/post-replace.d можно добавить свои shell-скрипты, которые будут вызываться при переключении шлюзов (см. пример в script.sh).

Использование

Единственным параметром при запуске netgwm.py является -c (или --config), в качестве значения которого указывается полный путь до конфигурационного файла. Если он не задан, NetGWM попробует обратиться к файлу /etc/netgwm/netgwm.yml.

Для нормального функционирования NetGWM необходимо прописать запуск netgwm.py в crontab (пример см. в samples/crontab.sample).