Учёт VoIP звонков на cisco
Добавлено: 27 дек 2014, 16:50
Введение:
В моей конфигурации cisco является центральным устройством телефонии, связывающим во едино множество разных АТС. На каких то из них можно вести статистику, на каких-то нет. Кто-то работает по sip а кто-то по h323 - в общем такой центр, где видна вся телефония. Именно из этой ситуации вытекло решение мониторить звонки на этой железке - потому что если что где и случится - то тут оно точно отобразится )))
Дано:
1) Cisco IOS Software, C2900 Software (C2900-UNIVERSALK9-M), Version 15.2(4)M7, RELEASE SOFTWARE (fc2)
2) FreeBSD 10.1-STABLE
Краткое содержание:
Писать звонки будем через FreeRADIUS v2 в MySQL. MySQL выбрана потому что она уже есть и работает
Схема работы:
Cisco==>MySQL<==>WEBstats<==>Пользователь
Решение:
Как уже говорилось MySQL у меня уже установлен и работает, потому его установку я пропускаю. Она описана вот тут так же полагаю что пользователя для радиуса создать вы тоже сможите. Потому тут привожу только создание таблицы
Установим FreeRADIUS
Выбираем БД, с какой хотим работать
Как всегда разрешаем запуск - для этого в /etc/rc.conf пишем radiusd_enable="YES" и приступаем к конфигурированию
Сначало /usr/local/etc/raddb/radiusd.conf - тут я правил только то, что касается sql, получив в итоге следующее
Файл sql.conf я привёл к виду:
Дальше dictionary
Ну и clients.conf куда вписываем параметры соединения с Cisco
Запускаем радиус и по идее всё должно работать.
Теперь приступим к настройке Cisco
Траблешутинг:
Конечно же обычно всё сразу не работает, или нужно что-то сверх того, что имеем - потому данный раздел актуален
1) Первым делом смотрим в лог радиуса /var/log/radius.log туда он будет писать что конкретно ему не нравится - выглядеть это будет как-то так
2) Если там увидели проблемы со скулем - можно включить дебаг - для этого в файл /usr/local/etc/raddb/sql.conf добавляем
И смотрим какой же запрос радиус пытается засунуть в скуль - запросы будут писаться в файл /var/log/sqltrace.sql примерно так
Дальше можно скормить этот запрос скулю и получить более детальную ошибку
3) Возможно каких-то параметров вам не хватает - это можно поправить - смотрим файл /var/log/radacct/ВАШ_IP/detail-ДАТА - там можно подсмотреть все параметры, которые циска отдаёт радиусу - выглядит это так:
Если требуется параметр из Cisco-AVPair - тогда в файл /usr/local/etc/raddb/dictionary следует его описать, например так
Вот так это выглядит через phpMyAdmin
Полезные ссылки:
http://www.it-support.kiev.ua/2011/03/cisco-cdr-radius/
В моей конфигурации cisco является центральным устройством телефонии, связывающим во едино множество разных АТС. На каких то из них можно вести статистику, на каких-то нет. Кто-то работает по sip а кто-то по h323 - в общем такой центр, где видна вся телефония. Именно из этой ситуации вытекло решение мониторить звонки на этой железке - потому что если что где и случится - то тут оно точно отобразится )))
Дано:
1) Cisco IOS Software, C2900 Software (C2900-UNIVERSALK9-M), Version 15.2(4)M7, RELEASE SOFTWARE (fc2)
2) FreeBSD 10.1-STABLE
Краткое содержание:
Писать звонки будем через FreeRADIUS v2 в MySQL. MySQL выбрана потому что она уже есть и работает
Схема работы:
Cisco==>MySQL<==>WEBstats<==>Пользователь
Решение:
Как уже говорилось MySQL у меня уже установлен и работает, потому его установку я пропускаю. Она описана вот тут так же полагаю что пользователя для радиуса создать вы тоже сможите. Потому тут привожу только создание таблицы
Код: Выделить всё
CREATE TABLE `cdr` (
`calldate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`pass` tinyint(4) DEFAULT NULL,
`src` varchar(80) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`dst` varchar(80) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`duration` int(11) NOT NULL DEFAULT '0',
`disposition` varchar(45) NOT NULL DEFAULT '',
`uniqueid` varchar(32) NOT NULL DEFAULT '',
`channel` varchar(80) NOT NULL DEFAULT '',
`chann_in` varchar(80) NOT NULL DEFAULT '',
`clid` varchar(80) NOT NULL DEFAULT '',
`lastapp` varchar(80) NOT NULL DEFAULT '',
`lastdata` varchar(80) NOT NULL DEFAULT '',
`userfield` varchar(80) NOT NULL DEFAULT '',
`accountcode` varchar(80) NOT NULL DEFAULT '',
`port` int(5) NOT NULL,
`username` varchar(80) NOT NULL DEFAULT '',
`originate` varchar(80) NOT NULL DEFAULT '',
`confid` varchar(40) NOT NULL DEFAULT '',
`portid` varchar(40) NOT NULL DEFAULT '',
`portin` varchar(40) NOT NULL DEFAULT '',
`disconnect_text` varchar(50) NOT NULL DEFAULT '',
`coder_type_rate` varchar(40) NOT NULL DEFAULT '',
`early_packets` int(11) DEFAULT NULL,
`late_packets` int(11) DEFAULT NULL,
`lost_packets` int(11) DEFAULT NULL,
`remote_media_address` varchar(15) DEFAULT '',
`gw_collected_cdn` varchar(40) DEFAULT '',
`round_trip_delay` varchar(10) DEFAULT '',
`call_id` varchar(80) DEFAULT '',
KEY `calldate` (`calldate`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Код: Выделить всё
cd /usr/ports/net/freeradius2
make install clean
Код: Выделить всё
┌──────────────────────────── freeradius-2.2.6_2 ──────────────────────────────┐
│ ┌──────────────────────────────────────────────────────────────────────────┐ │
│ │ [ ] DEVELOPER Enable developer options │ │
│ │ [x] DHCP With DHCP support (EXPERIMENTAL) │ │
│ │ [ ] DOCS Build and/or install documentation │ │
│ │ [ ] EDIR Enable eDirectory support (implies LDAP) │ │
│ │ [ ] EXPERIMENTAL Build experimental modules │ │
│ │ [ ] FIREBIRD With Firebird database support (EXPERIMENTAL) │ │
│ │ [ ] HEIMDAL With Heimdal Kerberos support │ │
│ │ [ ] HEIMDAL_PORT With Heimdal Kerberos from ports │ │
│ │ [ ] KERBEROS Kerberos support │ │
│ │ [ ] LDAP LDAP protocol support │ │
│ │ [x] MYSQL MySQL database support │ │
│ │ [ ] OCI8 With Oracle support (currently experimental) │ │
│ │ [x] PERL Perl scripting language support │ │
│ │ [ ] PGSQL PostgreSQL database support │ │
│ │ [x] PYTHON Python bindings or support │ │
│ │ [ ] RUBY Ruby bindings or support │ │
│ │ [x] SSL_PORT Use OpenSSL from the ports collection │ │
│ │ [ ] UDPFROMTO Compile in UDPFROMTO support │ │
│ │ [ ] UNIXODBC With unixODBC database support │ │
│ │ [x] USER Run as user freeradius, group freeradius │ │
│ └──────────────────────────────────────────────────────────────────────────┘ │
├──────────────────────────────────────────────────────────────────────────────┤
│ < OK > <Cancel> │
└──────────────────────────────────────────────────────────────────────────────┘
Сначало /usr/local/etc/raddb/radiusd.conf - тут я правил только то, что касается sql, получив в итоге следующее
Код: Выделить всё
cat radiusd.conf | grep sql | grep -v '#'
$INCLUDE sql.conf
Код: Выделить всё
cat sql.conf | grep -v '#' | sed -e '/^$/d'
sql {
database = "mysql"
driver = "rlm_sql_${database}"
server = "localhost"
login = "ciscocdr"
password = "P@$$w0rd"
radius_db = "radius"
sqltrace = no
num_sql_socks = ${thread[pool].max_servers}
connect_failure_retry_delay = 60
lifetime = 0
max_queries = 0
nas_table = "nas"
sql_user_name = "%{User-Name}"
accounting_start_query = "INSERT INTO cdr \
(uniqueid, calldate, src, dst, channel, disposition, clid, userfield, lastapp, lastdata, username,confid,portid,call_id) \
VALUE ('%{Acct-Unique-Session-Id}','%S','%{Calling-Station-Id}','%{Called-Station-Id}','%{h323-Call-Type}', \
'%{h323-call-origin}','%{NAS-IP-Address}','%{Acct-Session-Id}','%{Acct-Terminate-Cause}','%{Acct-Status-Type}',\
'%{User-Name}','%{h323-conf-id}','%{NAS-Port-Id}','%{call-id}')"
accounting_stop_query = "UPDATE cdr SET \
duration = '%{Acct-Session-Time}', dst='%{Called-Station-Id}', \
port='%{session-protocol}',channel='%{h323-call-type}',chann_in='%{h323-remote-address}', \
disposition='%{h323-call-origin}', clid='%{NAS-IP-Address}',accountcode='%{peer-id}', \
lastapp='%{Acct-Terminate-Cause}',lastdata='%{Acct-Status-Type}', originate='%{User-Name}', \
disconnect_text='%{disconnect-text}',coder_type_rate='%{coder-type-rate}', \
early_packets='%{early-packets}',late_packets='%{late-packets}', lost_packets='%{lost-packets}', \
remote_media_address='%{remote-media-address}', gw_collected_cdn='%{gw-collected-cdn}', \
round_trip_delay='%{round-trip-delay}' \
WHERE uniqueid='%{Acct-Unique-Session-Id}' AND userfield='%{Acct-Session-Id}'"
}
Дальше dictionary
Код: Выделить всё
ATTRIBUTE disconnect-text 3000 string
ATTRIBUTE coder-type-rate 3001 string
ATTRIBUTE early-packets 3002 string
ATTRIBUTE late-packets 3003 string
ATTRIBUTE lost-packets 3004 string
ATTRIBUTE gw-collected-cdn 3005 string
ATTRIBUTE round-trip-delay 3006 string
ATTRIBUTE peer-id 3007 string
Код: Выделить всё
client 192.168.10.1 {
secret = P@$$w0rd123
shortname = CiscoVoIP
}
Теперь приступим к настройке Cisco
Код: Выделить всё
aaa new-model
aaa authentication login h323 group radius
aaa authorization exec h323 group radius
aaa accounting connection h323 start-stop group radius
gw-accounting aaa
acct-template callhistory-detail
radius-server attribute 31 send nas-port-detail
radius-server host Radius 192.168.10.2 auth-port 1812 acct-port 1813
radius-server key 7 P@$$w0rd123
radius-server vsa send accounting
radius-server vsa send authentication
Конечно же обычно всё сразу не работает, или нужно что-то сверх того, что имеем - потому данный раздел актуален
1) Первым делом смотрим в лог радиуса /var/log/radius.log туда он будет писать что конкретно ему не нравится - выглядеть это будет как-то так
Код: Выделить всё
Wed Jan 14 10:26:49 2015 : Error: rlm_sql_mysql: Cannot store result
Wed Jan 14 10:26:49 2015 : Error: rlm_sql_mysql: MySQL error 'Data too long for column 'disconnect_text' at row 1724'
Wed Jan 14 10:31:59 2015 : Info: [sql] stop packet with zero session length. [user 'LDKVOIB', nas '192.168.10.1']
Код: Выделить всё
sqltrace = yes
sqltracefile = ${logdir}/sqltrace.sql
Код: Выделить всё
INSERT INTO cdr (uniqueid, calldate, src, dst, channel, disposition, clid, userfield, lastapp, lastdata, username,confid,portid,call_
id) VALUE ('366e9413681018dc','2015-01-14 10:36:15','761234','89191234567','VoIP', 'originate','192.168.10.1','0000CB3B','','Start','2
33400','DAB8081D 9AF611E4 A747B662 71E2B370','','DAB9406D-9AF611E4-A74DB662-71E2B370@172.29.32.1');
3) Возможно каких-то параметров вам не хватает - это можно поправить - смотрим файл /var/log/radacct/ВАШ_IP/detail-ДАТА - там можно подсмотреть все параметры, которые циска отдаёт радиусу - выглядит это так:
Код: Выделить всё
Wed Jan 14 10:40:04 2015
Acct-Session-Id = "0000CB85"
h323-setup-time = "10:40:04.589 MSK Wed Jan 14 2015"
h323-gw-id = "voip-gate.cz6.ru"
h323-conf-id = "638E13CF 9AF711E4 A7C5B662 71E2B370"
h323-call-origin = "originate"
h323-call-type = "VoIP"
Cisco-AVPair = "h323-incoming-conf-id=638E13CF 9AF711E4 A7C5B662 71E2B370"
Cisco-AVPair = "feature-vsa=fn:TWC,ft:01/14/2015 10:40:04.585,cgn:761234,cdn:89191234567,frs:0,fid:109747,fcid:638E13CF9AF711
E4A7C5B66271E2B370,legID:34E0D"
Called-Station-Id = "89191234567"
Cisco-AVPair = "call-id=638F4C1F-9AF711E4-A7CBB662-71E2B370@172.29.32.1"
Cisco-AVPair = "subscriber=Unknown"
Cisco-AVPair = "session-protocol=sipv2"
Cisco-AVPair = "gw-rxd-cdn=ton:0,npi:0,#:89191234567"
User-Name = "1234"
Cisco-AVPair = "connect-progress=Call Up"
Acct-Authentic = Local
Acct-Status-Type = Start
Calling-Station-Id = "761234"
Service-Type = Login-User
NAS-IP-Address = 192.168.10.1
Acct-Delay-Time = 0
h323-incoming-conf-id = "638E13CF 9AF711E4 A7C5B662 71E2B370"
call-id = "638F4C1F-9AF711E4-A7CBB662-71E2B370@172.29.32.1"
subscriber = "Unknown"
session-protocol = "sipv2"
gw-rxd-cdn = "ton:0,npi:0,#:89191234567"
Acct-Unique-Session-Id = "4a26f8a43a987b55"
Timestamp = 1421221204
Код: Выделить всё
ATTRIBUTE peer-id 3007 string
Код: Выделить всё
Картинки:
http://www.it-support.kiev.ua/2011/03/cisco-cdr-radius/