• DevOps
  • Защита информации
  • ИТ-поддержка
  • Настройка кластера Asterisk с использованием VRRP

    Целью данной инструкции является организация отказоустойчивости телефонии с использованием резервного сервера и виртуального плавающего IP адреса.

    Настройку будем проводить на двух серверах CentOS 7 с уже установленным Asterisk.

    Выделено три IP адреса:

    • 192.168.0.1 и 192.168.0.2 – реальные адреса серверов;
    • 192.168.0.3 – виртуальный плавающий адрес для кластера телефонии.

    Первым делом установим на обе машины keepalived:

    yum -y install keepalived

    или же с исходников:

    cd ~
    wget https://www.keepalived.org/software/keepalived-2.1.5.tar.gz 
    tar xzvf keepalived*
    cd keepalived*
    ./configure
    make
    sudo make instal
    

    Не забываем добавить сервис в автозагрузку системы:

    systemctl enable keepalived

    Сервис ищет конфигурации в каталоге /etc/keepalived:

    mkdir -p /etc/keepalived 

    Переходим непосредственно к самим конфигурационным файлам:

    vim /etc/keepalived/keepalived.conf

    1) Настройка на основном сервере

    vrrp_script asterisk_self {         
           script "/usr/bin/killall -0 asterisk"  
           interval 2               
           fall 3               
           rise 2               
           weight -20           
    }
    vrrp_instance MSK-VoIP-Main {       
        state MASTER               
        interface eth01          
        virtual_router_id 10                         
        priority 101               
        unicast_src_ip 192.168.0.1          
        unicast_peer {          
        192.168.0.2             
            }                   
       advert_int 1 
       authentication {         
            auth_type PASS          
            auth_pass qwerty123
            }
        virtual_ipaddress {                            
            192.168.0.3/24             
            }
            track_script {              
                asterisk_self                
         }
      notify "/opt/keepalive_state.sh"    
    }
    

    Параметр weight может принимать как отрицательное, так и положительное значения. У MASTER сервера всегда значение priority, в рамках одного router id, будет более чем у BACKUP. Для корректной миграции IP при выполнении скрипта проверки должна выполняться формула:

    priority MASTER (+/-) weight < priority BACKUP

    Исключением является использование параметра nopreempt - означает, что если мастер пропал из сети, и был выбран новый мастер с меньшим приоритетом, то по возвращении старшего мастера, он останется в состоянии BACKUP. Т. е. если вы перезагрузили мастер, то он больше мастером не станет, пока новый мастер не отвалится. Если вы предпочитаете, чтобы мастером был какой-то конкретный сервер, то замените настройку nopreempt на preempt_delay.

    2) Настройка на бекап-сервере

    Настройка на второй мы не используем скрипт мониторинга. Изначально на резервном сервере статус устанавливается BACKUP и значение priority меньше чем на MASTER. Для unicast запросов меняем местами IP адреса. В остальном все аналогично мастеру.

    vrrp_instance MSK-VoIP-Rezerv {
        state BACKUP
        interface ens4
        virtual_router_id 10
        priority 99
        unicast_src_ip 192.168.0.2
        unicast_peer {
        192.168.0.1
            }
       advert_int 1
       authentication {
            auth_type PASS
            auth_pass qwerty123
            }
        virtual_ipaddress {
            192.168.0.3/24
            }
            notify "/opt/keepalive_state.sh"
    }
    

    При необходимости в /etc/keepalived/keepalived.conf возможно добавить отправку уведомлений на почту

    notification_email {
         admin@example.com
       }
       notification_email_from example-server@example.com
       smtp_server 10.5.5.25
       smtp_connect_timeout 30
       router_id LVS_DEVEL
    }
    

    Скрипт keepalive_state.sh в зависимости от состояния keepalived выполняет запуск или остановку Asterisk.

    Собственно, сам код:

    #!/bin/bash
    TYPE=$1
    NAME=$2
    STATE=$3
    case $STATE in
            "MASTER") /etc/init.d/asterisk start
                      exit 0
                      ;;
            "BACKUP") /etc/init.d/asterisk stop
                      exit 0
                      ;;
            "FAULT")  /etc/init.d/asterisk stop
                      exit 0
                      ;;
            *)        echo "unknown state"
                      exit 1
                      ;;
    esac
    

    Даем скрипту право на запуск:

    chmod +x /opt/keepalive_state.sh

    Добавляем правила в iptables (примеры правил):

    • при использовании multicast:
    iptables -A INPUT -i eth0 -d 224.0.0.0/8 -j ACCEPT
    iptables -A INPUT -p vrrp -i eth0 -j ACCEPT
    
    • при использовании unicast:
    iptables -A INPUT -i eth0 -d 192.168.0.1/24 -j ACCEPT 
    iptables -A INPUT -p vrrp -i eth0 -j ACCEPT
    

    Настройка со стороны Asterisk заключается только в привязке к нашему виртуальному IP.

    vim /etc/asterisk/sip.conf
    

    В секции general указываем:

    udpbindaddr=192.168.0.3
    tcpbindaddr=192.168.0.3
    

    Также необходимо настроить репликацию настроек Asterisk с основного сервера на резервный. Выполнить это можно с помощью связки утилит cron и rsync, предварительно настроив доступ по ssh между серверами по ключу. Добавляем задачу в cron:

    35 00 * * * rsync -av /etc/asterisk/ root@192.168.0.2:/etc/asterisk/
    

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

    В случае неполадок с основным сервером или сбоя Asterisk, виртуальный IP будет мигрировать на резервный сервер с автоматическим запуском Asterisk. При восстановлении работоспособности основного сервера на резервном Asterisk будет остановлен, а адрес вернется к MASTER серверу.

    Не нашли ответа на свой вопрос?
    Содержание