Jump to content
Калькуляторы

mpd5 + freeradius2 Интересная проблема с Accounting-Request/Accounting-Response

Доброго времени суток!

Прошу помощи у гуру... руки уже опускаются =(.

 

Вкратце о проблеме:

Имеем 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 на котором были те же грабли.

 

Буду очень благодарен за любую помощь!

Share this post


Link to post
Share on other sites

насчет контрольной суммы не переживайте - все там нормально. можете отключить checksum offloading с помощью ethtool и убедиться. я бы на вашем месте скапчурил эти пакеты с якобы неверным секретом и проверил вручную, правда это или фрирадиус врет.

Share this post


Link to post
Share on other sites

а у вас исключительно 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 адресам?

Share this post


Link to post
Share on other sites

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"? если нужды нет - попробуйте отключить.

Share this post


Link to post
Share on other sites

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 by Targ

Share this post


Link to post
Share on other sites

Попробуйте как нить так:

 

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

Share this post


Link to post
Share on other sites

Интуитивные подозрения на radiusd.conf (см. первый пост)...

так вы не удалили из конфига "set radius config /usr/local/etc/mpd5/radius.conf" что ли?

Share this post


Link to post
Share on other sites

Интуитивные подозрения на radiusd.conf (см. первый пост)...

так вы не удалили из конфига "set radius config /usr/local/etc/mpd5/radius.conf" что ли?

Удалили конечно.

 

2snark

Попробуем сегодня, отпишусь..

Share this post


Link to post
Share on other sites

Я полагал, уже все знают про проблему рестрансмита пакетов и фришный 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 by snvoronkov

Share this post


Link to post
Share on other sites

Я полагал, уже все знают про проблему рестрансмита пакетов и фришный 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?

Share this post


Link to post
Share on other sites

ретрансмит - это да, косяк. 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 на предмет количества перепосылок и таймаута промеж ими и вуаля! Зависших сессий больше нет.

Share this post


Link to post
Share on other sites

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.