Использование FreeRadius для сбора аккаутинга с двух устройств с применением различных политик обработки пакетов.
Предполагаем, что имеется FREERADIUS сервер на Linux CentOS 7, уже настроенный для приема аккаутинговой информации от какого-то устройства. Аккаутинг пишется в таблицу radact БД radius сервера MySQL.Рассмотрим случая подключения нового устройства ELTEX SMG-1016M.
1. Создаем вторую таблицу аккаутинга в БД radius
CREATE TABLE IF NOT EXISTS `sms1016pnzradacct` (
`radacctid` bigint(21) NOT NULL AUTO_INCREMENT,
`acctsessionid` varchar(64) NOT NULL DEFAULT '',
`username` varchar(50) NOT NULL,
`h323callorigin` varchar(50) NOT NULL,
`nasipaddress` varchar(15) NOT NULL DEFAULT '',
`acctstarttime` datetime DEFAULT NULL,
`acctstoptime` datetime DEFAULT NULL,
`acctsessiontime` int(12) DEFAULT NULL,
`calledstationid` varchar(50) NOT NULL DEFAULT '',
`callingstationid` varchar(50) NOT NULL,
`nasportid` varchar(25) NOT NULL,
`nasporttype` varchar(25) NOT NULL,
`CiscoNASPort` varchar(30) NOT NULL,
`h323calltype` varchar(30) NOT NULL,
`EventTimestamp` varchar(30) NOT NULL,
`AcctStatusType` varchar(10) NOT NULL,
`currentimeserver` datetime NOT NULL,
`h323disconnectcause` varchar(3) NOT NULL,
`AcctDelayTime` int(5) NOT NULL,
`h323gwid` varchar(20) NOT NULL,
`xpgkrouteretries` varchar(5) NOT NULL,
`h323remoteid` varchar(50) NOT NULL,
`xpgklocaldisconnectcause` int(3) NOT NULL,
`xpgksrcnumberin` varchar(50) NOT NULL,
`xpgksrcnumberout` varchar(50) NOT NULL,
`xpgkdstnumberin` varchar(50) NOT NULL,
`xpgkdstnumberout` varchar(50) NOT NULL,
`node` varchar(16) NOT NULL,
`OutgoingRTPlocaladdress` varchar(15) NOT NULL,
`OutgoingRTPremoteaddress` varchar(15) NOT NULL,
PRIMARY KEY (`radacctid`),
KEY `username` (`username`),
KEY `acctstarttime` (`acctstarttime`),
KEY `acctstoptime` (`acctstoptime`),
KEY `calledstationid` (`calledstationid`),
KEY `callingstationid` (`callingstationid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
2. Проверяем, что у существующего пользователя radius достаточно прав для записи в новую таблицу. У меня пользователь radius наделен всеми правами на базу radius, в том числе на новую таблицу sms1016pnzradacct:
radius ALL PRIVILEGES
3. Разрешаем серверу FreeRadius работать с новым устройством:
# nano /etc/raddb/clients.conf
Добавляем в конец файла:
Client PNZ-Uht4a-SMG {
ipaddr = 10.201.101.12
secret = 12345
shortname = pnzeltex
}
4. Учим FREERADIUS работать с атрибутами Cisco AV-Pair, передаваемые от станции ELTEX SMG-2016
В файл словаря /usr/share/freeradius/dictionary.cisco
добавил в конец раздела # SIP Attributes (после 150-ого атрибута)
ATTRIBUTE xpgk-route-retries 171 string
ATTRIBUTE h323-remote-id 172 string
ATTRIBUTE xpgk-local-disconnect-cause 173 string
ATTRIBUTE xpgk-src-number-in 174 string
ATTRIBUTE xpgk-src-number-out 175 string
ATTRIBUTE xpgk-dst-number-in 176 string
ATTRIBUTE xpgk-dst-number-out 177 string
5. Подготовливаем SQL запросы для вставки в базу данных.
Для этого создаем новый файл на основе имеющегося:
# cp /etc/raddb/mods-config/sql/main/mysql/queries.conf /etc/raddb/mods-config/sql/main/mysql/queriessmgeltex.conf
Открываем файл для редактирования:
# nano /etc/raddb/mods-config/sql/main/mysql/queriessmgeltex.conf
В разделе «Accounting and Post-Auth Queries» в секцию
stop { ... } вставляем запрос:
query = " \
INSERT INTO sms1016pnzradacct \
(acctsessionid, \
username, \
nasipaddress, nasportid, nasporttype,\
acctstarttime, \
acctstoptime, \
acctsessiontime, \
calledstationid, callingstationid, \
h323callorigin, CiscoNASPort, h323calltype, EventTimestamp, \
AcctStatusType, \
currentimeserver, h323disconnectcause, \
AcctDelayTime, h323gwid, xpgkrouteretries, \
h323remoteid, xpgklocaldisconnectcause, \
xpgksrcnumberin, xpgksrcnumberout, xpgkdstnumberin, xpgkdstnumberout, node,\
OutgoingRTPlocaladdress, OutgoingRTPremoteaddress) \
VALUES \
('%{Acct-Session-Id}', \
'%{User-Name}', \
'%{NAS-IP-Address}', '%{NAS-Port}', '%{NAS-Port-Type}', \
CONCAT(SUBSTRING('%{h323-setup-time}',33, 4),'-',\
case SUBSTRING('%{h323-setup-time}',26, 3) \
when \'Jan\' then \'01\' \
when \'Feb\' then \'02\' \
when \'Mar\' then \'03\' \
when \'Apr\' then \'04\' \
when \'May\' then \'05\' \
when \'Jun\' then \'06\' \
when \'Jul\' then \'07\' \
when \'Aug\' then \'08\' \
when \'Sep\' then \'09\' \
when \'Oct\' then \'10\' \
when \'Nov\' then \'11\' \
when \'Dec\' then \'12\' end,\
'-',SUBSTRING('%{h323-setup-time}',30,2),\
' ',SUBSTRING_INDEX('%{h323-setup-time}', ':', 2),SUBSTRING('%{h323-setup-time}',6, 3)), \
CONCAT(SUBSTRING('%{h323-disconnect-time}',33, 4),'-',\
case SUBSTRING('%{h323-disconnect-time}',26, 3) \
when \'Jan\' then \'01\' \
when \'Feb\' then \'02\' \
when \'Mar\' then \'03\' \
when \'Apr\' then \'04\' \
when \'Maj\' then \'05\' \
when \'Jun\' then \'06\' \
when \'Yul\' then \'07\' \
when \'Aug\' then \'08\' \
when \'Sep\' then \'09\' \
when \'Oct\' then \'10\' \
when \'Nov\' then \'11\' \
when \'Dec\' then \'12\' end,\
'-',SUBSTRING('%{h323-disconnect-time}',30,2),\
' ',SUBSTRING_INDEX('%{h323-disconnect-time}', ':', 2),SUBSTRING('%{h323-disconnect-time}',6, 3)), \
'%{Acct-Session-Time}', \
'%{Called-Station-Id}', '%{Calling-Station-Id}', \
'%{h323-call-origin}', '%{Cisco-NAS-Port}', '%{h323-call-type}', '%{Event-Timestamp}', \
'%{Acct-Status-Type}', \
'%S', '%{h323-disconnect-cause}', \
'%{Acct-Delay-Time}', '%{h323-gw-id}', '%{xpgk-route-retries}', \
'%{h323-remote-id}', '%{xpgk-local-disconnect-cause}', \
'%{xpgk-src-number-in}', '%{xpgk-src-number-out}', '%{xpgk-dst-number-in}', '%{xpgk-dst-number-out}', 'UFA-SMG2', \
'', '')"
Здесь UFA-SMG2 - это имя устройства
Следующие разделы оставляем пустыми:
accounting-on {
}
accounting-off {
}
start {
}
interim-update {
}
6. Добавляем второй раздел описания sql в файл /etc/raddb/mods-enabled/sql
# nano /etc/raddb/mods-enabled/sql
Название имеющегося раздела sql меняем на sql sql. Должно получиться:
sql sql {
...
}
Дописываем раздел в конец файла:
sql sqlsmg1016eltex {
driver = "rlm_sql_mysql"
dialect = "mysql"
#
server = "localhost"
port = 3306
login = "radius"
password = "radpass"
# Database table configuration for everything except Oracle
radius_db = "radius"
acct_table1 = "sms1016pnzradacct"
acct_table2 = "sms1016pnzradacct"
# Allow for storing data after authentication
postauth_table = "radpostauth"
# Tables containing 'check' items
authcheck_table = "radcheck"
groupcheck_table = "radgroupcheck"
# Tables containing 'reply' items
authreply_table = "radreply"
groupreply_table = "radgroupreply"
# Table to keep group info
usergroup_table = "radusergroup"
# Remove stale session if checkrad does not see a double login
delete_stale_sessions = yes
pool {
start = 5
min = 4
max = ${thread[pool].max_servers}
spare = 3
uses = 0
lifetime = 0
idle_timeout = 60
}
# Table to keep radius client info
client_table = "nas"
# Read database-specific queries
$INCLUDE /etc/raddb/mods-config/sql/main/mysql/queriessmgeltex.conf
}
7. Создаем новый файл описания сервера FreeRadius на основе имеющегося:
# cp /etc/raddb/sites-available/default /etc/raddb/sites-available/smg1016eltex
Открываем созданный файл:
# nano /etc/raddb/sites-available/smg1016eltex
Вставляем туда:
server sqlsmg1016eltex {
listen {
ipaddr = *
port = 1814
type = acct
limit {
}
}
authorize {
}
authenticate {
}
preacct {
preprocess
}
# Accounting. Log the accounting data.
accounting {
sqlsmg1016eltex
}
session {
}
post-auth {
}
}
Основная функция файла указать, что сервер RADIUS с именем sqlsmg1016eltex будет слушать порт 1814 и обрабатывать запросы аккаутинга с помощью модуля sql с названием «sqlsmg1016eltex».
8. Делаем сервис доступным
# ln -s /etc/raddb/sites-available/smg1016eltex /etc/raddb/sites-enabled/smg1016eltex
9. Рестартуем сервис
# systemctl restart radiusd.service
10. Открываем порт 1814 в файле iptables
# nano /etc/sysconfig/iptables
Добавляем:
-A INPUT -p tcp -m tcp --dport 1814 -j ACCEPT
-A INPUT -p udp -m udp --dport 1814 -j ACCEPT
Рестрартуем iptables
# systemctl restart iptables.service