在freeradius中将routeros中的拨号用户踢下线的方法

PHP交流群:294088839,

Python交流群:652376983

先在ros的终端中输入引用:

/radius incoming set accept=yes这样将开启routeros的断线请求消息,并监听在端口udp 1700。
然后使用radclient构造一个踢人的数据包。
格式如下:引用:
echo "Acct-Session-Id=8100000c" > packet.txt
echo "User-Name=gtr" >> packet.txt
echo "Framed-IP-Address = 10.12.255.248" >> packet.txt

cat packet.txt | radclient -x 192.168.50.180:1701 disconnect 123解释如下:
Acct-Session-Id=8100000c ,8100000c 是freeradius使用的数据库中radacct表的AcctSessionld字段的值,表示这个拨号用户的会话ID。
User-Name=gtr                ,gtr是拨号用户的用户名。
Framed-IP-Address = 10.12.255.248 ,10.12.255.248是此拨号用户获取的IP地址。

radclient -x 192.168.50.180:1701 disconnect 123中,192.168.50.180:1701是routeros的IP地址和监听的端口,disconnect 表示发送断线消息,123是与radius与routeros 的通信密钥。

当执行此命令后,输出:引用:
[root@debian ~]# echo "Acct-Session-Id=8100000c" > packet.txt
[root@debian ~]# echo "User-Name=gtr" >> packet.txt
[root@debian ~]# echo "Framed-IP-Address = 10.12.255.248" >> packet.txt
[root@debian ~]# cat packet.txt | radclient -x 192.168.50.180:1701 disconnect 123
Sending Disconnect-Request of id 83 to 192.168.50.180 port 1701
        Acct-Session-Id = "8100000c"
        User-Name = "gtr"
        Framed-IP-Address = 10.12.255.248
rad_recv: Disconnect-ACK packet from host 192.168.50.180:1701, id=83, length=36
        NAS-Identifier = "MikroTik"
        NAS-IP-Address = 192.168.50.180
[root@debian ~]#马上就可以看到拨号用户被踢下线


在Steel-Belted-Radius中将routeros中的拨号用户踢下线的方法查阅了无数次的资料,参照了太美老大的文章,终于在windows下、在Steel-Belted-Radius中实现了将routeros中的拨号用户踢下线。
  这段时间在给别人做国外VPN代理服务器管理(通过radius认证实现管理多台服务器),VPN服务器用的是routeros,radius服务器用的是Steel-Belted-Radius,通过sql server 2000和asp,实现web管理。但是这里有一个令大家都头痛的难题,就是:怎样强制到期用户下线。看了太美老大的文章后,终于看到了希望。想通过抓包,然后编程实现。不过太美老大的文章讲的是linux下的实现方法,我不想费劲安装一个linux,所以在windows下安装了freeradius for windows,网上找不到配置资料,今天早上瞎捣鼓了半天,终于可以实现认证了,用了太美的方法实现强制断线,也抓到了udp数据包,终于可以编程实现了。不过,我后来发现了更省事的办法,就是把radclient.exe和cygwin1.dll这2个文件拷到装有Steel-Belted-Radius的机器中,同时把freeradius中的etc和share文件夹也拷过去,注意,这些文件和文件夹一定要按照原来的目录结构放好,然后就可以以这样的命令实现强制断线了:
echo User-Name=ppp7  | radclient.exe -d ../etc/raddb -x 192.168.0.1:1700 disconnect vpn
  命令含义,太美的文章中都有,这里就是多加了一个参数:-d ../etc/raddb ,是用来说明各种radius设备的协议标准的文件所在的目录的。另外,命令中只需指定需要强制断线的用户名就行了,其他参数可以省略。
  到这里,基本功能已经实现,接下来就可以使用简单的编程方法,自动定时到数据库里查询,发现到期用户,用shell(以VB为例)的方法向VPN服务器发出命令……
echo User-Name=bbbb | radclient 192.168.8.1:1700 disconnect testing123

======================================
FreeRADIUS+Postgresql+OpenVPN续:流量控制
http://ttz.im/blog/2010/07/272
======================================

实质上很简单,就是求和+if判断,枉自研究了半天的rlm_sql_counter

示例的是每月限制流量,针对用户组

1. 设定限制

radgroupreply组里面插入一行,命令如下:
insert into radgroupreply (groupname, attribute, op, value) values ('user','Max-Monthly-Traffic', ':=', '5368709120'); 
以上命令表示对用户组user限制流量为5G,单位是bytes

同时还要加入Acct-Interim-Interval,该参数是定义让OpenVPN plugin更新流量记录的间隔,必须是为300-3600秒之间的一个值

2. 判断命令

修改/etc/freeradius/sites-enabled/default的authorize一节,插入:
update request {
                Group-Name := "%{sql:SELECT groupname FROM radusergroup WHERE username='%{User-Name}' ORDER BY priority}"
}
if ("%{sql: SELECT SUM(acctinputoctets+acctoutputoctets) FROM radacct WHERE username='%{User-Name}' AND date_trunc('day', acctstarttime) >= date_trunc ('month', current_date) AND date_trunc('day', acctstoptime) < = last_day(current_date);}" >= "%{sql: SELECT value FROM radgroupreply WHERE groupname='%{Group-Name}' AND attribute='Max-Monthly-Traffic';}") {

reject


该行作用是用户连接时检查本月内上下行流量之和(1日-月末,acctinputoctet+acctoutputoctet),与限制相比较,如果相同或超过则拒绝认证。

中间使用了自定义函数last_day,所以需要在pgsql中定义。

3. 定义日期函数

来自http://wiki.postgresql.org/wiki/Date_LastDay
CREATE OR REPLACE FUNCTION last_day(date) RETURNS date AS $$

SELECT (date_trunc('MONTH', $1) + INTERVAL '1 MONTH - 1 day')::date; $$ LANGUAGE 'sql' IMMUTABLE STRICT; 
4. 定义Max-Monthly-Traffic

由于这不是Freeradius自带的属性,所以需要在dictionary中定义,否则freeradius不会去读这个属性

修改/etc/freeradius/dictionary


加入


Attribute Max-Monthly-Traffic 3003 integer 


重启大功告成。试验的话把流量限制改成1,应该会被拒绝连接。



bug:如果用户一直不断开连接的话就无法拒绝认证了……FreeRADIUS不能踢人下线的。OpenVPN plugin的作者建议在openvpn.conf里加入reneg-sec xx让用户定时重新验证,同时在radiusplugin.cnf中使用useauthcontrolfile=true让用户在验证时不掉线。不过在实验中useauthcontrolfile=true这条始终没成功过,不知道是什么原因。


ihipop says:

May 23, 2011 at 1:45 pm

启用useauthcontrolfile有两个条件

1.OpenVPN (>= 2.1 rc8)
2.tmp-dir对OpenVPN用户有写入权限(默认是openvpn的配置文件目录) 

这是文献 http://ihipop.info/2011/05/2434.html

Reply



ihipop says:

May 25, 2011 at 8:42 am

另外 我测试了 开始useauthcontrolfile=true的情况下 如果Simultaneous-Use 为1 发生重协商 也还是会掉线 Radius会认为你已经在线了 返回You are already logged in - access denied 把reneg-sec设置为0能解决这个问题 但是也牺牲了安全性

Reply



ihipop says:

May 25, 2011 at 8:57 am

而且我还发现一个问题 开启useauthcontrolfile=true后 即使Simultaneous-Use 为1 发生重协商错误掉线后 radius里面没记录了 但是到下次重协商 radius里面因为已经没记录了 所以会通过 但是不会在radius里面写入登录状态 导致radius里面显示不在线 实际上他在线。
到这里 使用useauthcontrolfile=true让用户在验证时不掉线。才真正显现。不过那样也就不能让用户进行计费了
真纠结。 

Reply



jack says:

July 7, 2011 at 11:11 pm

这种判断有BUG,当用户的history>500条时连接就会出现用户名和密码错误,实际上是因为记录过多select计算延迟导致的

Reply


tony says:

July 8, 2011 at 7:26 am

求更好的方法

Reply


jack says:

July 11, 2011 at 6:42 am

我也再找更好的...

Reply


tony says:

July 11, 2011 at 7:16 am

差不多要每用户每天>16条记录(16x30=480<500)才会出现你说的问题,暂时不担心这个……

Reply





SivaCoHan says:

July 15, 2011 at 1:15 pm

优化数据库。尽量使用数据库编程而不是通过外部传入数据库。能用一个sql完成的尽量不要用两条。每次建立sql连接都是需要时间的。


===================================
freeradius清除在线用户 + routeros
http://#.com/coconutnut/item/34d75c45a479b52210ee1ee1
===================================
/radius incoming set accept=yes

干掉freeradius在线用户!!
radzap -x -u test 192.168.11.207 routerostesting

把 路由中的在线用户干掉:
echo "user-name=test" | radclient -x 192.168.11.1:1700 disconnect routerostesting

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值