Настройка FreeRadius для выдачи нескольких ип на один логин. Копия моей мессаги с форума НетУпа.
---------
Предлагаю на суд общественности свой вариант конфига ФриРадиуса, обеспечивающий выдачу нескольких IP по одному логину. Во многом это все основано на мессагах этой ветки за что большой респект всем ее авторам!!!
Прежде всего несколько замечаний:
1) ФриРадиус позволяет посылать только один запрос к MySql, в результате чего образуется куча ограничений. Кто не в курсе - фукнция mysql_query() не приемлет точку с запятой, так что несколько запросов в один не впихнешь. Впихнуть можно в MySql41, но там надо опции указывать при соединении к серверу, чего ФриРадиус тоже не умеет. Хотя, может, он все это умеет, но я не знаю как.
Все гуру - ю а велком.
))
2) Из-за всего вышеперечисленного приходится жертвовать аккаунтингом (ИМХО, можно и без него обойтись, но если кто-нить объяснит мне зачем он нужен в связке с УТМом - опять же будет клево - знания не бывают лишними
) и использовать MySql4, который поддерживает оператор UNITED. Как показала практика - апгрейд с третьего до четвертого мускуля на работающей системе проходит совершенно безболезненно и длится буквально десяток минут. Вчера так и заапгрейдился... Все прошло отлично.
3) Я мало что соображаю и в ФриРадиусе и в мускуле (и вообще по образованию гуманитарий
), так что прошу за нижеприведенное ногами сильно не бить. Кто может сделать лучше или исправить это - буду только рад.
.
Теперь по сути. Ставим такие строки с sql.conf (заменив соответствующие):
authorize_reply_query = "(SELECT us.id, us.login, 'Framed-IP-Address', SUBSTRING_INDEX(us.ip, ' ', 1) as ip, ':=' FROM users as us left join ip_addr_used as u on (u.ip_addr=INET_ATON(TRIM(SUBSTRING_INDEX(us.ip, ' ', 1))) and u.use_end_date=0) WHERE u.ip_addr IS NULL and us.login = '%{SQL-User-Name}' AND us.block='0') UNION (SELECT min(us.id), min(us.login), 'Framed-IP-Address', min(INET_NTOA(a.ip_addr)), ':=' FROM ip_addr as a left outer join ip_addr_used as u on (u.ip_addr=a.ip_addr and u.use_end_date=0) left join users as us on a.uid=us.id WHERE u.ip_addr IS NULL and us.login = '%{SQL-User-Name}' AND us.block='0' HAVING min(INET_NTOA(a.ip_addr)) IS NOT NULL) ORDER BY ip LIMIT 1"
accounting_start_query = "INSERT INTO ip_addr_used SELECT NULL, INET_ATON('%{Framed-IP-Address}'), users.id, UNIX_TIMESTAMP(), 0, 0 FROM users WHERE users.login='%{SQL-User-Name}'"
accounting_stop_query = "DELETE FROM ip_addr_used WHERE ip_addr_used.ip_addr=INET_ATON(TRIM('%{Framed-IP-Address}'))"
.
Вот и все. Теперь пояснения. Ставим в качестве IP юзеру все нужные адреса (это затем, чтобы УТМ им доступ в файрволле открывал), потом все дополнительные (т.е. кроме первого-основного) прописываем в дополнительных адресах. При соединии юзера Радиус заносит его адрес с ip_addr_used, при следующем - выдает из пула адресов адрес, которого нет в ip_addr_used, при окончании аккаунтинга - вытаскивает адрес из ip_addr_used (можно сделать UPDATE и писАть время окончания использования... Для красоты...). Короче, все просто. Работает сейчас у меня вполне нормально. Единственное - надо следить за этой самой таблицей ip_addr_used: она ведь не обновляется, например, при перезагрузке, так что стоит периодически поглядывать в "Отчеты"-"Использование дополнительных адресов".
И последнее. Сия фишка даже не претендует на конкуренцию с netup_radius, который поддерживает всякие прикольные вещи.
Просто, ИМХО, нет смысла платить лишние 150 баксов только потому, что есть несколько юзеров, у которых по два компа и с ними надо работать по одному счету...
Усовершенствования и критика приветствуется.
))
-----------------
Еще, для наиболее правильной проверки имени юзера рекомендую в соответствующих местах заменить us.login = '%{SQL-User-Name}' на us.login=BINARY '%{SQL-User-Name}' и типа того. Чтобы делалось регистрозависимое сравнение.
И помните, что все это работает только на MySql4!!! Поэтому сохраняйте либу libmysqlclient.so.10 от третьего, деинстальте, ставьте четвертый, возвращайте либу, пересобирайте FreeRadius (он привязывается к версии либы и глючить начинает, если не пересобрать).
Все вышесказанное тестилось на FreeBSD 4.9 и успешно работает уже недели две.