【Python】模拟radius coa报文
Radius协议中网关设备NAS是client,实现radius协议的服务为服务端(例如freeradius),这种情况下radius server并不能主动给NAS发送信息。在 rfc3576 Dynamic Authorization Extensions to RADIUS 中定义了一种radius的拓展,叫做
Change-of-Authorization (CoA),通过这个协议就可以从radius server主动给 radius client发起请求,例如用户下线,用户上网带宽动态修改等需求就可以通过COA来完成。
下面就是用pyrad来完成一种COA的请求发送,需求是通过python发送COA给网关,网关正确应答ACK。
注意: pypi中的pyrad最新版本并没有实现coa,你可以通过github自行安装 pyrad : http://github.com/andreynpetrov/pyrad.git 这个版本有这部分实现。
COA中定义的code
40 - Disconnect-Request [RFC2882] 下线请求
41 - Disconnect-ACK [RFC2882] 下线确认
42 - Disconnect-NAK [RFC2882] 下线不正常
43 - CoA-Request [RFC2882] coa请求
44 - CoA-ACK [RFC2882] coa确认
45 - CoA-NAK [RFC2882] coa不正常
Python模拟COA
这里的COA请求是网关设备厂商自定义的,用来完成用户认证,具体包结构定义只能参照rfc和厂家给的定义来实现,这里只记录下程序如何写的。调试中几个重要的点有: 网关厂商的字典,对于字典中厂商自定义字段的含义和值是否正确,防火墙是开启对应的白名单。 如果总是无法调通,请抓包对比,然后再测试。
#coding:utf-8
import socket, sys
import pyrad.packet
from pyrad.client import Client
from pyrad.dictionary import Dictionary
#NAS and Radius same 注意字典的加载
dict_dir = "./dictionary"
SECRET = "test"
NASIP = "172.16.15.188"
def send_coa_auth(uname, acl="auth_sla", qos="32M_Full"):
"""
send coa message to NAS, the attributes are
User-Name
Calling-Station-Id
Benu-ACL-Policy
Benu-QoS-Policy
"""
srv = Client(server=NASIP, secret=SECRET, dict=Dictionary(dict_dir))
req = srv.CreateCoAPacket(code=pyrad.packet.CoARequest, User_Name=uname)
req["Calling-Station-Id"] = uname
req["NAS-IP-Address"] = NASIP
req["Benu-ACL-Policy"] = acl # Benu开头为厂商定义字段
req["Benu-QoS-Policy"] = qos
try:
print "Sending COA request"
reply = srv.SendPacket(req)
except pyrad.client.Timeout:
print "DAS(NAS or Bas) does not reply"
return
except socket.error, error:
print "Network error: " + error[1]
return
if reply.code==pyrad.packet.CoAACK:
print "Coa accepted"
elif reply.code==pyrad.packet.CoANAK:
print "Coa nak"
else:
print reply.code
print "Attributes returned by NAS:"
for i in reply.keys():
print "%s: %s" % (i, reply[i][0])
if __name__ == "__main__":
send_coa_auth("F8-CF-C5-83-09-B9")
'''
# python coa_auth.py
import settings failure
Sending COA request
Coa accepted
Attributes returned by NAS:
Event-Timestamp: 1452219598
'''
参考
使用python发送COA报文动态改变RADIUS用户属性 此博主有很多相关的研究,表示感谢
【Python】模拟radius coa报文的更多相关文章
- 第14.7节 Python模拟浏览器访问实现http报文体压缩传输
一. 引言 在<第14.6节 Python模拟浏览器访问网页的实现代码>介绍了使用urllib包的request模块访问网页的方法.但上节特别说明http报文头Accept-Encodin ...
- Python模拟登陆新浪微博
上篇介绍了新浪微博的登陆过程,这节使用Python编写一个模拟登陆的程序.讲解与程序如下: 1.主函数(WeiboMain.py): import urllib2 import cookielib i ...
- 【Python数据分析】Python模拟登录(一) requests.Session应用
最近由于某些原因,需要用到Python模拟登录网站,但是以前对这块并不了解,而且目标网站的登录方法较为复杂, 所以一下卡在这里了,于是我决定从简单的模拟开始,逐渐深入地研究下这块. 注:本文仅为交流学 ...
- Python模拟C++输出流
看到一Python例子,挺有意思的,用Python模拟C++的输出流OStream.单纯只是玩. 原理: 利用Python __lshift__左移内建函数<<,调用时将输出内容,如果内容 ...
- 【py登陆】python模拟登录
用Python模拟登录网站 前面简单提到了 Python 模拟登录的程序,但是没写清楚,这里再补上一个带注释的 Python 模拟登录的示例程序.简单说一下流程:先用cookielib获取cookie ...
- 谈网页游戏外挂之用python模拟游戏(热血三国2)登陆
看web看多了,想写写页游的外挂,其实原理是一样的,就是端口不一样协议字段你不知道,而这也提高了点技术门槛,看我们来一点一点突破这些门槛,这次我们来用python发包模拟flash的客户端登陆. 以热 ...
- python 模拟浏览器
想用python模拟浏览器访问web的方法测试些东西,有哪几种方法呢? 一类:单纯的访问web,不解析其js,css等. 1. urllib2 #-*- coding:utf-8 -* import ...
- 【DataStructure In Python】Python模拟二叉树
使用Python模拟二叉树的基本操作,感觉写起来很别扭.最近做编译的优化,觉得拓扑排序这种东西比较强多.近期刷ACM,发现STL不会用实在太伤了.决定花点儿时间学习一下STL.Boost其实也很强大. ...
- 【DataStructure In Python】Python模拟栈和队列
用Python模拟栈和队列主要是利用List,当然也可以使用collection的deque.以下内容为栈: #! /usr/bin/env python # DataStructure Stack ...
随机推荐
- Swift中如何转换不同类型的Mutable指针
在Swift中我们拥有强大高级逻辑抽象能力的同时,低级底层操作被刻意的限制了.但是有些情况下我们仍然想做一些在C语言中的hack工作,下面本猫就带大家看一看如何做这样的事. hacking is ha ...
- Pycharm中进行Python远程开发
http://blog.csdn.net/pipisorry/article/details/52269952 PyCharm提供两种远程调试(Remote Debugging)的方式: 配置远 ...
- springMVC+Hibernate4+Spring整合一(配置文件部分)
本实例采用springMvc hibernate 与 spring 进行整合, 用springmvc 取代了原先ssh(struts,spring,hibernate)中的struts来扮演view层 ...
- 剑指offer面试题6 重建二叉树(c)
- 【问题汇总】ScrollView嵌套ListView的问题
因产品的需求,需要在ScrollView中嵌套ListView来达到效果.众所周知,ScrollVIew和ListView都是可滑动的容器,嵌套使用一定会出现一些问题. [html] view pla ...
- Android项目开发填坑记-Fragment的onBackPressed
Github版 CSDN版 知识背景 Fragment在当前的Android开发中,有两种引用方式,一个是 Android 3.0 时加入的,一个是supportV4包中的.这里简称为Fragment ...
- [GitHub]第四讲:合并分支
本地两个分支合并 先从最简单的一种情况着手.现在项目只有一个 master 分支,我来新建一个 idea 分支,实现自己的想法,commit 一下.那现在仓库内的情况就是这样的 这个是前面已经见过的情 ...
- RH阴性血妇女怀孕注意事项
RH阴性血的妇女怀孕注意事项,本文主要讲解RH阴性血抗体效价检测. 第一.孕前准备:Rh阴性的妇女怀孕前,需要到血液中心或指定医院作ABO和Rh血型鉴定,并且做一次孕前血液免疫学产前检查(血型抗体检 ...
- Mac下关于->您不能拷贝项目“”,因为它的名称太长或包括的字符在目的宗卷上无效。<-的删除
打开 Terminal 应用程序. 键入: sudo rm -rf注意:在"-rf"后键入一个空格.没有空格该命令将不能执行.在步骤 6 之前请不要按下 Return 键. 打开您 ...
- 使用dom4j技术对xml文档进行增删改练习(一)
整个流程如下面代码所以,并对一些重要代码意义做出详细解释: import java.io.File; import java.io.FileOutputStream; import org.dom4j ...