Skip to main content

Command Palette

Search for a command to run...

Freepbx отказоустойчивый кластер, бесплатно

Updated
5 min read
Freepbx  отказоустойчивый кластер, бесплатно

Для реалезации отказоустойчевого кластера на Freepbx 16.0.40 будем использовать CARP протокол. Устанавливаем два сервера Freepbx на которых будет настроен отказоустойчивый кластер.

Freepbx01(Master) - 192.168.98.214

Freepbx02(Slave) - 192.168.98.215

HA(общий адрес) - 192.168.98.14

  1. Устанавливаем CARP на оба сервера:

yum install ucarp

Редактируем файлы конфигурации:

Freepbx01(Master) - 192.168.98.214

vi /etc/ucarp/vip-001.conf

VIP_ADDRESS="192.168.98.14"
ID=001
PASSFILE=/etc/ucarp/vip-001.pwd
BIND_INTERFACE="eth0"
SOURCE_ADDRESS="192.168.98.214"
OPTIONS="-k 2 --shutdown --preempt"

в файле /etc/ucarp/vip-001.pwd указывыем свой пароль (любой)

в файле vip-common.conf все коментируем

  • Повторяем все тоже самое на втором сервере

Freepbx02(Slave) - 192.168.98.215

vi /etc/ucarp/vip-001.conf

VIP_ADDRESS="192.168.98.14"
ID=001
PASSFILE=/etc/ucarp/vip-001.pwd
BIND_INTERFACE="eth0"
SOURCE_ADDRESS="192.168.98.215"
OPTIONS="-k 10 --shutdown"
  • Запускаем службу и добавляем в автозагрузку:

systemctl enable ucarp@001.service

systemctl start ucarp@001.service

systemctl daemon-reload

  • Проверяем работоспособность Carp, вводим ip a

  • Carp интерфейс появился 192.168.98.14. Также добавляю скрипт который будет мониторить состояние сервиса asterisk, и если по какой то причине он не работает, то интерфейс CARP будет отключен, соответственно все устройства переподключатся на резервный сервер, так как он станем Мастером.

  • vi /home/script/sevrice_up_down.sh

  • 
              #!/bin/bash
    
              while true; do
                  if ps -C asterisk >/dev/null 2>&1; then
                      sleep 10
                  else
                      sleep 10
                      if ps -C asterisk >/dev/null 2>&1; then
                          systemctl start ucarp@001.service
                          sleep 10
                          fwconsole reload
                      else
                          systemctl stop ucarp@001.service
                      fi
                  fi
              done
    

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

Также на одной из АТС у меня был SIP Trunk от провайдера. Так как провайдер ограничил нас одной регестрацией, добавляю в скрипт отключение транка в зависимости от статуса CARP IP.

  •         #!/bin/bash
    
            # Переменная для хранения предыдущего статуса IP-адреса
            previous_ip_status="absent"
    
            while true; do
                # Проверка наличия процесса asterisk
                if ps -C asterisk >/dev/null 2>&1; then
                    sleep 10
                else
                    sleep 10
                    # Если процесс asterisk не запущен, попытка его запуска
                    if ps -C asterisk >/dev/null 2>&1; then
                        systemctl start ucarp@001.service
                        sleep 10
                        fwconsole reload
                    else
                        systemctl stop ucarp@001.service
                    fi
                fi
    
                # Проверка наличия IP-адреса 192.168.98.14
                if ip a | grep  '192.168.98.14'; then
                    current_ip_status="present"
                else
                    current_ip_status="absent"
                fi
    
                # Управление транком в зависимости от статуса IP
                if [ "$current_ip_status" = "present" ]; then
                    fwconsole trunk --enable 1
                else
                    fwconsole trunk --disable 1
                fi
    
                # Если статус IP изменился, выполнить reload
                if [ "$previous_ip_status" != "$current_ip_status" ]; then
                    previous_ip_status="$current_ip_status"
                    sleep 5
                    fwconsole reload
                fi
            done
    
  • Делаем файл исполняемым:

    chmod 777 /home/script/sevrice_up_down.sh

  • Создаю службу автозапуска скрипта:

    vi /etc/systemd/system/sevrice_up_down.service

  •                   [Unit]
                      Description=sevrice_up_down
                      After=network.target
    
                      [Service]
                      User=root
                      ExecStart=/home/script/sevrice_up_down.sh
                      Restart=on-failure
    
                      [Install]
                      WantedBy=multi-user.target
    

    systemctl daemon-reload

    sudo systemctl enable sevrice_up_down.service

    sudo systemctl start sevrice_up_down.service

  • Сервис успешно запущен. Можно попробовать остановить Asterisk командой fwconsole stop , при этом ip carp должен перейти на ре зервный сервер. На этом с карпом мы закончили.

    1. Настраеваем Freepbx для синхронизации между собой.

      Первым делом нужно настроить доступ SSH. Для этого переходим на сервер Freepbx01(Master) - 192.168.98.214 и выполняем:

         sudo -u asterisk ssh-copy-id -i /home/asterisk/.ssh/id_rsa.pub root@SecondaryServer
      

      и введите пароль при появлении запроса.

      Если эта команда выполнена без ошибок, вы готовы к тестированию:

      В командной строке введите:

      ssh -i /home/asterisk/.ssh/id_rsa root@SecondaryServerIPЕсли все прошло хорошо, вы должны войти на дополнительный сервер.

      Настройка модуля хранилища файлов

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

      Нажав «Добавить SSH-сервер», вы можете добавить свой SSH-сервер для хранения резервной копии. Всякий раз, когда вы запускаете резервное копирование с сервером SSH, установленным в качестве местоположения хранилища файлов, файл резервной копии будет передан на путь к серверам SSH, который вы добавили в хранилище файлов. Если резервное копирование по какой-то причине не удалось или не удалось подключиться к SSH-серверу, резервная копия будет сохранена в локальной системе (/var/spool/asterisk/backup/имя_резервной_копии/файл_резервной копии).

      Переходим на Freepbx02(Slave) - 192.168.98.215 и идем в раздел Connectivity - API, нам нужно сгенерировать ключи.

      Нажимаем Machine-to-Machine app, в окне вводим Your App Name, Description и Allowed Scopes он должен быть:

      gql:backup:write

      Генерируются ключи и сохраняем их в свой файлик *.txt.

Переходим на каждый из серверов Freepbx и идем в раздел Settings-File-Local

Добавляем новое месторасположения бекапов:

_ASTSPOOLDIR_/backup

  • Переходим на Freepbx01(Master) - 192.168.98.214 и идем в раздел Store Admin-Backup & Restore там создаем новый бекап.

Даем имя бекапу, выбираем модули которые хотите бекапить. Важно отключить копирование двух модулей:

Backup & Restore

System Admin

В разделе Custom Files можно указать копирование дополнительных каталогов, например tftpboot если используется. Также настраивается уведомленя по почте. В разделе Storage Location указываем ранее созданое место для бекапов. Настраиваем Schedule and Maintenance по своим нуждам.

И теперь самы важный раздел, Warm Spare в котором мы должны ввести данные которые сохраняли в блокноте.

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

Доработака Freepbx (Sip&IAX2)

  1. Так как у нас будет использоватся Carp ip адрес как основной нужно до настроить Sip а у кого используется IAX2 то и его тоже.

    Переходим в Settings- Asterisk SIP Settings и указываем в качестве External Address адрес вашого CARP. В Local Networks указываем подсети с которых будет проводится регистрация sip клиентов.

    Для IAX2 переходим в транк и в Outgoing нужно дописать**:**

    sourceaddress=(Carp ip address) например sourceaddress=192.168.98.14

    Теперь наш транк будет отбащатся через адрес 192.168.98.14

Мы получили полностью отказоустойчивую АТС бесплатно.

######################

Обновление Freepbx

yum upgrade -y

fwconsole ma upgradeall

fwconsole chown

fwconsole reload

fwconsole chown

fwconsole reload

fwconsole versionupgrade --check

fwconsole versionupgrade --upgrade

fwconsole chown

fwconsole reload

reboot or fwconsole restart

Дополнительные настройки.

Zabbix

rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/7/x86_64/zabbix-release-6.0-4.el7.noarch.rpm

yum install zabbix-agent2

systemctl restart zabbix-agent2
systemctl enable zabbix-agent2

Скопировть конфиг с старого сервера

Tftp

sudo vi /etc/selinux/config
SELINUX=disabled

sudo yum install tftp tftp-server xinetd
sudo systemctl enable xinetd
sudo systemctl enable tftp
sudo systemctl restart xinetd

Vpn Up Down

Для выполнения (спец) скриптов от пользователя asterisk может понадобится интерпритатор.

yum install expect
проверяем
su - asterisk

Для некоторых скриптов добавляю права доступа в mcedit /etc/sudoers

root<-->ALL=(ALL) <---->ALL
pbx<------>ALL=(ALL)<----->ALL
zabbix<><------>ALL=NOPASSWD: /usr/sbin/asterisk
asterisk<------>ALL=(ALL) NOPASSWD: /home/script/disable_port12.sh, /home/script/shutdown_thinstantion.sh, /home/script/shutdown_thinstantion.sh_bk

Проверяем каждый скрипт в ручную!!!

Для фиксации ip которые попадают в БАН настраиваем лог агента. Установка..

pwd
/usr/src
yum localinstall nxlog-ce-3.2.2329_rhel7.x86_64.rpm
systemctl enable nxlog

Копируем конфиги /etc/nxlog

systemctl restart nxlog

More from this blog

IT Notes

21 posts