Targ Posted May 17, 2013 Доброго времени суток! Прошу помощи у гуру... руки уже опускаются =(. Вкратце о проблеме: Имеем UTM5+freeradius+MySQL, MPD5 c PPPoE. Возникла задача реализовать авторизацию абонентов с отрицательным балансом с редиректом на страницу "Денег хотим", адекватную динамическую раздачу белых и серых адресов. Было принято решение перейти со штатного радиуса UTM на freeradius. При тестовых испытаниях при 200-300 авторизованных фрирадиусом абонентов было обнаружено, что часть (процентов 30-40) Accounting-Request пакетов не обрабатываются фрирадиусом. В итоге имеем подвисшие сессии в биллинге. При анализе пакетов с помощью tcpdump обнаружили, что какое-то время по конкретному абоненту от NAS`a фрирадиусу приходят alive пакеты. Фрирадиус обрабатывает их корректно, обновляет необходимые таблицы биллинга. Через какое-то время фрирадиус начинает дропать эти пакеты с ошибкой: Received Accounting-Request packet from client X.X.X.X with invalid signature! (Shared secret is incorrect.) Dropping packet without response. При чем в биллинге наблюдаем что часть сессий обрабатывается корректно вплоть до закрытия сессии абонентом. ---------------------------------------------------------------------------------------------- Версии софта и OS: Биллинг: root@balrog:~# uname -a Linux balrog 3.5.0-23-generic #35~precise1-Ubuntu SMP Fri Jan 25 17:15:33 UTC 2013 i686 i686 i386 GNU/Linux root@balrog:~# radiusd -v radiusd: FreeRADIUS Version 2.2.0, for host i686-pc-linux-gnu, built on May 15 2013 at 11:17:56 Copyright (C) 1999-2011 The FreeRADIUS server project and contributors. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. You may redistribute copies of FreeRADIUS under the terms of the GNU General Public License. For more information about these matters, see the file named COPYRIGHT. NAS: root@nas2:/root # uname -a FreeBSD nas2 9.1-RELEASE FreeBSD 9.1-RELEASE #0 r243825: Tue Dec 4 09:23:10 UTC 2012 root@farrell.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64 root@nas2:/root # mpd5 -version Version 5.6 (root@nas2 15:56 15-Mar-2013) Логи radiusd -X в момент дропа: rad_recv: Accounting-Request packet from host X.X.X.X port 22738, id=110, length=415 Cleaning up request 8637 ID 110 with timestamp +191 Received Accounting-Request packet from client X.X.X.X with invalid signature! (Shared secret is incorrect.) Dropping packet without response. Going to the next request Waking up in 0.1 seconds. radmin: root@balrog:/var/log/freeradius# radmin -e "stats client acct" requests 1854858 responses 129466 dup 0 invalid 1303 malformed 0 bad_signature 1715581 dropped 8482 unknown_types 0 tcpdump говорит, что ВСЕ(!!) пакеты Accounting-Response, которые уходят с фрирадиуса на MPD, имеют неверную контрольную сумму: root@balrog:~# tcpdump -vvv -i eth0 port 1812 or 1813 .... .... 09:47:12.297459 IP (tos 0x0, ttl 64, id 54854, offset 0, flags [none], proto UDP (17), length 48) balrog.radius-acct > X.X.X.X.17342: [bad udp cksum 0x9682 -> 0xb61b!] RADIUS, length: 20 Accounting Response (5), id: 0x3b, Authenticator: b955337e7bcf474fc833ee9cd8d3238c .... На биллинге живет iptables, который не смотрит на этот интерфейс (eth0). Конфиг фрирадиуса: root@balrog:~# cat /etc/freeradius/radiusd.conf | grep -v '#' prefix = /usr exec_prefix = /usr sysconfdir = /etc localstatedir = /var sbindir = ${exec_prefix}/sbin logdir = /var/log/freeradius raddbdir = /etc/freeradius radacctdir = ${logdir}/radacct name = freeradius confdir = ${raddbdir} run_dir = ${localstatedir}/run/${name} db_dir = ${raddbdir} libdir = /usr/lib/freeradius pidfile = ${run_dir}/${name}.pid user = freerad group = freerad max_request_time = 60 cleanup_delay = 8 max_requests = 10000 listen { type = auth ipaddr = * port = 1812 } listen { ipaddr = * port = 1813 type = acct } hostname_lookups = no allow_core_dumps = no regular_expressions = yes extended_expressions = yes log { destination = files file = ${logdir}/radius.log syslog_facility = daemon stripped_names = no auth = no auth_badpass = yes auth_goodpass = yes } checkrad = ${sbindir}/checkrad security { max_attributes = 200 reject_delay = 1 status_server = yes } proxy_requests = no $INCLUDE proxy.conf $INCLUDE clients.conf thread pool { start_servers = 5 max_servers = 32 min_spare_servers = 3 max_spare_servers = 10 max_requests_per_server = 0 } modules { $INCLUDE ${confdir}/modules/ $INCLUDE eap.conf $INCLUDE sql.conf } instantiate { exec expr expiration logintime } $INCLUDE policy.conf $INCLUDE sites-enabled/ Модуль radutmp не используется и отключен. DEFAULT фрирадиуса: root@balrog:~# cat /etc/freeradius/sites-enabled/default | grep -v '#' authorize { preprocess update control { Pool-Name = 'dynamic' } chap mschap digest suffix eap { ok = return } sql expiration logintime pap } authenticate { Auth-Type PAP { pap } Auth-Type CHAP { chap } Auth-Type MS-CHAP { mschap } digest eap } preacct { preprocess acct_unique suffix } accounting { detail sql } session { sql } post-auth { } pre-proxy { } post-proxy { eap } Секция radius конфига mpd: root@nas2:/root # cat /usr/local/etc/mpd5/mpd.conf ........ ........ radius: set radius config /usr/local/etc/mpd5/radius.conf set radius retries 5 set radius timeout 15 set radius me X.X.X.X set radius identifier nas2 set auth acct-update 60 set auth enable radius-auth set auth enable radius-acct set radius enable message-authentic Первоначально использовали версию фрирадиуса 2.1 на котором были те же грабли. Буду очень благодарен за любую помощь! Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
boco Posted May 17, 2013 насчет контрольной суммы не переживайте - все там нормально. можете отключить checksum offloading с помощью ethtool и убедиться. я бы на вашем месте скапчурил эти пакеты с якобы неверным секретом и проверил вручную, правда это или фрирадиус врет. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
terrible Posted May 20, 2013 cat /usr/local/etc/mpd5/radius.conf ? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Targ Posted May 20, 2013 cat /usr/local/etc/mpd5/radius.conf ? root@nas2:/usr/local/etc/mpd5 # cat radius.conf auth X.X.X.X:1812 oursecret 1812 1813 acct X.X.X.X:1813 oursecret 1812 1813 Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
terrible Posted May 20, 2013 а у вас исключительно RADIUS авторизация используется? Есть ли в скриптах up какая-либо ещё авторизация? oursecret одинаковый и на mpd и на freeradius? попробуйте вместо: set radius config /usr/local/etc/mpd5/radius.conf прописать: set radius server X.X.X.X oursecret 1812 1813 Может ли MPD обращаться к райдиусу по разным IP адресам? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Targ Posted May 20, 2013 (edited) Edited May 20, 2013 by Targ Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
boco Posted May 20, 2013 root@nas2:/usr/local/etc/mpd5 # cat radius.conf auth X.X.X.X:1812 oursecret 1812 1813 acct X.X.X.X:1813 oursecret 1812 1813 а зачем такие странные значения таймаута и повторов (1812 1813)? насколько необходима опция "set radius enable message-authentic"? если нужды нет - попробуйте отключить. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Targ Posted May 21, 2013 (edited) root@nas2:/usr/local/etc/mpd5 # cat radius.conf auth X.X.X.X:1812 oursecret 1812 1813 acct X.X.X.X:1813 oursecret 1812 1813 а зачем такие странные значения таймаута и повторов (1812 1813)? насколько необходима опция "set radius enable message-authentic"? если нужды нет - попробуйте отключить. "прописать: set radius server X.X.X.X oursecret 1812 1813" - сделали. message-authentic - отключили в обоих конфигах. Результат - все те же проблемы. Куда копать-ковырять вообще непонятно. Интуитивные подозрения на radiusd.conf (см. первый пост)... Edited May 21, 2013 by Targ Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
snark Posted May 21, 2013 Попробуйте как нить так: startup: set user admin admin admin set console self 127.0.0.1 5005 set console open set radsrv peer 1.1.1.1 <RADIUS secret> set radsrv self 2.2.2.2 1700 set radsrv open log -auth -bund -ccp -chat -console -echo -ecp -frame -fsm -iface -ipcp -ipv6cp -lcp -link -phys -radius -radius2 -rep radius: set auth disable internal set auth max-logins 1 CI set auth timeout 60 set auth enable radius-auth set auth enable radius-acct set auth acct-update 60 set radius identifier mpd set radius timeout 60 set radius retries 3 set radius server 1.1.1.1 <RADIUS secret> 1645 1646 set radius me 2.2.2.2 default: create bundle template B set ipcp ranges 3.3.3.3 127.0.0.2/32 set ipcp dns 4.4.4.4 5.5.5.5 set ipcp no vjcomp set ipcp no req-pri-dns set ipcp no req-sec-dns set ipcp no req-pri-nbns set ipcp no req-sec-nbns create link template L pppoe set link action bundle B set link max-children 1000 set link keep-alive 15 60 set link enable multilink set link no chap eap pap set link enable pap set pppoe acname provider.ru load radius create link template 100 L set pppoe iface vlan100 set link enable incoming create link template 101 L set pppoe iface vlan101 set link enable incoming ... create link template 998 L set pppoe iface vlan998 set link enable incoming create link template 999 L set pppoe iface vlan999 set link enable incoming Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
boco Posted May 22, 2013 Интуитивные подозрения на radiusd.conf (см. первый пост)... так вы не удалили из конфига "set radius config /usr/local/etc/mpd5/radius.conf" что ли? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Targ Posted May 22, 2013 Интуитивные подозрения на radiusd.conf (см. первый пост)... так вы не удалили из конфига "set radius config /usr/local/etc/mpd5/radius.conf" что ли? Удалили конечно. 2snark Попробуем сегодня, отпишусь.. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
boco Posted May 23, 2013 + включите в mpd отладочные логи radius и, возможно, fsm Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
snvoronkov Posted May 23, 2013 (edited) Я полагал, уже все знают про проблему рестрансмита пакетов и фришный libradius. Патч вкостыливать на сервера с mpd. --- lib/libradius/radlib.c.old 2012-12-01 19:35:43.000000000 +0600 +++ lib/libradius/radlib.c 2012-12-01 19:37:17.000000000 +0600 @@ -641,10 +641,6 @@ insert_scrambled_password(h, h->srv); } insert_message_authenticator(h, 0); - if (h->out[POS_CODE] != RAD_ACCESS_REQUEST) { - /* Insert the request authenticator into the request */ - insert_request_authenticator(h, h->srv); - } /* Send the request */ n = sendto(h->fd, h->out, h->out_len, 0, @@ -910,6 +906,10 @@ } h->try = h->srv = 0; + if (h->out[POS_CODE] != RAD_ACCESS_REQUEST) { + /* Insert the request authenticator into the request */ + insert_request_authenticator(h, h->srv); + } return rad_continue_send_request(h, 0, fd, tv); } Edited May 23, 2013 by snvoronkov Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
boco Posted May 23, 2013 Я полагал, уже все знают про проблему рестрансмита пакетов и фришный libradius. ретрансмит - это да, косяк. http://www.freebsd.org/cgi/query-pr.cgi?pr=154842, только в фиксе, как я понял, обошлись memset'ом: if (h->out[POS_CODE] != RAD_ACCESS_REQUEST) { /* Insert the request authenticator into the request */ - insert_request_authenticator(h, h->srv); + memset(&h->out[POS_AUTH], 0, LEN_AUTH); + insert_request_authenticator(h, 0); } другой вопрос интереснее - почему mpd начинает сыпать этими ретрансмитами? возможно, фаервол блокирует acct-response от radius? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
snvoronkov Posted May 23, 2013 ретрансмит - это да, косяк. http://www.freebsd.o...r.cgi?pr=154842, только в фиксе, как я понял, обошлись memset'ом: //skip Не совсем так. Там сложный коммит http://svnweb.freebsd.org/base/head/lib/libradius/radlib.c?r1=228730&r2=243956 В нем алгоритм работы с серверами достаточно жестко меняется, IMHO. другой вопрос интереснее - почему mpd начинает сыпать этими ретрансмитами? возможно, фаервол блокирует acct-response от radius? У меня тупо экспайрились пакеты из-за тормозов мускуля. Вкостылил патч, поодправил mpd.conf на предмет количества перепосылок и таймаута промеж ими и вуаля! Зависших сессий больше нет. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...