kamae1ka Posted December 7, 2011 Posted December 7, 2011 (edited) Есть mpd5 + freeradius2 + mysql 5.0 с процедурами смысл в чем, я выдаю адреса из пула мускл, при выдаче ставлю 1 ( якобы занят), но он выполняет процедуры слишком быстро и выдается 2 и более одинаковых ip на один интерфейс ng. как можно оптимизировать процедуру - authorize_check_query = "call auth('%{User-Name}')" BEGIN IF ('1'=(SELECT logins LIKE '10.%')) THEN SELECT 1,INET_NTOA(ip) as `User-Name`,'User-Password' as Attribute, INET_NTOA(ip) as `User-Password`,':=' FROM ip_groups g, iptraffic_service_links i, service_links s, users, accounts a WHERE g.is_deleted=0 AND g.ip_group_id=i.ip_group_id AND i.id=s.id AND s.account_id=a.id AND ip=INET_ATON(logins) AND a.id=users.basic_account AND users.port_number=999; ELSE SELECT 1, dsl.login as `User-Name`,'User-Password' as Attribute, dsl.password as `User-Password`,':=' FROM dialup_service_links dsl,service_links sl,accounts a WHERE dsl.login = logins AND dsl.is_deleted = 0 AND dsl.id=sl.id AND sl.account_id=a.id; END IF; END authorize_reply_query = "call att('%{User-Name}')" BEGIN IF ('1'=(SELECT logins LIKE '10.%')) THEN # получение SPEED SELECT 1, 'User-Name', 'Class' AS Attribute, rd.value, '=' AS Op FROM ip_groups g, iptraffic_service_links i, service_links s, users u, accounts a, dialup_service_links dl, service_links sl, radius_data rd WHERE g.is_deleted=0 AND g.ip_group_id=i.ip_group_id AND i.id=s.id AND s.account_id=a.id AND ip=INET_ATON(logins) AND a.id=u.basic_account AND dl.login = u.login AND dl.id=sl.id AND sl.is_deleted=0 AND rd.owner_id=sl.service_id AND rd.attr=1 UNION # DHCP SELECT '1', 'User-Name', 'Framed-IP-Address' AS Attribute, rd.pool_name, '=' AS Op FROM ip_groups ig, iptraffic_service_links ip,service_links sl,radippool rd, accounts a WHERE ig.ip=INET_ATON(logins) AND ig.is_deleted=0 AND ip.ip_group_id=ig.ip_group_id AND sl.id=ip.id AND ip.id=sl.id AND sl.account_id=a.id AND a.balance>=0 AND dhcp_real=1 AND NOT `user`<>logins AND used=0 AND a.is_blocked=0 UNION # получение Real IP SELECT '1', 'User-Name', 'Framed-IP-Address' AS Attribute, rd.pool_name, '=' AS Op FROM ip_groups ig, iptraffic_service_links ip,service_links sl,radippool rd, accounts a WHERE ig.ip=INET_ATON(logins) AND ig.is_deleted=0 AND ip.ip_group_id=ig.ip_group_id AND sl.id=ip.id AND ip.id=sl.id AND sl.account_id=a.id AND a.balance>=0 AND `user`=logins AND used=0 AND a.is_blocked=0 UNION # gray SELECT '1', 'User-Name', 'Framed-IP-Address' AS Attribute, rd.pool_name, '=' AS Op FROM ip_groups g, iptraffic_service_links i, service_links s, accounts a, radippool rd WHERE g.is_deleted=0 AND g.ip_group_id=i.ip_group_id AND ip=INET_ATON(logins) AND i.id=s.id AND s.account_id=a.id #AND a.is_blocked<>0 AND used=0 AND gray=1 LIMIT 3; # вставка ELSE # получение SPEED SELECT 1, 'User-Name', 'mpd-limit' AS Attribute, rd.value, '+=' AS Op FROM dialup_service_links dsl, service_links sl, radius_data rd WHERE dsl.login=logins AND dsl.id=sl.id AND sl.is_deleted =0 AND rd.owner_id=sl.service_id AND rd.attr=7 UNION SELECT '1', 'User-Name', 'Framed-IP-Netmask' AS Attribute, '255.255.255.255', '=' AS Op UNION # получение Real IP SELECT '1', 'User-Name', 'Framed-IP-Address' AS Attribute, rd.pool_name, '=' AS Op FROM dialup_service_links dsl,service_links sl,accounts a, radippool rd WHERE dsl.login = logins AND dsl.is_deleted = 0 AND `user`=logins UNION # получение DHCP Real SELECT '1', 'User-Name', 'Framed-IP-Address' AS Attribute, rd.pool_name, '=' AS Op FROM dialup_service_links dsl,service_links sl,accounts a, radippool rd WHERE dsl.login = logins AND dsl.is_deleted = 0 AND dsl.id=sl.id AND sl.account_id=a.id AND rd.dhcp_real=1 AND used=0 AND balance>=0 AND a.is_blocked=0 LIMIT 4; END IF; END accounting_start_query = "call start('%{Framed-IP-Address}','%{Acct-Session-Id}','%{SQL-User-Name}','%{Framed-IP-Address}','%{Calling-Station-Id}','%{NAS-IP-Address}','%{Acct-Input-Packets:-0}','%{Acct-Input-Octets:-0}','%{Acct-Input-Gigawords:-0}','%{Acct-Output-Packets:-0}','%{Acct-Output-Octets:-0}','%{Acct-Output-Gigawords:-0}', '%{Acct-Session-Time:-0}','%S')" BEGIN UPDATE radippool SET `used`='1',`last_used`=tim1, `start_used`=tim1 where `pool_name`=logins; INSERT radonline VALUES ('',acct,sqll,fia,csi,nia,aip,aio,aig,aop,aoo,aog,tim,tim1,'1',tim2); END Edited December 7, 2011 by kamae1ka Вставить ник Quote
Alex/AT Posted December 7, 2011 Posted December 7, 2011 (edited) В FreeRADIUS есть поддержка IP-пулов на MySQL (rlm_sqlippool), не извращайтесь, почитайте доки и конфиги. Свой конфиг привести, увы, не смогу - он у меня заточен под отказоустойчивость, NDB Cluster, и специфичную организацию БД пула. Гляньте лучше sql/mysql/ippool.conf Edited December 7, 2011 by Alex/AT Вставить ник Quote
kamae1ka Posted December 8, 2011 Author Posted December 8, 2011 (edited) Спасибо! рассмотрю этот вариант Да, помогло! вот один вопрос только остался, когда он занимает ип адрес на 1 час , он как то делает сверку ? или чеерз час его свобождает? Edited December 8, 2011 by kamae1ka Вставить ник Quote
kamae1ka Posted December 8, 2011 Author Posted December 8, 2011 Все было хорошо до тех пор пока не прошло время истечения сессии. радиус не отсылал пакеты на стоп сессиии. т.е. Ip адрес был занят постоянно ( мб ч ято то не то делаю ? Вставить ник Quote
Deac Posted December 8, 2011 Posted December 8, 2011 радиус не отсылал пакеты на стоп сессиии. Он этого и не должен делать, это дело BRAS. RADIUS вообще не является инициатором чего-либо, он только обслуживает запросы. Ip адрес был занят постоянно ( мб ч ято то не то делаю ? Hint: "lease time" Вставить ник Quote
kamae1ka Posted December 8, 2011 Author Posted December 8, 2011 lease time 3600 секунд, а на mpd он висит. он же сбросит его по истечению 3600 секунд при отсутствии update-stop пакетов ? мб у меня просто аккаунтинг не проходит... надо поизучать. Вставить ник Quote
Deac Posted December 8, 2011 Posted December 8, 2011 (edited) а на mpd он висит Отсюда - поподробнее. mpd держит туннели и к DHCP отношения не имеет, у него либо свои средства выдачи IP, либо этим занимается биллинг. Lease time там быть не может, адрес выдаётся на время сессии. Alive(Interim-Update) он посылает вполне успешно, RADIUS их обрабатывает отдельной строчкой. Для Acct-Stop тоже должна быть отдельная обработка. Edited December 8, 2011 by Deac Вставить ник Quote
sirmax Posted December 11, 2011 Posted December 11, 2011 повисшие сессии? Удаляйте сессии у которых апдейтов не было какой-то период времени? Или мпд не шлет аккаунтиг-апдейты? Вставить ник Quote
xcme Posted December 11, 2011 Posted December 11, 2011 Off: Как вам удалось заставить freeradius работать с 'CALL'? Наш ни в какую не хотел, пришлось писать сложный запрос прямо в authorize_check_query. Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.