Jump to content

Recommended Posts

Posted (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 by kamae1ka
Posted (edited)

В FreeRADIUS есть поддержка IP-пулов на MySQL (rlm_sqlippool), не извращайтесь, почитайте доки и конфиги.

 

Свой конфиг привести, увы, не смогу - он у меня заточен под отказоустойчивость, NDB Cluster, и специфичную организацию БД пула. Гляньте лучше sql/mysql/ippool.conf

Edited by Alex/AT
Posted (edited)

Спасибо! рассмотрю этот вариант

 

Да, помогло! вот один вопрос только остался, когда он занимает ип адрес на 1 час , он как то делает сверку ? или чеерз час его свобождает?

Edited by kamae1ka
Posted

Все было хорошо до тех пор пока не прошло время истечения сессии.

радиус не отсылал пакеты на стоп сессиии. т.е. Ip адрес был занят постоянно ( мб ч ято то не то делаю ?

Posted

радиус не отсылал пакеты на стоп сессиии.

Он этого и не должен делать, это дело BRAS. RADIUS вообще не является инициатором чего-либо, он только обслуживает запросы.

 

Ip адрес был занят постоянно ( мб ч ято то не то делаю ?

Hint: "lease time"

Posted

lease time 3600 секунд, а на mpd он висит. он же сбросит его по истечению 3600 секунд при отсутствии update-stop пакетов ?

мб у меня просто аккаунтинг не проходит... надо поизучать.

Posted (edited)

а на mpd он висит

Отсюда - поподробнее.

mpd держит туннели и к DHCP отношения не имеет, у него либо свои средства выдачи IP, либо этим занимается биллинг.

Lease time там быть не может, адрес выдаётся на время сессии.

Alive(Interim-Update) он посылает вполне успешно, RADIUS их обрабатывает отдельной строчкой.

Для Acct-Stop тоже должна быть отдельная обработка.

Edited by Deac
Posted

Off: Как вам удалось заставить freeradius работать с 'CALL'? Наш ни в какую не хотел, пришлось писать сложный запрос прямо в authorize_check_query.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.