Может, я немного опоздал с этим, но вот что заметил. Данные RADIUS Accounting, похоже, на 80% — мусор. Если я правильно понимаю, что он делает не так, то большинство пакетов, приходящих на сервер, выглядят примерно так:
192.168.7.2.36406 > 10.0.10.254.1813: RADIUS, length: 189
Accounting Request (4), id: 0xe4, Authenticator: 5339b2f24e0d866b7c4d390e85eb11f3
Accounting Session ID Attribute (44), length: 19, Value: 0000002E-0000183D
Accounting Status Attribute (40), length: 6, Value: Stop
Accounting Authentication Attribute (45), length: 6, Value: RADIUS
Username Attribute (1), length: 8, Value: xxxxxx
NAS Port Attribute (5), length: 6, Value: 0
Called Station Attribute (30), length: 22, Value: xx-xx-xx-xx-xx-xx:xx
Calling Station Attribute (31), length: 19, Value: xx-xx-xx-xx-xx-xx
NAS Port Type Attribute (61), length: 6, Value: Wireless - IEEE 802.11
Connect Info Attribute (77), length: 23, Value: CONNECT 0Mbps 802.11b
Accounting Session Time Attribute (46), length: 6, Value: 18 secs
Accounting Input Packets Attribute (47), length: 6, Value: 0
Accounting Output Packets Attribute (48), length: 6, Value: 0
Accounting Input Octets Attribute (42), length: 6, Value: 0
Accounting Input Giga Attribute (52), length: 6, Value: 1
Accounting Output Octets Attribute (43), length: 6, Value: 0
Accounting Output Giga Attribute (53), length: 6, Value: 1
Event Timestamp Attribute (55), length: 6, Value: Thu Nov 21 11:33:17 2013
Accounting Termination Cause Attribute (49), length: 6, Value: User Request
Freeradius трактует это по-своему (файл /etc/freeradius/sql/postgresql/dialup.conf):
accounting_update_query = "UPDATE ${acct_table1}
SET FramedIPAddress = NULLIF('%{Framed-IP-Address}', '')::inet,
AcctSessionTime = '%{Acct-Session-Time}',
AcctInputOctets = (('%{%{Acct-Input-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Input-Octets}:-0}'::bigint),
AcctOutputOctets = (('%{%{Acct-Output-Gigawords}:-0}'::bigint << 32) + '%{%{Acct-Output-Octets}:-0}'::bigint)
WHERE AcctSessionId = '%{Acct-Session-Id}' AND UserName = '%{SQL-User-Name}'
AND NASIPAddress= '%{NAS-IP-Address}' AND AcctStopTime IS NULL"
Это обычно даёт значение около 2^32 байт. Иногда в пакете учёта встречаются полезные данные, например:
11:38:54.529313 IP (tos 0x0, ttl 63, id 30033, offset 0, flags [none], proto UDP (17), length 205)
192.168.7.2.36406 > 10.0.10.254.1813: RADIUS, length: 177
Accounting Request (4), id: 0x0d, Authenticator: b8e70d581ce092b98a00053a6ce13c78
Accounting Session ID Attribute (44), length: 19, Value: 0000002E-0000184C
Accounting Status Attribute (40), length: 6, Value: Stop
Accounting Authentication Attribute (45), length: 6, Value: RADIUS
Username Attribute (1), length: 8, Value: xxxxxx
NAS Port Attribute (5), length: 6, Value: 0
Called Station Attribute (30), length: 22, Value: xx-xx-xx-xx-xx-xx:xx
Calling Station Attribute (31), length: 19, Value: xx-xx-xx-xx-xx-xx
NAS Port Type Attribute (61), length: 6, Value: Wireless - IEEE 802.11
Connect Info Attribute (77), length: 23, Value: CONNECT 0Mbps 802.11b
Accounting Session Time Attribute (46), length: 6, Value: 17 secs
Accounting Input Packets Attribute (47), length: 6, Value: 44
Accounting Output Packets Attribute (48), length: 6, Value: 32
Accounting Input Octets Attribute (42), length: 6, Value: 6574
Accounting Output Octets Attribute (43), length: 6, Value: 11877
Event Timestamp Attribute (55), length: 6, Value: Thu Nov 21 11:38:56 2013
Accounting Termination Cause Attribute (49), length: 6, Value: User Request
Сейчас на объекте всего одна точка доступа, так что можно исключить проблемы с роумингом. Когда сервер RADIUS получает адекватные значения, они совпадают (с точностью до нескольких секунд) с теми, что отображаются в истории подключения устройства в UniFi. Статистика по таблице учёта показывает, что проблемы чаще встречаются у некоторых устройств, но возможно, это просто связано с тем, что эти устройства больше включаются и выключаются (например, iPhone, который обычно отключает Wi-Fi при выключенном экране).
select * from crosstab (
'select callingstationid as id, case when acctinputoctets = 4294967296 then ''invalid'' else ''valid'' end as validity, count(*) as count
from radacct group by id, validity order by id',
'select * from explode_array(array[''valid'', ''invalid''])'
) as ( "id" text, "valid" integer, "invalid" integer );
id | valid | invalid
-------------------+-------+---------
00-07-88-A9-65-49 | 22 | 3
00-1E-65-04-C4-C8 | 1 |
00-23-14-B9-B0-E0 | 5 | 2
00-26-BB-F9-FF-B3 | 4 | 2
00-88-65-46-FA-E5 | 10 | 2
04-1E-64-F5-41-23 | 8 | 4
04-F7-E4-E7-61-E8 | 70 | 8
08-11-96-40-91-60 | 4 | 8
10-68-3F-7A-D2-B9 | 5 |
20-02-AF-C5-A8-BC | 1 |
20-54-76-8F-05-4E | 9 |
20-C9-D0-7B-C1-FD | 1 | 314
24-77-03-C1-C4-B4 | 6 | 341
24-77-03-C7-2C-10 | 7 | 6
28-5F-DB-2F-75-E3 | 6 | 1
30-F7-C5-77-72-B6 | 13 |
3C-D0-F8-C3-14-DB | 26 | 3
40-30-04-37-70-15 | 5 |
4C-EB-42-28-7C-FB | 10 |
58-1F-AA-40-68-48 | 91 | 229
5C-0A-5B-40-2E-60 | 6 | 33
5C-0A-5B-40-2E-AA | 5 |
5C-0A-5B-42-80-C5 | 4 | 2
5C-0A-5B-49-4E-71 | 7 | 14
5C-0A-5B-BE-5E-72 | 6 | 5
5C-51-4F-42-9F-AA | 5 |
5C-F8-A1-4F-B0-1B | 4 | 4
[...][LR,AC]: Ограничения по пропускной способности для групп пользователей, похоже, не работают — отображаемые в UniFi GUI скорости передачи постоянно превышают установленные лимиты устройств, если только я не ошибаюсь и лимит должен применяться только когда нагрузка на пропускную способность точки доступа практически на пределе.
Взглянув на /etc/sysinit/qos.conf на самой точке доступа, вижу вызовы /bin/qosLinkAddVap.sh с параметрами, которые не совсем совпадают с тем, что я вводил в веб-интерфейсе. Например, когда я установил группу 15360/2048 (15/2 Мбит/с), в qos.conf стоят числа 15360 и 256, как будто апстрим конвертировали из kbps в kB/s, а даунстрим — нет. Если сменить группу на 1920/2048, то в AP появится «1920 256». Подозреваю, что когда доберусь домой, смогу покопаться и протестировать это подробнее, но здесь, в офисе, мне кажется, народ может обидеться, если я буду постоянно перенастраивать сеть.
Немного меньшая визуальная проблема на вкладке Insight — в разделе «Известные клиенты» всегда показываются алиасы, если они заданы, а в «Прошлых подключениях» отображается алиас только если устройство в данный момент подключено, а если нет — показывается MAC-адрес.