RouterOS генерирует RADIUS AcctSessionId, который не очень уникален. Один и тот же session-id иногда генерируется в течение нескольких дней или часов. Если этот session-id ранее использовался для пользователя, и теперь этот же пользователь получает тот же session-id, то Radius accounting (radacct) обновит как новую, так и старую запись учета. Эта проблема усиливается при установке нескольких устройств RouterOS и роуминге пользователей между ними.
Пример: Старая запись radacct: AcctSessionId: 80f000e0, UserName: testuser, Date: 2006-05-20 21:44:13
Новая запись radacct: AcctSessionId: 80f000e0, UserName: testuser, Date: 2006-05-30 16:14:23 (Обратите внимание: один и тот же AcctSessionId)
FreeRadius radacct использует AcctSessionId, UserName и NASIPAddress для обновления записи сессии:
accounting_update_query = "UPDAT E ${acct_table1} SET FramedIPAddress = ‘%{Framed-IP-Address}’, AcctSessionTime = ‘%{Acct-Session-Time}’, AcctInputOctets = ‘%{Acct-Input-Octets}’, AcctOutputOctets = ‘%{Acct-Output-Octets}’ WHERE AcctSessionId = ‘%{Acct-Session-Id}’ AND UserName = ‘%{SQL-User-Name}’ AND NASIPAddress= ‘%{NAS-IP-Address}’"
В этом сценарии Radius обновит обе записи, что означает, что время сессии и трафик загрузки/выгрузки будет учтен дважды.
Текущие AcctSessionId’s в RouterOS: 80f000e0, 80f000e1, 80f000e2, 80f000e3, 80f000e5
Другие производители используют более уникальный Id: 447ce53300000013, 447c862f0000000f, 447c57cd00000006
Если я создам уникальный SQL-ключ для AcctSessionId и UserName, то INSERT будет проигнорирован, а "старая" запись будет обновлена. Это работает, но приведет к некорректным записям учета, так как старая запись будет перезаписана. Желателен более уникальный AcctSessionId! Или есть способ задать длину sessionId?
Пример: Старая запись radacct: AcctSessionId: 80f000e0, UserName: testuser, Date: 2006-05-20 21:44:13
Новая запись radacct: AcctSessionId: 80f000e0, UserName: testuser, Date: 2006-05-30 16:14:23 (Обратите внимание: один и тот же AcctSessionId)
FreeRadius radacct использует AcctSessionId, UserName и NASIPAddress для обновления записи сессии:
accounting_update_query = "UPDAT E ${acct_table1} SET FramedIPAddress = ‘%{Framed-IP-Address}’, AcctSessionTime = ‘%{Acct-Session-Time}’, AcctInputOctets = ‘%{Acct-Input-Octets}’, AcctOutputOctets = ‘%{Acct-Output-Octets}’ WHERE AcctSessionId = ‘%{Acct-Session-Id}’ AND UserName = ‘%{SQL-User-Name}’ AND NASIPAddress= ‘%{NAS-IP-Address}’"
В этом сценарии Radius обновит обе записи, что означает, что время сессии и трафик загрузки/выгрузки будет учтен дважды.
Текущие AcctSessionId’s в RouterOS: 80f000e0, 80f000e1, 80f000e2, 80f000e3, 80f000e5
Другие производители используют более уникальный Id: 447ce53300000013, 447c862f0000000f, 447c57cd00000006
Если я создам уникальный SQL-ключ для AcctSessionId и UserName, то INSERT будет проигнорирован, а "старая" запись будет обновлена. Это работает, но приведет к некорректным записям учета, так как старая запись будет перезаписана. Желателен более уникальный AcctSessionId! Или есть способ задать длину sessionId?
