Настройка TDM410P c asterisk

На тесте подключил китайскую плату TDM410P с четырьмя FXO-портами (красными) в PCI слот выключенного Ubuntu сервера.
Для удобства в Ubuntu на root пользователя можно переключится командой:

sudo -i

Включил сервер, выполнил команду которая отображает PCI устройства и шины:

lspci -v

В списке увидел установленную плату:

05:00.0 Ethernet controller: Digium, Inc. Wildcard TDM410 4-port analog card (rev 11)
Subsystem: Digium, Inc. Wildcard TDM410 4-port analog card
Physical Slot: 1
Flags: bus master, fast Back2Back, medium devsel, latency 64, IRQ 16
I/O ports at 1000 [size=256]
Memory at b1900000 (32-bit, non-prefetchable) [size=1K]
Expansion ROM at b1920000 [disabled] [size=128K]
Capabilities:
Kernel driver in use: wctdm24xxp
Kernel modules: wctdm24xxp

Зарегистрируем плату (параметры автоматически пропишутся в конфигурации /etc/dahdi/ и /etc/asterisk/dahdi-channels.conf):

dahdi_span_assignments -v auto
dahdi_genconf -v

Теперь плату можно увидеть командой:

dahdi_scan
dahdi_cfg -vvvv
lsdahdi

Если возникают ошибки при команде dahdi_cfg, то возможно не установлен dahdi, скомпилируем его например как я писал в статье указанной по ссылке ниже, тем более если китайская плата не имеет аппаратного шумоподавления то dahdi по любому придется собирать с Oslec.
Установка эхоподавителя Oslec и DAHDI

В файле /etc/dahdi/modules у меня указаны модули (последний wctdm24xxp как раз предназначен для TDM410P):

dahdi
dahdi_dummy
dahdi_transcode
wctdm24xxp

Подгрузить его можно командой:

modprobe wctdm24xxp

В файле /etc/dahdi/system.conf изменим зону на свою (она может сбросится после выполнения команды dahdi_genconf):

loadzone=ru
defaultzone=ru

В файле /etc/asterisk/modules.conf, в блоке [modules] должна быть строка для автозагрузки модуля chan_dahdi:

load => chan_dahdi.so

Из консоли asterisk его также можно загрузить, но он будет активен до перезапуска asterisk (первая команда открывает консоль asterisk, последняя выходит из него):

asterisk -rvv
module load chan_dahdi
quit

Перезапустить dahdi можно из консоли asterisk командой:

dahdi restart

Проверить статус можно командой (в списке должна быть Wildcard TDM410P):

dahdi show status

Я подключил к 1 порту платы провод с телефонным номером городской аналоговой линии (нумерация портов идет сверху вниз, порт что ближе к PCI слоту четвертый).
Теперь пропишем его в конце файла users.conf для первого порта (канала):

[trunk_1]
group = 1
context = DID_trunk_1
busydetect = yes
busycount = 3
busypattern = 500,500
ringtimeout = 8000
progzone = ru
usecallerid = yes
cidstart = ring
cidsignalling = bell
flash = 750
rxflash = 1250
callerid = asreceived
dahdichan = 1
trunkstyle = analog
allow = all
group = 1
pulsedial=yes
dialtone_detect=yes
signalling = fxs_ks
channel = 1

Замечу что без параметров pulsedial=yes, dialtone_detect=yes у меня не работали исходящие вызовы, а был слышен беспрерывный гудок линии (телефонные линии Укртелеком).

Добавим в конце файла /etc/asterisk/chan_dahdi.conf

context=DID_trunk_1
signalling=fxs_ks
group=1
channel => 1

Перезапустим asterisk чтобы применить изменения:

service asterisk restart

Подключимся к его консоли и посмотрим активен ли добавленный канал:

asterisk -vvr
dahdi show channels
dahdi show channel 1

Посмотреть уровень громкости и трафик на канале можно командой:

dahdi_monitor 1 -v

В файле extensions.conf укажем куда отправлять входящие звонки (в моём случае на IP телефон с номером 6001):

[DID_trunk_1]
exten => s,1,DIAL(SIP/6001,20)
exten => s,2,Hangup()

Также добавим к диалплану в котором настроены IP телефоны, строки с шаблонами номеров телефонов куда можно звонить (в первой строке например конкретно указан номер 21545, а во второй шаблон под который попадают все номера из пяти цифр начинающиеся на семерку, буква W означает паузу перед набором):

exten => _21545,1,Dial(DAHDI/1/W${EXTEN})
exten => _7XXXX,1,Dial(DAHDI/1/W${EXTEN})

Перезапустить asterisk можно командой:

service asterisk restart

Из консоли asterisk можно по отдельности подгружать конфиги, например sip и extensions:

asterisk -rvv
sip reload
dialplan reload
quit

Решение проблемы Asterisk — нет звука при звонке через NAT

Заметил недавно что нет звука при звонке с IP-телефона на другой IP-телефон которые оба находились за одним и тем же NAT (роутером).

По этому в конфигурации sip.conf для этих аккаунтов нужно указать что они за NAT, указав параметр:

nat=force_rport,comedia

Хочу заметить что значение yes для nat уже устарело начиная с версии Asterisk 11, по этому правильно будет как указанно выше.

И указать также на no для параметра directmedia, чтобы Asterisk не отправлял пакеты на тот же порт из которого их получил (что в моём случае и произошло, оба телефона подключались к Asterisk с одного IP, с одинаковыми портами):

directmedia=no

Все.

Установка эхоподавителя Oslec и DAHDI

Устанавливал как-то китайскую плату TDM410P для подключения аналоговых телефонных линий и связку Asterisk + Dahdi.
Так как плата не имеет аппаратного шумоподавления, пришлось ставить Oslec.
При звонках, со стороны аналогового телефона эха не было, а вот кто говорил в IP телефон — слышал сам себя.

Настраивал на Ubuntu Server, по этому переключимся сразу на пользователя root:

sudo -i

Следующими командами посмотрим установлен ли oslec и прочую информацию о dahdi и плате:

lsmod |grep oslec
lsmod |grep dahdi
updatedb
locate oslec | more
dahdi_cfg -vvvv

В моём случае первая команда ничего не показала, а последняя выдала в конце ошибку.
Это значит что Oslec не установлен, по этому будем собирать Dahdi вместе с Oslec.
Скачаем архив с исходниками ядра и распакуем их (командой ls посмотрим имя архива linux-source-*, в моём случае был линк на архив linux-source-3.13.0.tar.bz2):

cd /usr/src
aptitude install linux-source
tar xjf linux-source-3.13.0.tar.bz2

Скачаем исходники Dahdi и распакуем их в директорию /usr/src/dahdi/ (командой ls посмотри имя директории с распакованными файлами и последней командой переименуем её):

wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz
tar xvfz dahdi-linux-complete-current.tar.gz
rm -f dahdi-linux-complete-current.tar.gz
mv dahdi-linux-complete-2.11.1+2.11.1 dahdi

Создадим директорию для Oslec и скопируем нужные файлы из архива с исходниками ядра в директорию с исходниками Dahdi:

mkdir /usr/src/dahdi/linux/drivers/staging
cp -fR /usr/src/linux-source-3.13.0/drivers/staging/echo /usr/src/dahdi/linux/drivers/staging

Укажем в Kbuild что нужно собирать Dahdi вместе с Oslec:

sed -i "s|#obj-m += dahdi_echocan_oslec.o|obj-m += dahdi_echocan_oslec.o|" /usr/src/dahdi/linux/drivers/dahdi/Kbuild
sed -i "s|#obj-m += ../staging/echo/|obj-m += ../staging/echo/|" /usr/src/dahdi/linux/drivers/dahdi/Kbuild
echo 'obj-m += echo.o' > /usr/src/dahdi/linux/drivers/staging/echo/Kbuild

Приступим к компиляции и установке:

cd /usr/src/dahdi/linux
make
make install

На этом Dahdi с эхоподавителем Oslec установлены и готовы к работе.

Чтобы задействовать Oslec укажем его в файле /etc/dahdi/system.conf:

fxsks=1
echocanceller=oslec,1
fxoks=2
echocanceller=oslec,2
fxoks=3
echocanceller=oslec,3
fxoks=4
echocanceller=oslec,4

А также активируем в /etc/asterisk/chan_dahdi.conf:

echocancel=yes
echocancelwhenbriged=no
echotraining=no

Перезапустим Dadhi и Asterisk чтобы применить изменения в файлах конфигурации:

astersik -rvv
dahdi restart
quit
service asterisk restart

Все, на тесте при звонке через аналоговую линию иногда в первую секунду со стороны IP телефона можно услышать себя, но потом эхо отлично подавляется.

Решение ошибки Asterisk «Context ‘local’ tries to include nonexistent context ‘parkedcalls'»

Прикручивал как-то DAHDI плату и заметил следующую ошибку при входящем вызове с аналоговой линии:

WARNING[7238]: pbx.c:12314 ast_context_verify_includes: Context ‘local’ tries to include nonexistent context ‘parkedcalls’

Ошибка возникала из-за того что не загружен модуль res_parking, чтобы его загрузить, откроем консоль asterisk и выполним команду:

sudo asterisk -vvr
module load res_parking

Чтобы он автоматически загружался при запуске Asterisk, в файле /etc/asterisk/modules.conf, в блоке [modules] добавим строку:

load => res_parking.so

Мониторинг Asterisk в Zabbix

Наблюдать за Asterisk будем через Zabbix агент, для этого установим его на той же машине что и Asterisk.
Как устанавливать Zabbix агент я описывал в этих статьях:
Установка и настройка Zabbix агента в Ubuntu
Установка и настройка Zabbix агента в Windows

Можно также обойтись и без установки Zabbix агента, а получать информацию по SSH, для этого на удаленном Zabbix сервере нужно будет создать шаблон и добавлять в него SSH проверки с указанными ниже командами. Смотрите также мою статью — Настройка SSH проверок в Zabbix. Мне же проще использовать Zabbix агент.

Следующий код добавим в файл конфигурации Zabbix агента /etc/zabbix/, на той же машине что и Asterisk:

# total number of asterisk extensions
UserParameter=asterisk.extensions_total,asterisk -rx "database show" | grep DEVICE | grep dial | wc -l
# number of registered extensions
UserParameter=asterisk.extensions_online,asterisk -rx "database show" | grep Registry | wc -l
# number of offline extensions
UserParameter=asterisk.extensions_offline,asterisk -rx "sip show peers" | grep -v trunk | grep -v --text -i "sip peers" | grep -v Forceport | grep UNKNOW | wc -l
# total number of trunks
UserParameter=asterisk.trunks_total,asterisk -rx "sip show registry" | grep -v "registrations" | grep -v "Reg.Time" | wc -l
# number of registered trunks
UserParameter=asterisk.trunks_online,asterisk -rx "sip show registry" | grep -v "registrations" | grep -v "Reg.Time" | grep Registered | wc -l
# number of offline trunks
UserParameter=asterisk.trunks_offline,asterisk -rx "sip show registry" | grep -v "registrations" | grep -v "Reg.Time" | grep -v Registered | wc -l
# number of active calls
UserParameter=asterisk.active_calls,asterisk -rvvvvvx 'core show channels'| grep --text -i 'active call'| cut -c1
# number of seconds since last asterisk start
UserParameter=asterisk.uptime,asterisk -rx "core show uptime seconds" | grep --text -i "System uptime:" | gawk '{print $3}'
# number of asterisk processes
UserParameter=asterisk.asterisk_running,ps cax | grep asterisk | wc -l
# number of fail2ban processes
UserParameter=asterisk.fail2ban_running,ps cax | grep fail2ban | wc -l
# number of fail2ban active chains
UserParameter=asterisk.fail2ban_active,iptables -nL | grep Chain | grep -E 'f2b|fail2ban' | wc -l

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

asterisk -rx "database show" | grep DEVICE | grep dial | wc -l

И т.д., так как для некоторых команд нужны привилегии root, то разрешим выполнение от его имени указав параметр AllowRoot=1 в конфигурации Zabbix агента.
И перезапустим Zabbix агент чтобы применить изменения, в Ubuntu это так:

sudo /etc/init.d/zabbix-agent restart

Теперь осталось создать шаблон на Zabbix сервере и добавить в него элементы данных, триггеры и графики.
Можете также скачать и импортировать в Zabbix мой шаблон Template_App_Asterisk_Service (это еще не готовый вариант, так как постоянно его дописываю).

Решение ошибки Cpanel::MailAuth: cphulk blocked login for user to access service ‘mail’

Заметил как-то что не открывается почта из Cpanel через веб Roundcube, SquirrelMail, Horde, а также нельзя подключится к почте из PHP скриптов.

В логах /var/log/maillog увидел следующую ошибку:

Dec 14 13:21:04 hostname dovecot: auth: Error: Cpanel::MailAuth: cphulk blocked login for user ‘user@example.com’ to access service ‘mail’ from IP ‘::1’

Как выяснилось доступ к почте заблокировал cPHulk.
Сработала защита от атак на основе имени пользователя.

Если нужно блокировать атаки только по IP-адресам, то её в принципе можно выключить открыв панель «WHM» — «Защита от атак подбором cPHulk«, выключить переключатель напротив «Защита на основе имени пользователя» и нажать внизу кнопку «Сохранить«.

Текущие блокировки можно убрать открыв там же вкладку «Отчеты журнала» — «Удалить блоки и очистить отчеты»

Все.

Решение ошибки при запуске MC «Невозможно создать каталог «/home/user/.local/share/mc»»

Заметил как-то следующую ошибку при запуске MC (Midnight Commander):

Невозможно создать каталог «/home/user/.local/share/mc»

Причина ошибки скорее всего в том, что как только был установлен MC, его сразу запустили через sudo и в папке пользователя директории /.cache/, /.local/, и /.config/ были созданы от root пользователя, соответственно другие пользователи не получат к ним доступа.

Чтобы решить эту проблему укажем правильного владельца и группу на эти директории:

sudo chown -Rf user:user /home/user/.cache/
sudo chown -Rf user:user /home/user/.local/
sudo chown -Rf user:user /home/user/.config/

Теперь Midnight Commander должен запустится.