Мысли по настройке asterisk

    Выпал на мою долю перевод компании на рельсы ip-телефонии  с собственной ip АТС. Вначале поставил сборку freepbx (на 6 центосе в сборке от хостера) "напосмотреть", основное все завелось, но когда немного начал вдаваться в детали, то он меня подразочаровал:

  1.  Например,  порт ssh я всегда меняю на нестандартный,  захотел заменить привязку порта у fail2ban для ssh с 22 на свой, в веб-интерфейсе этого нет, поэтому залез в консоль, поменял конфиг, но после этого при перезагрузке из веб-интерфейса fail2ban  успешно падал с ошибкой затирая мой конфиг. 
  2.  Также оказалось что из коробки fail2ban не блокирует перебор extensions и  паролей для asterisk, в логах ошибка вида "2015-01-05 20:37:07,270 fail2ban.filter : ERROR No 'host' found in '[] SECURITY[11464] res_security_log.c: SecurityEvent="InvalidPassword",EventTV="1420047663-535903",Severity="Error",Service="SIP",EventVersion="2",AccountID="8009.... REMOVED**/5060",Remote" . Лечится правкой регулярного выражения в /etc/fail2ban/filter.d/asterisk-security.conf.
  3.  Также не очень понятно как правильно интегрировать свои правила фаервола и fail2ban - при перезагрузке fail2ban из веб-интерфейса все правила затираются.
  4.  И особенно доставило падение астера при переводе звонка (для примера звоню с внутреннего 100 на внутренний 101, на 101  нажимаю 2 раза # потом городской номер, видно что идет процесс набора и после этого астер у меня всегда падал).

Статья не претендует на какую-то новизну, просто описывает мой личный опыт при разворачивании ip-телефонии, здесь не будет подробного howto, изложу лишь моменты на которые я обратил внимание.

    В качестве дистрибутива для чистого астериска была выбрана убунта 16.04 с 13 версией астериска в репах. В  debian jessie еще только 11, она м.б. плоха тем, что cdr-записях будет только одна запись для звонка (т.е. часть инфы о переводах, перехватах и пр. будет утеряна). Можно заниматься компиляцией как обычно принято в различных howto, но я принял решение что быстрее  и проще взять пакет из реп.

    Пропустим шаги установки софта, остановимся сразу на конфигурировании. Для настройки каркаса телефонии нам надо настроить внутр. телефоны, принять номер от оператора, настроить правила обработки исходящих/входящих вызовов. Настройка extensions проводится в файле /etc/asterisk/sip.conf, диалплан  - в /etc/asterisk/extensions.conf.

Все конфиги ниже относятся к sip.conf

                 общие настройки

[general]
context=public
allowguest=no                 
allowoverlap=no                
udpbindaddr=0.0.0.0            
tcpenable=no                   
tcpbindaddr=0.0.0.0            
transport=udp                  
srvlookup=yes     

            

 

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

 

;               -----    Templates    ------
[codecs](!)
    disallow=all
    allow=ulaw
    allow=alaw
    allow=g729

[sipphone](!)
    host=dynamic
    dtmfmode=rfc2833
    qualify=yes
    qualifyfreq=30
    type=friend
    nat=force_rport,comedia
    port=5060
    canreinvite=no
    callcounter=yes
    call-limit=3
    deny=0.0.0.0/0.0.0.0

[test](!)
    permit=указываем с какого ip будет регистрироваться телефон
    context=in_test

;;  Peers

 [101](codecs,sipphone,test)
    secret=PASS
    dial=SIP/101
    callerid=User1 <101>
    description=User1

[102](codecs,sipphone,test)
    secret=PASS
    dial=SIP/102
    callerid=User2 <102>
    description=User2

 

  и т.п.

Чтобы можно было звонить и принимать звонки на внешний номер, для начала необходимо настроить регистрацию на сервере провайдера (например принимаем номер 1111111 и 2222222):

 

;   number 1111111
register=1111111:PASSW@IP_PROVIDER/1111111

[provider_1111111]
    disallow=all
    allow=alaw
    allow=ulaw
    defaultuser=1111111
    type=peer
    secret=PASSW
    qualify=yes
    host=IP_PROVIDER
    fromuser=1111111
    dtmfmode=rfc2833
    insecure=invite
    qualify=yes
 ;context=from-prov

;   number 2222222
register=2222222:PASSW@IP_PROVIDER/2222222

[provider_2222222]
    disallow=all
    allow=alaw
    allow=ulaw
    defaultuser=2222222
    type=peer
    secret=PASSW
    qualify=yes
    host=IP_PROVIDER
     fromuser=2222222
    dtmfmode=rfc2833
    insecure=invite
    qualify=yes

 

В интернете написано, что register нужен для внешних входящих звонков к нам, а  пир  с названием  provider_1111111 для исходящих, т.е. по идее их можно использовать один отдельно от другого, но по факту необходимо прописывать и то и то (например чтобы делать только исходящие звонки), иначе работать не будет.

 

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

1) В sip.conf в пире [provider_1111111] мы не указываем никакой контекст, поэтому входящий звонок попадет в дефолтный контекст (в нашем случае public). Значит в extensions.conf указываем нечто подобное:

[public]

exten => 1111111,1,Set(CDR(userfield)=input)
same => n,MixMonitor(/records/${UNIQUEID}.wav)
same => n,Queue(120,rt,,,300)
same => n,Hangup

 2) если указать контекст в пире [provider_1111111] (например context=from-prov), тогда входящий звонок и обрабатываем в этом контексте:

[from-prov]

exten => 1111111,1,Set(CDR(userfield)=input)
same => n,MixMonitor(/records/${UNIQUEID}.wav)
same => n,Queue(120,rt,,,300)
same => n,Hangup

 

Так понимаю, больше всего принято использовать первый вариант (принимать в дефолтный контекст), второй вариант видел, что используется в freepbx.

 

 

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

Файл extensions.conf:

;;;;;;;;;;;;;;;;;             101,107 extensions       ;;;;;;;;;;;;;;;;;;
;city
exten => _[23]XXXXXX/_10[17],1,Set(CDR(userfield)=out_city)  ; указываем что данный dialplan сработает только для внутр. номеров 101 и 107
same => n,MixMonitor(/records/${UNIQUEID}.wav)
same => n,Dial(SIP/prov_1111111/${EXTEN},200,r)    ; указываем  что звонок на внешку пойдет через пир prov_1111111  с исходящим номером 1111111
same => n,Hangup

;mobile
exten => _89XXNXXXXXX/_10[17],1,Set(CDR(userfield)=out_mobile)
same => n,MixMonitor(/records/${UNIQUEID}.wav)
same => n,Dial(SIP/prov_1111111/${EXTEN},200,r) 
same => n,Hangup

 ;;;;;;;;;;;;;;;;;             102,105,106 extensions       ;;;;;;;;;;;;;;;;;;
;city
exten => _[23]XXXXXX/_10[256],1,Set(CDR(userfield)=out_city)     ; указываем что данный dialplan сработает только для внутр. номеров 102, 105,106
same => n,MixMonitor(/records/${UNIQUEID}.wav)
same => n,Dial(SIP/prov_2222222/${EXTEN},200,r)    ; указываем  что звонок на внешку пойдет через пир prov_2222222 с исходящим номером 2222222
same => n,Hangup

;mobile
exten => _89XXNXXXXXX/_10[256],1,Set(CDR(userfield)=out_mobile)
same => n,MixMonitor(/records/${UNIQUEID}.wav)
same => n,Dial(SIP/prov_2222222/${EXTEN},200,r)
same => n,Hangup

 

 

 

 

 

 

 

Please publish modules in offcanvas position.