воскресенье, 20 марта 2016 г.

Настройка SIP-клиента и тестовых номеров в Asterisk

В прошлой заметке Автоматическая настройка голосового шлюза Cisco ATA 186 я рассказал о том, как можно сбросить настройки шлюза, автоматически настроить его при помощи DHCP- и TFTP-серверов, обновить прошивку и продиагностировать проблемы с помощью сетевого сниффера.

В этой заметке я рассмотрю первичную настройку Asterisk, подключение к системе голосового шлюза Cisco ATA 186 по протоколу SIP и настройку тестовых номеров для проверки связи между телефоном и Asterisk. Хочу сразу предупредить, что не имею опыта работы с Asterisk и поэтому приведённая здесь конфигурация может привести ко взлому телефонной системы, что при наличии подключения к сети телефонного оператора может вылиться в большие счета за международную связь.

1. Установка и включение
Установим Asterisk:
# apt-get install asterisk
Включим запуск asterisk при загрузке системы:
# systemctl enable asterisk.service
Запустим asterisk:
# systemctl start asterisk.service
Для подключения к консоли запущенного asterisk можно ввести следующую команду:
# asterisk -r
2. Подключение SIP-телефона

Для начала переименуем все имеющиеся файлы, настраивающие номерной план, чтобы имеющиеся в них настройки не мешали нам:
# cd /etc/asterisk/
# mv extensions.conf extensions.conf.sample
# mv extensions.lua extensions.lua.sample
# mv extensions.ael extensions.ael.sample
Создадим пустой номерной план в файле /etc/asterisk/extensions.conf:
[globals]

[general]

[internal]

[phones]
include => internal
Контексты globals и general являются специальными. Имена остальных контекстов - произвольные, но они могут состоять только из латинских букв и цифр, знаков подчёркивания и минусов. Пробелы в именах контекстов не допускаются. В контексте phones осуществляется включение всех настроек из контекста internal.

Чтобы новые настройки номерного плана вступили в силу, выполним такие команды:
# asterisk -rx 'module unload pbx_lua.so'
# asterisk -rx 'module unload pbx_ael.so'
# asterisk -rx 'module reload pbx_config.so'
# asterisk -rx 'dialplan reload'
Теперь переименуем файл /etc/asterisk/sip.conf, чтобы он не мешал нам:
# mv sip.conf sip.conf.sample
Вместо него создадим тестовый файл /etc/asterisk/sip.conf со следующим содержимым:
[general]
allowguest=no
alwaysauthreject=yes

[1000]
call-limit=1
type=friend
context=phones
host=dynamic
secret=password
deny=0.0.0.0/0.0.0.0
permit=169.254.254.0/24
Этот файл настраивает учётную запись SIP-клиента с идентификатором 1000 и паролем password. Клиент не имеет предопределённого адреса, его IP-адрес будет определяться в момент его регистрации в телефонной системе. При попытке позвонить с этого телефона будет использоваться контекст phones.

Реальный пароль я рекомендую сгенерировать, например, при помощи программы pwgen. Если пароль не будет вводиться человеком вручную, можно сгенерировать сразу длинный пароль. Следующая команда выдаст варианты 16-символьных паролей, один из которых можно выбрать:
$ pwgen 16
Для усиления безопасности в разделе general первой указана настройка allowguest=no, запрещающая Asterisk обрабатывать звонки от незарегистрированных в системе SIP-клиентов. По умолчанию Asterisk выдаёт разные ошибки для случая, когда SIP-клиент использовал несуществующее имя пользователя, и для случая, когда SIP-клиент использовал верное имя пользователя, но указал неправильный пароль. Такая настройка по умолчанию облегчает подбор имени пользователя и его пароля взломщику, поэтому второй настройкой alwaysauthreject=yes в разделе general мы задаём выдачу одинакового сообщения об ошибке в обоих случаях.

Настройка call-limit=1 разрешает клиенту звонить одновременно только на один номер. Позвонить на один номер, а затем в процессе разговора позвонить с использованием той же учётной записи на другой номер не получится. Не смотря на то, что у клиента нет постоянного IP-адреса, опции deny и permit разрешают клиенту регистрироваться только с IP-адресов в сети 169.254.254.0/24.

Чтобы новые настройки модуля sip вступили в силу, выполним команды:
# asterisk -rx 'reload chan_sip.so'
# asterisk -rx 'sip reload'
3. Настройка пакетного фильтра

Портом по умолчанию для SIP-клиентов на Asterisk является UDP-порт 5060. Для голосового трафика между Asterisk и SIP-клиентами используются UDP-порты с 10000 по 20000. В этом можно убедиться, заглянув в файл /etc/asterisk/rtp.conf, содержимое которого, если из него удалить комментарии, сведётся к следующим строчкам:
[general]
rtpstart=10000
rtpend=20000
Таким образом, чтобы клиенты из сети 169.254.254.0/24 через интерфейс br0 смогли работать с Asterisk, нужно выполнить такую команду:
# iptables -A INPUT -i br0 -s 169.254.254.0/24 -d 169.254.254.1 -p udp -m multiport --dports 5060,10000:20000 -j ACCEPT
Предполагается, что iptables настроен в режиме учёта состояния подключений, для чего где-то в начале правил должна быть настроена команда, которая умеет пропускать однажды разрешённый трафик и ответный трафик:
# iptables -I INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
После этого можно попробовать посмотреть список зарегистрированных на Asterisk SIP-клиентов:
# asterisk -rx 'sip show peers'
Name/username             Host                                    Dyn Forcerport Comedia    ACL Port     Status      Description                      
1000/1000                 169.254.254.8                            D  Auto (No)  No          A  5060     Unmonitored                                  
1 sip peers [Monitored: 0 online, 0 offline Unmonitored: 1 online, 0 offline]
4. Тестовый номер 500. Проигрывание музыки

Наш первый номер в номерном плане будет просто воспроизводить музыку позвонившему абоненту. Для этого сначала установим пакеты, содержащий музыкальные файлы:
# apt-get install asterisk-moh-opsound-gsm asterisk-moh-opsound-g722 asterisk-moh-opsound-wav
Теперь добавим в контекст internal номерного плана в файле /etc/asterisk/extensions.conf следующую строчку:
exten => 500,1,MusicOnHold()
Она предписывает воспроизвести музыку абоненту, позвонившему на номер 500. Чтобы новые настройки вступили в силу, перезагрузим номерной план и модуль moh:
# asterisk -rx 'dialplan reload'
# asterisk -rx 'moh reload'
Теперь можно попробовать поднять трубку телефона и набрать номер 500. Если в трубке начала воспроизводиться музыка, то тест успешно пройден.

4. Тестовый номер 501. Эхо-тест

Второй тестовый номер будет воспроизводить фразу о начале эхо-теста, затем повторять с небольшой задержкой всё произнесённое в трубку. Чтобы завершить эхо-тест, можно сразу повесить трубку, а можно нажать клавишу с решёткой. В этом случае будет воспроизведена фраза о завершении эхо-теста, после чего телефонная станция повесит трубку. Для начала установим пакеты, содержащие голосовые файлы на русском языке:
# apt-get install asterisk-core-sounds-ru-gsm asterisk-core-sounds-ru-g722 asterisk-core-sounds-ru-wav
Теперь добавим в файл /etc/asterisk/sip.conf к настройкам SIP-клиента ещё одну строчку, которая задаёт язык абонента:
language=ru
Добавим в контекст internal номерного плана ещё один тестовый номер:
exten => 501,1,Playback(demo-echotest)
exten => 501,n,Echo()
exten => 501,n,Playback(demo-echodone)
Осталось перезагрузить модули, настройки которых изменялись:
# asterisk -rx 'reload chan_sip.so'
# asterisk -rx 'reload app_playback.so'
# asterisk -rx 'dialplan reload'
# asterisk -rx 'sip reload'
Теперь можно попробовать поднять трубку телефона и набрать номер 501. В трубке должна прозвучать фраза о начале эхо-теста. Потом, если всё настроено правильно, в трубке можно будет услышать эхо собственного голоса. Для завершения теста можно нажать решётку или повесить трубку.

На этом пока всё. Буду рад услышать конструктивную критику, замечания и предложения.

Комментариев нет: