понедельник, 4 апреля 2016 г.

Использование 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



1 комментарий: