Выпал на мою долю перевод компании на рельсы ip-телефонии с собственной ip АТС. Вначале поставил сборку freepbx (на 6 центосе в сборке от хостера) "напосмотреть", основное все завелось, но когда немного начал вдаваться в детали, то он меня подразочаровал:
- Например, порт ssh я всегда меняю на нестандартный, захотел заменить привязку порта у fail2ban для ssh с 22 на свой, в веб-интерфейсе этого нет, поэтому залез в консоль, поменял конфиг, но после этого при перезагрузке из веб-интерфейса fail2ban успешно падал с ошибкой затирая мой конфиг.
- Также оказалось что из коробки 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.
- Также не очень понятно как правильно интегрировать свои правила фаервола и fail2ban - при перезагрузке fail2ban из веб-интерфейса все правила затираются.
- И особенно доставило падение астера при переводе звонка (для примера звоню с внутреннего 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