Yvision.kz
kk
Разное
Разное
399 773 постов42 подписчика
Всяко-разно
0
02:46, 30 января 2016

Asterisk — разные моменты

Blog post image

Некоторые маленькие моменты по IP АТС Asterisk. Постепенно буду дополнять разной маленькой инфой эту записку. Конечно эта инфа может быть ошибочной.

По умолчанию Asterisk использует кодек g722

  • Asterisk по умолчанию использует кодек g722. Поэтому ваш софтфон или аппаратный телефон должны поддерживать данный кодек. Если вы хотите просто поменять кодек, то при описании телефонной учетной записи укажите другой кодек, например g711 в файле sip.conf
[003]
t38pt_udptl=yes
callerid="Менеджер Айнура" <502>
disallow=all
username=102
secret=blah
username=003
secret=password
allow=alaw
allow=ulaw

Эта настройка для факса, мы переопределяем используемые кодеки, т. к. факсовый сигнал нормально проходит лишь при использовании кодека g711(alaw и ulaw) и t38pt_udptl=yes разрешает использование протокола t.38 для передачи факсов. В примере 003 - логин, 502 - номер телефона.

Вы можете указать просто использование кодека g711(alaw и ulaw).

С протоколом g722 совместимы софтфоны - PhonerLite, Blink, MicroSIP (g729), QuteCom (g729), tSIP (софтфон с BLF), Linphone

Включение режима отладки Debug в Asterisk

  • Включение отладочного (Debug) режима, чтобы определить что случилось с Asterisk, конечным оборудованием или SIP линией:

1. Вариант отладки SIP для пользователя номера user001:

CLI> sip set debug peer user001

2. Вариант отладки по IP адресу конечного устройства (компьютер с софтфон или аппаратный телефон) с заведомо известным IP адресом.

CLI> sip set debug ip 192.168.1.1

3. Вариант отладки всех SIP сообщений:

CLI> sip set debug on

Отключение отладки (во избежания переполнения места на HDD):

CLI> sip set debug off

4. Вариант, просмотри отладки в консоле Asterisk:

asterisk -rvvvv

5. И самый прикольный и информативный поиск логов, это запись в файл, например:

asterisk -r | tee 1.txt

Здесь в примере будет создан файл 1.txt и туда будут писаться логи.

6. Удобно также отслеживать активность номера через команду:

tail -f /var/log/asterisk/full | grep <вн. номер>

или

asterisk -rvvv | grep <вн. номер>

Например это нужно чтобы посмотреть как работает DND.

7. Логи пишутся в файлы /var/log/asterisk/* и выводятся в консоле

8. Отладка RTP трафика:

rtp set debug on

Показать список пользователей

CLI> sip show users - выводит информацию о SIP пользователях

CLI> sip show peers - показать существующие SIP екстеншены и их статус

CLI> sip show registry - отображает состояние зарегистрированных транков

CLI> sip show peer 100 - отображает информацию о конкретном SIP екстеншене

CLI> sip show user 100 – выводит информацию о конкретном SIP пользователе

CLI> sip show channels – отображение активных SIP каналов с указанием пользователя, идентификатора звонка и хоста пира.

Показать диалплан

CLI> dialplan show - показать текущий диалплан

CLI> dialplan show example - показать текущий диалплан контекста example

CLI> dialplan show 212@default - показать диалплан екстеншна 212 в контексте default

CLI> dialplan show 1000@ - поиск 1000 екстеншна во всех контекстах

Диагностика через WireShark

Иногда когда не известно что происходит c Asterisk, помогает анализатор трафика Wireshark.

Например при запуске в отладочном режиме, asterisk не показывает входящие вызовы. Провайдер в этом случае может быть совсем не виноват, когда вы думаете дело в нем. На самом деле звонки могут не поступать из за проблем Asterisk. Был случай когда упала база MySQL и звонки не шли. А также был случай когда у провайдера была привязка к другому IP адресу и коннекты не шли.

На сервере Asterisk введите:

# tcpdump -vvvvvvvv host 195.47.255.119 -s0 -w /tmp/kcell.pcap

Закачайте файл на ваш ПК с Windows или Linux c Gnome/KDE через WinSCP. Откройте его через меню "File -> Open", далее нажмите "VoIP Call"

Blog post image

Выбираем VoIP из меню Telephony

Blog post image

Здесь видим куда и откуда шли вызовы.

Нажав на один такой вызов, нам откроется вся сессия этого звонка с полями INVITE и т.д.

Blog post image

Вместо Wireshark и tcpdump, можно использовать tshark

Если появляется ошибка:

1. Retransmission timeout reached on transmission for seqno 102 (Critical Request) -- See https://wiki.asterisk.org/wiki/display/AST/SIP+Retransmissions

2. (cause 20 - Subscriber absent)

Мне помогло отключение проверки работы аппарата (если NAT ее включают):

qualify=no

Обычно мониторинг работы внутренних аппаратов наоборот включают, а проверку провайдерских линий отключают или делаю это через больший промеджуток времени, например qualify=3600. Провайдер может заблокировать ваш SIP аккаунт из за частых проверок его линии.

Если появляется ошибка - No path to translate from SIP

Значить нету кодека, например allow=g729. Попытайтесь использовать другой кодек allow=g722

Также ошибка "Unable to create channel of type 'SIP' (cause 20 - Subscriber absent)" может появляться когда вы звоните на телефон который не зарегистрирован на Asterisk'е.

3. Добавить в sip.conf секция [general]:

[general]
rtcachefriends=yes
rtsavesysname=yes
rtupdate=yes
rtautoclear=yes
ignoreregexpire=yes

Включение кодека g729 (CentOS x64):

Заходим в каталог с модулями Asterisk:

# cd /usr/lib64/asterisk/modules/

Качаем кодек:

# wget http://asterisk.hosting.lv/bin/codec_g729-ast130-gcc4-glibc-x86_64-pentium4.so

Переименуем файл в codec_g729.so

# mv codec_g729-ast130-gcc4-glibc-x86_64-pentium4.so codec_g729.so

И загружаем его в Asterisk:

# asterisk -r

*CLI> module load codec_g729.so

Встроенная справка по приложениям и функциям Asterisk

Полезно иногда смотреть MAN по программам и функциям:

*CLI> core show applications like APPNAME

*CLI> core show application APPNAME

*CLI> core show functions like FUNCNAME

*CLI> core show function FUNCNAME

где APPNAME это имя интересующей application, а FUNCNAME имя интересующей функции.

Вывод списка всех функций:

localhost*CLI> core show functions

Installed Custom Functions:
--------------------------------------------------------------------------------
AES_DECRYPT AES_DECRYPT(key,string) Decrypt a string encoded in base64 with AES given a 16 character key.
AES_ENCRYPT AES_ENCRYPT(key,string) Encrypt a string with AES given a 16 character key.
AGENT AGENT(AgentId[:item]) Gets information about an Agent
AMI_CLIENT AMI_CLIENT(loginname,field) Checks attributes of manager accounts
ARRAY ARRAY(var1[,var2[,...][,varN]]) Allows setting multiple variables at once.
************************************

*CLI> core show applications

-= Registered Asterisk Applications =-
AddQueueMember: Dynamically adds queue members.
ADSIProg: Load Asterisk ADSI Scripts into phone
AELSub: Launch subroutine built with AEL
AgentLogin: Login an agent.
AgentRequest: Request an agent to connect with the channel.
AGI: Executes an AGI compliant application.
AlarmReceiver: Provide support for receiving alarm reports from a burglar or fire alarm panel.
AMD: Attempt to detect answering machines.
Answer: Answer a channel if ringing.
Authenticate: Authenticate a user
************************************

Ошибка: res_hep.c:418 hep_queue_cb: Unable to send packet: Address Family

В консоли постоянно выскакивает ошибка, отключаем модуль в файле /etc/asterisk/modules.conf, добавляем в конец файла строчку:

noload => res_hep.so

Этим мы выключили модуль HEP, который нужен для захвата и хранения SIP трафика.

Теперь открываем файл /etc/asterisk/hep.conf и в нем меняем enabled = yes на enabled = no

И перезагружаем Asterisk:

# systemctl restart asterisk

Включение конференции

Иногда вам может понадобиться организовать конференц связь для нескольких абонентов. У нас такое частенько случалось, в групповом переговоре были задействованы разные люди, от специалистов до учредителей. Чтобы появилась такая функция потребуется:

Добавить конференц комнату на номер, например 600 файла meetme.conf

# vi /etc/asterisk/meetme.conf

[rooms]
conf => 600

Далее, в наш диалплан (extensions.conf) добавляем обращение к конференц номеру 600 с паролем 54321:

exten => 600,1,Answer()
exten => 600,n,Wait(1)
exten => 600,n,Authenticate(54321)
exten => 600,n,MeetMe(600,p)
exten => 600,n,Playback(vm-goodbye)
exten => 600,n,Hangup()

Включение маркировки пакетов TOS

Откройте файл /etc/asterisk/sip.conf и в секцию [general] добавьте строчки:

tos_sip=cs3
tos_audio=ef
tos_video=af41

Это поможет повысить качество голоса.

Если Астериск сильно тормозит, попробуйте выставить параметр в sip.conf:

srvlookup=no

А также не помешает поднять локальный кэширующий DNS сервер.

Подключение баз к Asterisk через ODBC драйвер

В ранних версиях Asterisk взаимодействовал с базой данных MySQL через драйвера cdr_mysql.so и cel_mysql.so.

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

# yum install unixODBC unixODBC-devel libtool-ltdl libtool-ltdl-devel mysql-connector-odbc

Иногда в /etc/odbcinst.ini требуется редактировать пути, по умолчанию у меня в нем было все нормально.

Далее проверяем видит ли ODBC дрвайвер для MySQL:

# odbcinst -q -d

[PostgreSQL]
[MySQL]

После редактируем файл /etc/odbc.ini - в этом файле разрешаем обращаться Asterisk к БД:

[MySQL-asteriskcdrdb]Description=MySQL connection to 'asterisk' database
driver=MySQL
server=localhost
database=asteriskcdrdb
Port=3306
Socket=/var/lib/mysql/mysql.sock
option=3

Теперь создаем базу asteriskcdrdb и внутри нее две таблицы cdr и cel:

# mysql -p

mysql> CREATE DATABASE asteriskcdrdb default charset utf8;
mysql> use asteriskcdrdb;
CREATE TABLE `cdr` (
`calldate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`clid` varchar(80) NOT NULL DEFAULT '',
`src` varchar(80) NOT NULL DEFAULT '',
`dst` varchar(80) NOT NULL DEFAULT '',
`dcontext` varchar(80) NOT NULL DEFAULT '',
`channel` varchar(80) NOT NULL DEFAULT '',
`dstchannel` varchar(80) NOT NULL DEFAULT '',
`lastapp` varchar(80) NOT NULL DEFAULT '',
`lastdata` varchar(80) NOT NULL DEFAULT '',
`duration` int(11) NOT NULL DEFAULT '0',
`billsec` int(11) NOT NULL DEFAULT '0',
`disposition` varchar(45) NOT NULL DEFAULT '',
`amaflags` int(11) NOT NULL DEFAULT '0',
`accountcode` varchar(20) NOT NULL DEFAULT '',
`uniqueid` varchar(32) NOT NULL DEFAULT '',
`userfield` varchar(255) NOT NULL DEFAULT '',
`did` varchar(50) NOT NULL DEFAULT '',
`recordingfile` varchar(255) NOT NULL DEFAULT '',
`cnum` varchar(40) NOT NULL DEFAULT '',
`cnam` varchar(40) NOT NULL DEFAULT '',
`outbound_cnum` varchar(40) NOT NULL DEFAULT '',
`outbound_cnam` varchar(40) NOT NULL DEFAULT '',
`dst_cnam` varchar(40) NOT NULL DEFAULT '',
KEY `calldate` (`calldate`),
KEY `dst` (`dst`),
KEY `accountcode` (`accountcode`),
KEY `uniqueid` (`uniqueid`),
KEY `did` (`did`)
)
CREATE TABLE `cel` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`eventtype` varchar(30) NOT NULL,
`eventtime` datetime NOT NULL,
`cid_name` varchar(80) NOT NULL,
`cid_num` varchar(80) NOT NULL,
`cid_ani` varchar(80) NOT NULL,
`cid_rdnis` varchar(80) NOT NULL,
`cid_dnid` varchar(80) NOT NULL,
`exten` varchar(80) NOT NULL,
`context` varchar(80) NOT NULL,
`channame` varchar(80) NOT NULL,
`src` varchar(80) NOT NULL,
`dst` varchar(80) NOT NULL,
`channel` varchar(80) NOT NULL,
`dstchannel` varchar(80) NOT NULL,
`appname` varchar(80) NOT NULL,
`appdata` varchar(80) NOT NULL,
`amaflags` int(11) NOT NULL,
`accountcode` varchar(20) NOT NULL,
`uniqueid` varchar(32) NOT NULL,
`linkedid` varchar(32) NOT NULL,
`peer` varchar(80) NOT NULL,
`userdeftype` varchar(255) NOT NULL,
`eventextra` varchar(255) NOT NULL,
`userfield` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `uniqueid_index` (`uniqueid`),
KEY `linkedid_index` (`linkedid`)
)

Не выходя из консоли MySQL создадим пользователя без пароля и дадим права на базу новую базу:

mysql> GRANT ALL PRIVILEGES ON asteriskcdrdb.* TO 'asteriskuser'@'localhost';
mysql> FLUSH PRIVILEGES;

Проверим как видит базу ODBC:

# echo "select 1" | isql -v MySQL-asteriskcdrdb
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL> select 1
+---------------------+
| 1 |
+---------------------+
| 1 |
+---------------------+
SQLRowCount returns 1
1 rows fetched

Редактируем файл ODBC в каталоге самого Asterisk, добавляем секцию:

# vim /etc/asterisk/res_odbc.conf

[asteriskcdrdb]
enabled=>yes
dsn=>MySQL-asteriskcdrdb
pooling=>no
limit=>1
pre-connect=>yes
username=>asteriskuser
password=>your_password_from_database

Перезапустим Asterisk:

# systemctl restart asterisk

Зайдем в CLI asterisk -r и введем команду для проверки:

# odbc show

После отредактируем файлы, связанные с CDR и CEL.

В файл /etc/asterisk/cdr_odbc.conf добавляем следующие строчки.

[asteriskcdrdb]
connection=asteriskcdrdb
loguniqueid=yes
table=cdr
alias start => calldate

В файл /etc/asterisk/cel_odbc.conf добавляем следующие строчки.

[cel]
connection=asteriskcdrdb
loguniqueid=yes
table=cel

Источники информации

1. Как понять что происходит на Asterisk'е

2. Отладка SIP протокола в Asterisk

3. CLI команды Asterisk и CLI

4. Диагностика Asterisk

5. Linksys auto provision

6. Отладка через WireShark

7. Сообщения протокола SIP

8. Asterisk видеокурс 20 уроков

9. http://www.linphone.org/releases/windows/Linphone-3.10.2-win32.exe

10. Fail2Ban and unauthorized invites

11. Securing your asterisk server.

12. ChallengeSent Asterisk

13. Настройка офисного комбайна на Asterisk (Голосовая почта, логирование звонков, синхронизация с Google Контакты)

14. Акулы в океане SIP-телефонии (Анализ дампа VoIP)

15. Анализ SIP в sngrep, sipgrep, ngrep

0
4668
1