Страница 1 из 1

Учёт VoIP звонков на cisco

Добавлено: 27 дек 2014, 16:50
RomA
Введение:
В моей конфигурации 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;
Установим FreeRADIUS

Код: Выделить всё

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>                           │  
                        └──────────────────────────────────────────────────────────────────────────────┘  
Как всегда разрешаем запуск - для этого в /etc/rc.conf пишем radiusd_enable="YES" и приступаем к конфигурированию
Сначало /usr/local/etc/raddb/radiusd.conf - тут я правил только то, что касается sql, получив в итоге следующее

Код: Выделить всё

cat radiusd.conf | grep sql | grep -v '#'
	$INCLUDE sql.conf

Файл 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
Ну и clients.conf куда вписываем параметры соединения с Cisco

Код: Выделить всё

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']
2) Если там увидели проблемы со скулем - можно включить дебаг - для этого в файл /usr/local/etc/raddb/sql.conf добавляем

Код: Выделить всё

sqltrace = yes
sqltracefile = ${logdir}/sqltrace.sql
И смотрим какой же запрос радиус пытается засунуть в скуль - запросы будут писаться в файл /var/log/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
Если требуется параметр из Cisco-AVPair - тогда в файл /usr/local/etc/raddb/dictionary следует его описать, например так

Код: Выделить всё

ATTRIBUTE       peer-id      3007      string

Код: Выделить всё

Картинки:
Вот так это выглядит через phpMyAdmin
ciscocdr.jpg
ciscocdr1.jpg
Полезные ссылки:
http://www.it-support.kiev.ua/2011/03/cisco-cdr-radius/

VoIP на cisco (телефония)

Добавлено: 23 янв 2016, 10:16
RomA
Первый пост