В продолжении статьи Настройка Cisco AS5350 в качестве VoIP-шлюза.
Имеем:
- Cisco AS5350 (VoIP-шлюз)
- Сервер FreeBSD с установленным freeradius
Прикручиваем RADIUS к AS5350 для сохранения информации о совершаемых VoIP-звонках. log voip calls, log ip voip calls
Основная задача это обеспечение возможности однозначного сопоставления IP-шной и TDM-ной частей (legs) VoIP-звонка, а также логирование IP-адресов, с которых производятся звонки через наш VoIP-шлюз, что по умолчанию не делается.
Я не буду подробно на этом останавливаться и просто приведу настройки Cisco в части акаутинга и radius:
aaa new-model
aaa authorization exec h323 group radius local
aaa authorization exec sip group radius local
aaa authorization network default group radius local
aaa authorization network h323 group radius local
aaa accounting delay-start
aaa accounting exec default start-stop group radius
aaa accounting exec h323 start-stop group radius
aaa accounting exec sip start-stop group radius
aaa accounting network default start-stop group radius
aaa accounting network h323 start-stop group radius
aaa accounting network sip start-stop group radius
aaa accounting connection h323 start-stop group radius
aaa accounting connection sip start-stop group radius
aaa nas port extended
aaa session-id common
gw-accounting aaa
ip radius source-interface FastEthernet0/0
radius-server host 1.1.1.2 auth-port 1812 acct-port 1813
radius-server timeout 30
radius-server key 7 10491D54261E210823493A2A373B
radius-server vsa send accounting
Обратите внимание на команду на VoIP-шлюзе Cisco:
radius-server vsa send accounting
Благодаря ей VoIP-шлюз будет передавать нужные нам атрибуты, определенные производителем (так называемые Vendor-Specific Attributes), а именно:
- h323-incoming-conf-id — ID звонка
- h323-remote-address — IP, с которого/на который был звонок
- iphop — этот атрибут заполняется при исходящих из IP-сетей звонках количеством хопов до IP-адреса звонящего и их IP-адресами.
Увидеть что Cisco отдает Radius`у можно выполнив в её консоли команды:
terminal monitor
debug radius
Вот пример вывода:
RADIUS(000B0086): Send Accounting-Request to 1.1.1.2:1813 id 1646/229, len 1084
RADIUS: authenticator 44 55 FD 7F DC D2 19 C3 - 3D 1B D2 B1 82 E6 C4 52
RADIUS: Acct-Session-Id [44] 10 "001069EA"
RADIUS: Calling-Station-Id [31] 9 "3332211"
RADIUS: Called-Station-Id [30] 13 "89259998877"
RADIUS: Vendor, Cisco [26] 66
RADIUS: Cisco AVpair [1] 60 "call-id=93FA01A7-1FD111E0-B101EAE7-244362EB@1.1.1.194"
RADIUS: Vendor, Cisco [26] 21
RADIUS: Cisco AVpair [1] 15 "iphop=count:1"
RADIUS: Vendor, Cisco [26] 33
RADIUS: Cisco AVpair [1] 27 "iphop=hop1:1.1.1.194"
RADIUS: Vendor, Cisco [26] 56
RADIUS: h323-setup-time [25] 50 "h323-setup-time=14:29:41.703 MSK Sat Jan 15 2011"
RADIUS: Vendor, Cisco [26] 28
RADIUS: h323-gw-id [33] 22 "h323-gw-id=as5350."
RADIUS: Vendor, Cisco [26] 56
RADIUS: Conf-Id [24] 50 "h323-conf-id=93F51D6D 1FD111E0 99AD0014 F26ABCA0"
RADIUS: Vendor, Cisco [26] 31
RADIUS: h323-call-origin [26] 25 "h323-call-origin=answer"
RADIUS: Vendor, Cisco [26] 27
RADIUS: h323-call-type [27] 21 "h323-call-type=VoIP"
RADIUS: Vendor, Cisco [26] 65
RADIUS: Cisco AVpair [1] 59 "h323-incoming-conf-id=93F51D6D 1FD111E0 99AD0014 F26ABCA0"
RADIUS: Vendor, Cisco [26] 26
RADIUS: Cisco AVpair [1] 20 "subscriber=Unknown"
RADIUS: Vendor, Cisco [26] 30
RADIUS: Cisco AVpair [1] 24 "session-protocol=sipv2"
RADIUS: Vendor, Cisco [26] 44
RADIUS: Cisco AVpair [1] 38 "gw-rxd-cdn=ton:0,npi:0,#:89259998877"
RADIUS: Vendor, Cisco [26] 148
RADIUS: Cisco AVpair [1] 142 "feature-vsa=fn:TWC,ft:01/15/2011 14:29:41.703,cgn:3803234,cdn:89259998877,frs:0,fid:730309,fcid:93F51D6D1FD111E099AD0014F26ABCA0,legID:B3920"
RADIUS: Vendor, Cisco [26] 58
RADIUS: h323-connect-time [28] 52 "h323-connect-time=14:29:52.352 MSK Sat Jan 15 2011"
RADIUS: Acct-Input-Octets [42] 6 144960
RADIUS: Acct-Output-Octets [43] 6 167360
RADIUS: Acct-Input-Packets [47] 6 906
RADIUS: Acct-Output-Packets [48] 6 1046
RADIUS: Acct-Session-Time [46] 6 18
RADIUS: Vendor, Cisco [26] 61
RADIUS: h323-disconnect-tim[29] 55 "h323-disconnect-time=14:30:10.517 MSK Sat Jan 15 2011"
RADIUS: Vendor, Cisco [26] 32
RADIUS: h323-disconnect-cau[30] 26 "h323-disconnect-cause=10"
RADIUS: Vendor, Cisco [26] 42
RADIUS: h323-remote-address[23] 36 "h323-remote-address=1.1.1.194"
RADIUS: Vendor, Cisco [26] 24
RADIUS: Cisco AVpair [1] 18 "release-source=3"
RADIUS: Vendor, Cisco [26] 28
RADIUS: h323-voice-quality [31] 22 "h323-voice-quality=0"
RADIUS: Vendor, Cisco [26] 43
RADIUS: Cisco AVpair [1] 37 "remote-media-address=1.1.1.194"
RADIUS: Vendor, Cisco [26] 50
RADIUS: Cisco AVpair [1] 44 "gw-rxd-cgn=ton:0,npi:0,pi:0,si:0,#:3332211"
RADIUS: User-Name [1] 9 "3332211"
RADIUS: Acct-Status-Type [40] 6 Stop [2]
RADIUS: Service-Type [6] 6 Login [1]
RADIUS: NAS-IP-Address [4] 6 1.1.1.3
RADIUS: Acct-Delay-Time [41] 6 0
RADIUS: Received from id 1646/229 1.1.1.2:1813, Accounting-response, len 20
Что ж, для решения основной поставленной перед нами задачи достаточно выполнить следующее:
в /usr/local/etc/raddb/radiusd.conf в секции preprocess указать, что нам нужно преобразовывать VSA :
preprocess {
with_cisco_vsa_hack = yes
}
Radius разбирает Vendor-Specific Attributes благодаря словарям, которые расположены в папке /usr/local/share/freeradius, в частности файл-словарь по cisco.
dictionary.cisco:
VENDOR Cisco 9
#
# Standard attribute
#
BEGIN-VENDOR Cisco
ATTRIBUTE Cisco-AVPair 1 string
ATTRIBUTE Cisco-NAS-Port 2 string
#
# T.37 Store-and-Forward attributes.
#
ATTRIBUTE Cisco-Fax-Account-Id-Origin 3 string
ATTRIBUTE Cisco-Fax-Msg-Id 4 string
ATTRIBUTE Cisco-Fax-Pages 5 string
ATTRIBUTE Cisco-Fax-Coverpage-Flag 6 string
ATTRIBUTE Cisco-Fax-Modem-Time 7 string
ATTRIBUTE Cisco-Fax-Connect-Speed 8 string
ATTRIBUTE Cisco-Fax-Recipient-Count 9 string
ATTRIBUTE Cisco-Fax-Process-Abort-Flag 10 string
ATTRIBUTE Cisco-Fax-Dsn-Address 11 string
ATTRIBUTE Cisco-Fax-Dsn-Flag 12 string
ATTRIBUTE Cisco-Fax-Mdn-Address 13 string
ATTRIBUTE Cisco-Fax-Mdn-Flag 14 string
ATTRIBUTE Cisco-Fax-Auth-Status 15 string
ATTRIBUTE Cisco-Email-Server-Address 16 string
ATTRIBUTE Cisco-Email-Server-Ack-Flag 17 string
ATTRIBUTE Cisco-Gateway-Id 18 string
ATTRIBUTE Cisco-Call-Type 19 string
ATTRIBUTE Cisco-Port-Used 20 string
ATTRIBUTE Cisco-Abort-Cause 21 string
#
# Voice over IP attributes.
#
ATTRIBUTE h323-remote-address 23 string
ATTRIBUTE h323-conf-id 24 string
ATTRIBUTE h323-setup-time 25 string
ATTRIBUTE h323-call-origin 26 string
ATTRIBUTE h323-call-type 27 string
ATTRIBUTE h323-connect-time 28 string
ATTRIBUTE h323-disconnect-time 29 string
ATTRIBUTE h323-disconnect-cause 30 string
ATTRIBUTE h323-voice-quality 31 string
ATTRIBUTE h323-gw-id 33 string
ATTRIBUTE h323-incoming-conf-id 35 string
ATTRIBUTE h323-credit-amount 101 string
ATTRIBUTE h323-credit-time 102 string
ATTRIBUTE h323-return-code 103 string
ATTRIBUTE h323-prompt-id 104 string
ATTRIBUTE h323-time-and-day 105 string
ATTRIBUTE h323-redirect-number 106 string
ATTRIBUTE h323-preferred-lang 107 string
ATTRIBUTE h323-redirect-ip-address 108 string
ATTRIBUTE h323-billing-model 109 string
ATTRIBUTE h323-currency 110 string
ATTRIBUTE subscriber 111 string
ATTRIBUTE gw-rxd-cdn 112 string
ATTRIBUTE gw-final-xlated-cdn 113 string
ATTRIBUTE remote-media-address 114 string
ATTRIBUTE release-source 115 string
ATTRIBUTE gw-rxd-cgn 116 string
ATTRIBUTE gw-final-xlated-cgn 117 string
ATTRIBUTE iphop 118 string
# SIP Attributes
ATTRIBUTE call-id 141 string
ATTRIBUTE session-protocol 142 string
ATTRIBUTE method 143 string
ATTRIBUTE prev-hop-via 144 string
ATTRIBUTE prev-hop-ip 145 string
ATTRIBUTE incoming-req-uri 146 string
ATTRIBUTE outgoing-req-uri 147 string
ATTRIBUTE next-hop-ip 148 string
ATTRIBUTE next-hop-dn 149 string
ATTRIBUTE sip-hdr 150 string
#
# Extra attributes sent by the Cisco, if you configure
# "radius-server vsa accounting" (requires IOS11.2+).
#
ATTRIBUTE Cisco-Multilink-ID 187 integer
ATTRIBUTE Cisco-Num-In-Multilink 188 integer
ATTRIBUTE Cisco-Pre-Input-Octets 190 integer
ATTRIBUTE Cisco-Pre-Output-Octets 191 integer
ATTRIBUTE Cisco-Pre-Input-Packets 192 integer
ATTRIBUTE Cisco-Pre-Output-Packets 193 integer
ATTRIBUTE Cisco-Maximum-Time 194 integer
ATTRIBUTE Cisco-Disconnect-Cause 195 integer
ATTRIBUTE Cisco-Data-Rate 197 integer
ATTRIBUTE Cisco-PreSession-Time 198 integer
ATTRIBUTE Cisco-PW-Lifetime 208 integer
ATTRIBUTE Cisco-IP-Direct 209 integer
ATTRIBUTE Cisco-PPP-VJ-Slot-Comp 210 integer
ATTRIBUTE Cisco-PPP-Async-Map 212 integer
ATTRIBUTE Cisco-IP-Pool-Definition 217 string
ATTRIBUTE Cisco-Assign-IP-Pool 218 integer
ATTRIBUTE Cisco-Route-IP 228 integer
ATTRIBUTE Cisco-Link-Compression 233 integer
ATTRIBUTE Cisco-Target-Util 234 integer
ATTRIBUTE Cisco-Maximum-Channels 235 integer
ATTRIBUTE Cisco-Data-Filter 242 integer
ATTRIBUTE Cisco-Call-Filter 243 integer
ATTRIBUTE Cisco-Idle-Limit 244 integer
ATTRIBUTE Cisco-Account-Info 250 string
ATTRIBUTE Cisco-Service-Info 251 string
ATTRIBUTE Cisco-Command-Code 252 string
ATTRIBUTE Cisco-Control-Info 253 string
ATTRIBUTE Cisco-Xmit-Rate 255 integer
VALUE Cisco-Disconnect-Cause Unknown 2
VALUE Cisco-Disconnect-Cause CLID-Authentication-Failure 4
VALUE Cisco-Disconnect-Cause No-Carrier 10
VALUE Cisco-Disconnect-Cause Lost-Carrier 11
VALUE Cisco-Disconnect-Cause No-Detected-Result-Codes 12
VALUE Cisco-Disconnect-Cause User-Ends-Session 20
VALUE Cisco-Disconnect-Cause Idle-Timeout 21
VALUE Cisco-Disconnect-Cause Exit-Telnet-Session 22
VALUE Cisco-Disconnect-Cause No-Remote-IP-Addr 23
VALUE Cisco-Disconnect-Cause Exit-Raw-TCP 24
VALUE Cisco-Disconnect-Cause Password-Fail 25
VALUE Cisco-Disconnect-Cause Raw-TCP-Disabled 26
VALUE Cisco-Disconnect-Cause Control-C-Detected 27
VALUE Cisco-Disconnect-Cause EXEC-Program-Destroyed 28
VALUE Cisco-Disconnect-Cause Timeout-PPP-LCP 40
VALUE Cisco-Disconnect-Cause Failed-PPP-LCP-Negotiation 41
VALUE Cisco-Disconnect-Cause Failed-PPP-PAP-Auth-Fail 42
VALUE Cisco-Disconnect-Cause Failed-PPP-CHAP-Auth 43
VALUE Cisco-Disconnect-Cause Failed-PPP-Remote-Auth 44
VALUE Cisco-Disconnect-Cause PPP-Remote-Terminate 45
VALUE Cisco-Disconnect-Cause PPP-Closed-Event 46
VALUE Cisco-Disconnect-Cause Session-Timeout 100
VALUE Cisco-Disconnect-Cause Session-Failed-Security 101
VALUE Cisco-Disconnect-Cause Session-End-Callback 102
VALUE Cisco-Disconnect-Cause Invalid-Protocol 120
END-VENDOR Cisco
Далее, будем формировать уникальный ID звнока в виде MD5 хэша на основании атрибута h323-incoming-conf-id:
acct_unique {
key = "h323-incoming-conf-id"
}
Однозначние сопоставление IP-шной и TDM-ной частей (legs) VoIP-звонка возможно по полю AcctUniqueId таблицы radacct — оно будет у них одинаковым.
Далее, указываем, что перед аккаунтингом следует данные преобразовать (с использованием словарей):
preacct {
preprocess
acct_unique
}
Теперь в /usr/local/etc/raddb/sql.conf мы можем использовать полученные нами данные, которые содержатся в переменных, которые, в свою очередь, определяются в словаре (/usr/local/share/freeradius/dictionary.cisco):
%{h323-remote-address} — в этой переменной содержится IP, с которого/на который был звонок.
Все бы хорошо, но у атрибута iphop есть одна тонкость — он может содержать множественные значения, например:
iphop=count:2
iphop=hop1:192.168.68.4
iphop=hop2:10.10.255.7
и если в sql.conf использовать переменную %{iphop}, то в нее будет попадать только первая строка iphop=count.
Это решаемая проблема. Если атрибут содержит множественные значения, то к ним возможно обращаться как к массиву.
В нашем примере:
- %{iphop[0]} — будет содержать значение «count:2»
- %{iphop[1]} — будет содержаться «hop1:192.168.68.4»
- %{iphop[2]} — будет «iphop=hop2:10.10.255.7»
Добавив в таблицу radacct поля:
- remote-address
- hopcount
- hop1
- hop2
можно добавить их в SQL запрос в sql.conf:
accounting_stop_query = "UPDATE ${acct_table2} SET AcctStopTime = '%S', \
AcctSessionTime = '%{Acct-Session-Time}', \
AcctInputOctets = '%{Acct-Input-Octets}', \
AcctOutputOctets = '%{Acct-Output-Octets}', \
AcctTerminateCause = '%{h323-disconnect-cause}', \
AcctStopDelay = '%{Acct-Delay-Time}', \
ConnectInfo_stop ='%{Connect-Info}', \
`remote-address`='%{h323-remote-address}', \
`hopcount`='%{iphop[0]}', \
`hop1`='%{iphop[1]}', \
`hop2`='%{iphop[2]}' \
WHERE AcctSessionId = '%{Acct-Session-Id}' \
AND UserName = '%{SQL-User-Name}' \
AND NASIPAddress = '%{NAS-IP-Address}'"
По итогу таблица radacct выглядит так:
CREATE TABLE IF NOT EXISTS `radacct` (
`RadAcctId` bigint(21) NOT NULL auto_increment,
`AcctSessionId` varchar(32) NOT NULL default '',
`AcctUniqueId` varchar(32) NOT NULL default '',
`UserName` varchar(64) NOT NULL default '',
`Realm` varchar(64) default '',
`NASIPAddress` varchar(15) NOT NULL default '',
`NASPortId` varchar(15) default NULL,
`NASPortType` varchar(32) default NULL,
`AcctStartTime` datetime NOT NULL default '0000-00-00 00:00:00',
`AcctStopTime` datetime NOT NULL default '0000-00-00 00:00:00',
`AcctSessionTime` int(12) default NULL,
`AcctAuthentic` varchar(32) default NULL,
`ConnectInfo_start` varchar(50) default NULL,
`ConnectInfo_stop` varchar(50) default NULL,
`AcctInputOctets` bigint(12) default NULL,
`AcctOutputOctets` bigint(12) default NULL,
`CalledStationId` varchar(50) NOT NULL default '',
`CallingStationId` varchar(50) NOT NULL default '',
`AcctTerminateCause` varchar(32) NOT NULL default '',
`ServiceType` varchar(32) default NULL,
`FramedProtocol` varchar(32) default NULL,
`FramedIPAddress` varchar(15) NOT NULL default '',
`AcctStartDelay` int(12) default NULL,
`AcctStopDelay` int(12) default NULL,
`proc` smallint(1) NOT NULL default '0',
`remote-address` varchar(15) NOT NULL default '',
`hopcount` varchar(16) default NULL,
`hop1` varchar(20) default NULL,
`hop2` varchar(20) default NULL,
PRIMARY KEY (`RadAcctId`),
KEY `UserName` (`UserName`),
KEY `FramedIPAddress` (`FramedIPAddress`),
KEY `AcctSessionId` (`AcctSessionId`),
KEY `AcctUniqueId` (`AcctUniqueId`),
KEY `AcctStartTime` (`AcctStartTime`),
KEY `AcctStopTime` (`AcctStopTime`),
KEY `NASIPAddress` (`NASIPAddress`),
KEY `import` (`NASPortType`,`AcctSessionTime`,`AcctStartTime`),
KEY `proc` (`NASPortType`,`proc`,`AcctSessionTime`)
) TYPE=MyISAM;
Таким образом мы получаем, что в sql складывается информация о совершенных VoIP звонках и с каких IP-адресов они совершены.
З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА ! Пожалуйста, уважайте чужой труд.
Автор: Панфилов Алексей (lehis (at) subnets.ru)
Похожие статьи:
- Не найдено
TrEK сказал:
Apr 8 19:17:10.223: RADIUS/DECODE: No response from radius-server; parse response; FAIL
Apr 8 19:17:10.223: RADIUS/DECODE: Case error(no response/ bad packet/ op decode);parse response; FAIL
Выдает мне кошка и все…
08.04.2013, 23:17TrEK сказал:
в статье выделеное красным надо вставить просто в sql.conf в скобки , которые уже существуют???
08.04.2013, 23:18lehisnoe сказал:
Разбирать ситуацию лучше у нас на форуме — http://subnets.ru/forum в разделе «Настройка VoIP железа»
09.04.2013, 09:33TrEK сказал:
http://subnets.ru/forum/viewtopic.php?f=13&t=502
написал, я не могу понять проблемы, вроде бы все правильно настроено, но Увы!
09.04.2013, 13:19