您的位置:首页 > 其它

安装和修改freeradius,增加PPPOE服务器帐号连接数限制

2006-04-30 10:38 281 查看
(昨天没有来得及记录下来,现在回到家里再补写,代码5.7过完假后再补贴)

  由于我在linux下架设的pppoe服务器没有办法防止一个帐号多人使用,使用pppoe-server+freeradiusd,似乎只要帐号和密码一核对通过,那么就可以上网了,一个帐号可以n个人使用。虽然我之前用修改sql.conf中验证和postAuth的办法,在验证地方加上了mac地址认证,但是mac地址在系统下可以被修改,(包括我自己的机器,TPLink的网卡,右键选择属性,很容易就可以找到修改mac地址的地方了,连注册表都不用动,郁闷),几个人把自己的mac地址修改成一样的话,照样可以同时上。

前一段时间本来打算自己写pppd的插件,抛开pppd自带的radius.so和freeradius不用的,但是发现如果在pppd的plugin里自行进行mysql的连接和查询,那么每个pppoe连接建立时会调用一个plugin的进程,那么如果我在plugin中与mysql建立全程的连接,那么有1000人在线的时候,mysql会有1000个连接,但是如果分别在plugin中的验证、流量统计过程里连接mysql的话,由于流量统计的时候是定时的,那么与mysql建立连接与释放连接会很频繁,(据我理解,建立连接比查询耗费的时间更多),那么也会造成问题。最终的解决办法似乎也只能效法freeradius的方式,在mysql主机上建立类似freeradius的服务器程序,在plugin中发查询和校验包给它,由它建立几个永久的mysql连接进行查询。当中涉及到包协议的设定,密码的编码和解码,比较复杂,短时间内似乎没有办法。(当然,自己写的插件可以增加很多功能,譬如配合linux直接在插件中加上帐号限速功能,对帐号按流量或日期设定使用时间等)

为了能够在短时间内先把目前的问题解决了,我想还是先考虑能不能修改freeradius来达到我的要求。其实要让某帐号不能被同时使用,原理上大家都想得到,就是增加一个计数器(pppd的插件这头我暂时不理,那就是数据库中增加一个字段了),当用户建立pppoe连接时往该字段往计数器中加一,下线时再减一就可以了,校验密码时检查该计数器是否为1,是1的话密码验证不通过。 但是由于mysql的特性,程序中每次只能查询一条语句,也就是如果我们在query_check语句中的"select"语句后再添加"update"语句,那么update是不会被执行的,那么我们目前的任务就成了让freeradius可以在计费开始(accounting_start_query)和计费中止(Accounting_stop_query)时再执行多一条我们自行增加的sql语句。下面开始修改freeradius之旅。

一、编译freeradius。在我要开始进行修改前,先到freeradius的网站上看了下,发现freeradius的最新版本是1.1了, 我之前用的是1.0.2,干脆把这个也升级了吧。先把1.1下载回来,
#./configure --prefix=/usr/local/freeradiusd
#make
#make install
没有提示错误,修改radiusd.conf和sql.conf,但是一运行就出问题,说是没有找到rlm_sql_mysql.so,晕,于是在网上找了一下,尝试使用
#./configure --with-experimental-modules /
--with-rlm-sql-lib-dir=/usr/lib/mysql/ /
--with-rlm-sql-include-dir=/usr/include/mysql/
#make
#make install
呵呵,运行成功
这时要注意的是,新编译安装后的freeradius要修改radiusd.conf、clientts.conf、sql.conf,要让freeradius启用sql认证,还要在mysql中建立相应的表,具体安装过程在网上找一下就有了。噢,对了,如果是像我一样,以前是把freeradius安装在另一个目录(我的是radiusd目录),那么把原来的配置文件拷贝过现在的目录后,还要修改raiudsd.conf中的radiusd的路径。不然你始终运行的是旧版的freeradiusd。

二、修改freeradius。我们要修改的是让freeradius可以执行多一些我们自定的sql语句,经过对源码的查看,发现对sql命令的相关语句在src/modules/rlm_sql/目录下,修改conf.h,增加一个我们自定义的config选项,我增加的是
char *account_start_query_lrw1 NULL;
char *account_stop_query_lrw1 NULL;
按此推论,其实你可以增加再多几条,不过我现在只需要加多两条。再到rlm_sql.c中,查找account_start_query,在它的下面增加执行account_start_query_lrw1的代码,同样找到account_stop_query,增加执行account_stop_lrw1的代码,具体上班后我再找回来补上。

  三、修改sql.conf。增加
account_start_query_lrw1="update $acct_table set online=online+1 where username='%{frame_user_name}'"(这里我记不清了,可能是这样)
account_stop_query_lrw1="update $acct_table set online=online-1 where username='%{frame_user_name}'"

  四、执行freeradiusd,与服务器建立一个pppoe连接,查看数据表中online字段是否有改变 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: