Доброго времени суток!
Прошу помощи у гуру... руки уже опускаются =(.
Вкратце о проблеме:
Имеем 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 на котором были те же грабли.
Буду очень благодарен за любую помощь!