Pull to refresh

Hotspot на Mikrotik+freeradius+mysql Centos 6

Задача развернуть hotspot с возможностью авторизации по логину и паролю, а так же с ограниченным гостевым доступом.

В наличии машина на Centos 6 и MikroTik RouterOS 6.19.

Настройка hotspot на MikroTik


На интерфейс ether6 подключен радио мост, который раздает wifi. Подключаемся по telnet к RouterOS и даем команду:
> ip hotspot setup

Далее потребуется ввести данные о сети, mikrotik сам определит адрес интерфейса и пул адресов для dhcp, если интерфейс был ранее настроен, если нет, будут использованы настройки по умолчанию, как и было сделано ниже:
[admin@MikroTik] > ip hotspot setup

Select interface to run HotSpot on 

hotspot interface: ether6
Set HotSpot address for interface 

local address of network: 10.5.50.1/24
masquerade network: yes
Set pool for HotSpot addresses 

address pool of network: 10.5.50.2-10.5.50.254
Select hotspot SSL certificate 

select certificate: none                    
Select SMTP server 

ip address of smtp server: 0.0.0.0
Setup DNS configuration 

dns servers: 192.168.2.110,8.8.8.8
DNS name of local hotspot server 

dns name: 
Create local hotspot user 

name of local hotspot user: admin
password for the user: 

Сертификат выбираем none. Адрес smtp оставляем как есть, он нам не нужен. Поле пароля для администратора я тоже оставил пустым. DNS у меня от провайдера, но можно основным указать 8.8.8.8, если не настроены dns ранее.

Далее включаем гостевой вход, ограниченный по времени и указываем использовать радиус:
[admin@MikroTik] > ip hotspot profile set hsprof1 login-by=trial,http-chap trial-uptime=01:00:00/00:01:00 use-radius=yes

Ограничиваем скорость для гостевых клиентов и устанавливаем keepalive:
[admin@MikroTik] > ip hotspot user profile set default rate-limit=1m/1m open-status-page=http-login keepalive-timeout=01:00:00 shared-users=unlimited

Добавляем радиус сервер:
[admin@MikroTik] > radius add  address=192.168.2.222 secret=123456 service=hotspot

192.168.2.222 — это сервер радиуса и пароль, который будет указан в /etc/raddb/clients.conf.

На этом настройка микротик завершена, и переходим к настройке freeradius.

Настраиваем радиус.


Устанавливаем freeradius и mysql:
# yum install freeradius-utils freeradius-perl freeradius-mysql freeradius-ldap freeradius mysql mysql-server -y

Начнем с настройки freeradius:
# cd /etc/raddb/

Редактируем файл clients.conf:
# vim clients.conf

Добавляем строки:
client 192.168.2.116 {
       secret              = 123456
       shortname       = mikrotik
}

192.168.2.116 это адрес нашего микротика. Shortname можно указать любой.

Далее редактируем sql.conf:
sql {
        
        database = "mysql"
        driver = "rlm_sql_${database}"
        server = "localhost"
        #port = 3306
        login = "root"
        password = "123456"

Меняем имя пользователя и пароль для доступа к бд mysql, тк mysql будет на локальной машине оставляем localhost.

Редактируем radiusd.conf:

В секции modules {} находим и раскомментируем следующую строку:
$INCLUDE sql.conf

Далее
# vim sites-available/default

Раскомментируем строку в секциях: authorize {}, accounting {}
sql

Затем:
# vim sites-available/inner-tunnel
В секции authorize {} раскомментируем строку
sql
Теперь редактируем dictionary
# vim dictionary
Добавляем строку:
$INCLUDE        /usr/share/freeradius/dictionary.mikrotik

Настройка MySql



Создаем бд radius, именно она была указана в файле sql.conf:
# mysql -u root -p
mysql> CREATE DATABASE radius;
mysql> \q

Вставляем дампы таблиц, которые шли вместе с радиусом:
# mysql -u root -p radius < /etc/raddb/sql/mysql/schema.sql
# mysql -u root -p radius < /etc/raddb/sql/mysql/nas.sql

Заполним базу в MySQL:

Это структура таблиц в бд radius:
mysql> show tables;
+------------------+
| Tables_in_radius |
+------------------+
| nas              |
| radacct          |
| radcheck         |
| radgroupcheck    |
| radgroupreply    |
| radpostauth      |
| radreply         |
| radusergroup     |
+------------------+

Описание таблиц:
radusergroup — данные о группах пользователей
radcheck — атрибуты для проверки пользователя
radgroupcheck — проверка атрибутов для группы
radreply — таблица, содержащая атрибуты, передающиеся клиенту сервером при прохождении аутентификации
radgroupreply — атрибуты, содержащиеся в ответе сервера для данной группы

Добавим нового пользователя в таблицу:
# mysql -u root -p
mysql> use radius;
mysql> INSERT INTO radcheck (UserName, Attribute, op, Value) VALUES ('user1', 'Cleartext-Password', ':=', '123456');

Добавим пользователя в группу:
mysql> INSERT INTO radusergroup(username, groupname) VALUES ('user1', 'hotspot'); 

Ограничим скорость исходящего\входящего соединения:
mysql> INSERT INTO radgroupreply(groupname, attribute, op, value) VALUES ('hotspot', 'Mikrotik-Rate-Limit', '=', '5m/5m');

Теперь проверяем тыблицы:
mysql> select * from radcheck;
+----+-----------+--------------------+----+---------+
| id | username  | attribute          | op | value   |
+----+-----------+--------------------+----+---------+
|  1 | user1     | Cleartext-Password | := | 123456  |
+----+-----------+--------------------+----+---------+
1 rows in set (0.00 sec)

mysql> select * from radusergroup;
+----------+-----------+----------+
| username | groupname | priority |
+----------+-----------+----------+
| user1    | hotspot            |        1 |
+----------+-----------+----------+
1 row in set (0.00 sec)

mysql> select * from radgroupreply;
+----+-----------+---------------------+----+-------+
| id | groupname | attribute           | op | value |
+----+-----------+---------------------+----+-------+
|  1 | hotspot   | Mikrotik-Rate-Limit | =  | 5m/5m |
+----+-----------+---------------------+----+-------+
1 row in set (0.00 sec)

Теперь проверим работает ли радиус:
# radiusd -X 

Если увидели строку
Ready to process requests.

то это значит что радиус сконфигурирован без ошибок и готов к работе. Теперь попробуем сделать тестовый запрос, открываем вторую консоль и вводим:
# radtest user1 123456 localhost 1812 testing123
radclient:: Failed to find IP address for srv-radius
radclient: Nothing to send.

Для устранения этой ошибки делаем следующее:
# echo "127.0.0.1 srv-radius" >> /etc/hosts

Повторяем запрос:
# radtest user1 123456 localhost 1812 testing123
Sending Access-Request of id 158 to 127.0.0.1 port 1812
        User-Name = "user1"
        User-Password = "123456"
        NAS-IP-Address = 127.0.0.1
        NAS-Port = 1812
        Message-Authenticator = 0x00000000000000000000000000000000
rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=158, length=33
        Mikrotik-Rate-Limit = "5m/5m"


testing123 — это пароль по умолчанию, который указан для localhost в /etc/raddb/clients.conf

Если выдаст ошибка, смотрите дебаг из первой консоли. Радиус работает, делаем:
# service radiusd start

И не забываем про iptables, в данном примере я его погасил. Радиус использует 1812 и 1813 порты.

Подключаемся к радио мосту, открываем браузер и попадаем на страницу авторизации, далее либо жмем гостевой вход и получаем доступ в интернет на 1 час с ограниченной скоростью 1m/1m или вводим логин и пароль и получаем доступ без ограничения по времени и со скоростью 5m/5m.

Хочу заметить, что когда проходит авторизация пользователей через радиус, на микротике используется клиентский профиль по умолчанию. Если у вас несколько hotspot не указывайте dhcp pool в user profile. Иначе возникает путаница с адресами, когда пользователь получает адрес из одной сети, а пройдя авторизацию, у него будет ip из другой сети и работать естественно не будет. Поэтому dhcp pool указывается в server profiles.

Так выглядит успешная авторизация через радиус сервер
rad_recv: Access-Request packet from host 192.168.2.116 port 47709, id=5, length=195
NAS-Port-Type = Wireless-802.11
Calling-Station-Id = «84:38:38:CA:10:83»
Called-Station-Id = «hs-ether6»
NAS-Port-Id = «ether6»
User-Name = «user1»
NAS-Port = 2150629832
Acct-Session-Id = «803001c8»
Framed-IP-Address = 10.5.50.4
Mikrotik-Host-IP = 10.5.50.4
CHAP-Challenge = 0xdf462a642b00b9c76b420ca5ffd8b370
CHAP-Password = 0x45bbd95f6446dc3c37230bd67a3d60f0af
Service-Type = Login-User
WISPr-Logoff-URL = «10.5.50.1/logout»
NAS-Identifier = «MikroTik»
NAS-IP-Address = 192.168.2.116
# Executing section authorize from file /etc/raddb/sites-enabled/default
+- entering group authorize {...}
++[preprocess] returns ok
[chap] Setting 'Auth-Type := CHAP'
++[chap] returns ok
++[mschap] returns noop
++[digest] returns noop
[suffix] No '@' in User-Name = «user1», looking up realm NULL
[suffix] No such realm «NULL»
++[suffix] returns noop
[eap] No EAP-Message, not doing EAP
++[eap] returns noop
++[files] returns noop
[sql] expand: %{User-Name} -> user1
[sql] sql_set_user escaped user --> 'user1'
rlm_sql (sql): Reserving sql socket id: 4
[sql] expand: SELECT id, username, attribute, value, op FROM radcheck WHERE username = '%{SQL-User-Name}' ORDER BY id -> SELECT id, username, attribute, value, op FROM radcheck WHERE username = 'user1' ORDER BY id
[sql] User found in radcheck table
[sql] expand: SELECT id, username, attribute, value, op FROM radreply WHERE username = '%{SQL-User-Name}' ORDER BY id -> SELECT id, username, attribute, value, op FROM radreply WHERE username = 'user1' ORDER BY id
[sql] expand: SELECT groupname FROM radusergroup WHERE username = '%{SQL-User-Name}' ORDER BY priority -> SELECT groupname FROM radusergroup WHERE username = 'user1' ORDER BY priority
[sql] expand: SELECT id, groupname, attribute, Value, op FROM radgroupcheck WHERE groupname = '%{Sql-Group}' ORDER BY id -> SELECT id, groupname, attribute, Value, op FROM radgroupcheck WHERE groupname = 'hotspot' ORDER BY id
[sql] User found in group hotspot
[sql] expand: SELECT id, groupname, attribute, value, op FROM radgroupreply WHERE groupname = '%{Sql-Group}' ORDER BY id -> SELECT id, groupname, attribute, value, op FROM radgroupreply WHERE groupname = 'hotspot' ORDER BY id
rlm_sql (sql): Released sql socket id: 4
++[sql] returns ok
++[expiration] returns noop
++[logintime] returns noop
[pap] WARNING: Auth-Type already set. Not setting to PAP
++[pap] returns noop
Found Auth-Type = CHAP
# Executing group from file /etc/raddb/sites-enabled/default
+- entering group CHAP {...}
[chap] login attempt by «user1» with CHAP password
[chap] Using clear text password «123456» for user user1 authentication.
[chap] chap user user1 authenticated succesfully
++[chap] returns ok
# Executing section post-auth from file /etc/raddb/sites-enabled/default
+- entering group post-auth {...}
++[exec] returns noop
Sending Access-Accept of id 5 to 192.168.2.116 port 47709
Mikrotik-Rate-Limit = «5m/5m»
Finished request 5.
Going to the next request
Waking up in 4.9 seconds.
rad_recv: Accounting-Request packet from host 192.168.2.116 port 36166, id=6, length=139
Acct-Status-Type = Start
NAS-Port-Type = Wireless-802.11
Calling-Station-Id = «84:38:38:CA:10:83»
Called-Station-Id = «hs-ether6»
NAS-Port-Id = «ether6»
User-Name = «user1»
NAS-Port = 2150629832
Acct-Session-Id = «803001c8»
Framed-IP-Address = 10.5.50.4
Mikrotik-Host-IP = 10.5.50.4
Event-Timestamp = «Aug 4 2015 20:29:53 MSK»
NAS-Identifier = «MikroTik»
Acct-Delay-Time = 0
NAS-IP-Address = 192.168.2.116
# Executing section preacct from file /etc/raddb/sites-enabled/default
+- entering group preacct {...}
++[preprocess] returns ok
[acct_unique] Hashing 'NAS-Port = 2150629832,Client-IP-Address = 192.168.2.116,NAS-IP-Address = 192.168.2.116,Acct-Session-Id = «803001c8»,User-Name = «user1»'
[acct_unique] Acct-Unique-Session-ID = «366a62e291c163e7».
++[acct_unique] returns ok
[suffix] No '@' in User-Name = «user1», looking up realm NULL
[suffix] No such realm «NULL»
++[suffix] returns noop
++[files] returns noop
# Executing section accounting from file /etc/raddb/sites-enabled/default
+- entering group accounting {...}
[detail] expand: %{Packet-Src-IP-Address} -> 192.168.2.116
[detail] expand: /var/log/radius/radacct/%{%{Packet-Src-IP-Address}:-%{Packet-Src-IPv6-Address}}/detail-%Y%m%d -> /var/log/radius/radacct/192.168.2.116/detail-20150805
[detail] /var/log/radius/radacct/%{%{Packet-Src-IP-Address}:-%{Packet-Src-IPv6-Address}}/detail-%Y%m%d expands to /var/log/radius/radacct/192.168.2.116/detail-20150805
[detail] expand: %t -> Wed Aug 5 14:29:46 2015
++[detail] returns ok
++[unix] returns ok
[radutmp] expand: /var/log/radius/radutmp -> /var/log/radius/radutmp
[radutmp] expand: %{User-Name} -> user1
++[radutmp] returns ok
[sql] expand: %{User-Name} -> user1
[sql] sql_set_user escaped user --> 'user1'
[sql] expand: %{Acct-Delay-Time} -> 0
[sql] expand: INSERT INTO radacct (acctsessionid, acctuniqueid, username, realm, nasipaddress, nasportid, nasporttype, acctstarttime, acctstoptime, acctsessiontime, acctauthentic, connectinfo_start, connectinfo_stop, acctinputoctets, acctoutputoctets, calledstationid, callingstationid, acctterminatecause, servicetype, framedprotocol, framedipaddress, acctstartdelay, acctstopdelay, xascendsessionsvrkey) VALUES ('%{Acct-Session-Id}', '%{Acct-Unique-Session-Id}', '%{SQL-User-Name}', '%{Realm}', '%{NAS-IP-Address}', '%{NAS-Port}', '%{NAS-Port-Type}', '%S', NULL, '0', '%{Acct-Authentic}', '%{Connect-Info}', '', '0', '0', '%{Called-Station-Id}', '%{Calling-Station-Id}', '', '%{Service-Type}', '%{Framed-Protocol}', '%{Framed-IP-Address}',
rlm_sql (sql): Reserving sql socket id: 3
rlm_sql (sql): Released sql socket id: 3
++[sql] returns ok
++[exec] returns noop
[attr_filter.accounting_response] expand: %{User-Name} -> user1
attr_filter: Matched entry DEFAULT at line 12
++[attr_filter.accounting_response] returns updated
Sending Accounting-Response of id 6 to 192.168.2.116 port 36166
Finished request 6.
Cleaning up request 6 ID 6 with timestamp +8574
Going to the next request
Waking up in 4.9 seconds.
Cleaning up request 5 ID 5 with timestamp +8574
Ready to process requests.


На этом все, спасибо.

Список используемой литературы:
RouterOs MySql Freeradius
Manual FreeRADIUS
RFC2865
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.