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报文的更多相关文章

  1. 第14.7节 Python模拟浏览器访问实现http报文体压缩传输

    一. 引言 在<第14.6节 Python模拟浏览器访问网页的实现代码>介绍了使用urllib包的request模块访问网页的方法.但上节特别说明http报文头Accept-Encodin ...

  2. Python模拟登陆新浪微博

    上篇介绍了新浪微博的登陆过程,这节使用Python编写一个模拟登陆的程序.讲解与程序如下: 1.主函数(WeiboMain.py): import urllib2 import cookielib i ...

  3. 【Python数据分析】Python模拟登录(一) requests.Session应用

    最近由于某些原因,需要用到Python模拟登录网站,但是以前对这块并不了解,而且目标网站的登录方法较为复杂, 所以一下卡在这里了,于是我决定从简单的模拟开始,逐渐深入地研究下这块. 注:本文仅为交流学 ...

  4. Python模拟C++输出流

    看到一Python例子,挺有意思的,用Python模拟C++的输出流OStream.单纯只是玩. 原理: 利用Python __lshift__左移内建函数<<,调用时将输出内容,如果内容 ...

  5. 【py登陆】python模拟登录

    用Python模拟登录网站 前面简单提到了 Python 模拟登录的程序,但是没写清楚,这里再补上一个带注释的 Python 模拟登录的示例程序.简单说一下流程:先用cookielib获取cookie ...

  6. 谈网页游戏外挂之用python模拟游戏(热血三国2)登陆

    看web看多了,想写写页游的外挂,其实原理是一样的,就是端口不一样协议字段你不知道,而这也提高了点技术门槛,看我们来一点一点突破这些门槛,这次我们来用python发包模拟flash的客户端登陆. 以热 ...

  7. python 模拟浏览器

    想用python模拟浏览器访问web的方法测试些东西,有哪几种方法呢? 一类:单纯的访问web,不解析其js,css等. 1. urllib2 #-*- coding:utf-8 -* import ...

  8. 【DataStructure In Python】Python模拟二叉树

    使用Python模拟二叉树的基本操作,感觉写起来很别扭.最近做编译的优化,觉得拓扑排序这种东西比较强多.近期刷ACM,发现STL不会用实在太伤了.决定花点儿时间学习一下STL.Boost其实也很强大. ...

  9. 【DataStructure In Python】Python模拟栈和队列

    用Python模拟栈和队列主要是利用List,当然也可以使用collection的deque.以下内容为栈: #! /usr/bin/env python # DataStructure Stack ...

随机推荐

  1. Swift中如何转换不同类型的Mutable指针

    在Swift中我们拥有强大高级逻辑抽象能力的同时,低级底层操作被刻意的限制了.但是有些情况下我们仍然想做一些在C语言中的hack工作,下面本猫就带大家看一看如何做这样的事. hacking is ha ...

  2. Pycharm中进行Python远程开发

    http://blog.csdn.net/pipisorry/article/details/52269952 PyCharm提供两种远程调试(Remote Debugging)的方式:    配置远 ...

  3. springMVC+Hibernate4+Spring整合一(配置文件部分)

    本实例采用springMvc hibernate 与 spring 进行整合, 用springmvc 取代了原先ssh(struts,spring,hibernate)中的struts来扮演view层 ...

  4. 剑指offer面试题6 重建二叉树(c)

  5. 【问题汇总】ScrollView嵌套ListView的问题

    因产品的需求,需要在ScrollView中嵌套ListView来达到效果.众所周知,ScrollVIew和ListView都是可滑动的容器,嵌套使用一定会出现一些问题. [html] view pla ...

  6. Android项目开发填坑记-Fragment的onBackPressed

    Github版 CSDN版 知识背景 Fragment在当前的Android开发中,有两种引用方式,一个是 Android 3.0 时加入的,一个是supportV4包中的.这里简称为Fragment ...

  7. [GitHub]第四讲:合并分支

    本地两个分支合并 先从最简单的一种情况着手.现在项目只有一个 master 分支,我来新建一个 idea 分支,实现自己的想法,commit 一下.那现在仓库内的情况就是这样的 这个是前面已经见过的情 ...

  8. RH阴性血妇女怀孕注意事项

     RH阴性血的妇女怀孕注意事项,本文主要讲解RH阴性血抗体效价检测. 第一.孕前准备:Rh阴性的妇女怀孕前,需要到血液中心或指定医院作ABO和Rh血型鉴定,并且做一次孕前血液免疫学产前检查(血型抗体检 ...

  9. Mac下关于->您不能拷贝项目“”,因为它的名称太长或包括的字符在目的宗卷上无效。<-的删除

    打开 Terminal 应用程序. 键入: sudo rm -rf注意:在"-rf"后键入一个空格.没有空格该命令将不能执行.在步骤 6 之前请不要按下 Return 键. 打开您 ...

  10. 使用dom4j技术对xml文档进行增删改练习(一)

    整个流程如下面代码所以,并对一些重要代码意义做出详细解释: import java.io.File; import java.io.FileOutputStream; import org.dom4j ...