Выпал на мою долю перевод компании на рельсы 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