【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用户属性 此博主有很多相关的研究,表示感谢

时间: 2025-01-20 01:14:02

【Python】模拟radius coa报文的相关文章

Python模拟数据工具哪些比较好用

今天给大家推荐两款基本的Python模拟数据工具:mock和pytest monkeypatch. 为什么要模拟数据? 我们的应用中有一些部分需要依赖外部的库或对象.为了隔离开这部分,我们需要代替这些外部依赖,因而就用到了模拟数据.我们模拟外部的API来产生特定的行为,比如说返回符合之前定义的恰当的返回值. 模拟函数 我们有一个function.py的模块: 然后我们来看下如何将其与Mock库结合使用的: 这里发生了什么?1-4行是为了兼容python 2和3来引入的代码,在python 3中m

python模拟腾讯网页登录

近日,研究Tencent网页模拟登录的过程,过程有些忐忑.先将结果写于此,供大家参考: 其加密过程在c_login_old.js文件中执行,将JS关键代码提取出来如下: function hexchar2bin(str) { var arr = []; for (var i = 0; i < str.length; i = i + 2) { arr.push("\\x" + str.substr(i, 2)) } arr = arr.join(""); eva

python模拟鼠标键盘操作 GhostMouse tinytask 调用外部脚本或程序 autopy右键另存为

1.参考 autopy (实践见最后一章节) 用Python制作游戏外挂(上) AutoPy Introduction and Tutorial autopy.mouse.smooth_move(1, 1) 可以实现平滑移动 autopy - API Reference pip install PyUserInput SavinaRoja/PyUserInput [python3.5][PyUserInput]模拟鼠标和键盘模拟 Python-模拟鼠标键盘动作 autoit selenium借助

python模拟Get请求保存网易歌曲的url

python模拟Get请求保存网易歌曲的url 作者:vpoet 日期:大约在夏季 #coding:utf-8 import requests import json url = 'http://music.163.com//api/dj/program/byradio?radioId=271002&id=271002&ids=%5B%22271002%22%5D&limit=100&offset=0' headers = { 'Host': 'music.163.com'

浅析HTTP中POST和GET区别并用Python模拟其响应和请求

最近在几周在做手游崩溃信息收集和上传,拿到崩溃信息后,使用的是HTTP的POST方法上传到公司共用的服务器的,因此做简单总结.本文首先简单介绍了HTTP协议,主要说明了POST方法和GET方法的区别:然后用Python实现了 对POST方法和GET方法的响应:最后用Python模拟了POST方法和GET方法的请求. HTTP协议简介 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写,简单来说它是一个应用层的协议,它允许将超文本标记语言(HTML)文档从W

python模拟登录开源中国

我的个人博客( 肥龙的博客)发表了新文章了! 欢迎大家过来阅读,以下是文章的连接地址 http://www.comingcode.com/?p=371 继上一篇文章模拟登录百度空间(http://www.comingcode.com/?p=357)后,为了多点推广自己的博客,通过上网搜索资料和分析http数据包,我再次使用python模拟了开源中国的登录操作,能够发表博客同时也能发送动弹. 具体的实现过程也是和登录百度空间的差不多,都是需要去分析http发送的数据包内容. 通过这两篇文章的模拟登

Python模拟登录后爬取网站内容(小说)

最近有个好友让我帮忙爬取个小说,这个小说是前三十章直接可读,后面章节需要充值VIP可见.所以就需要利用VIP账户登录后,构造Cookie,再用Python的获取每章节的url,得到内容后再使用 PyQuery 解析内容. 注意:构造Cookie的过程中,需要你在 Chrome/Firefox 登录,然后自己在控制台查看 cookie,然后手动加入. 第一步:手动构造cookie,绕过登录 [我这里不是破解账户,想破解请出门左拐] 1 #version 2.7 2 3 #!/usr/bin/pyt

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

最近由于某些原因,需要用到Python模拟登录网站,但是以前对这块并不了解,而且目标网站的登录方法较为复杂, 所以一下卡在这里了,于是我决定从简单的模拟开始,逐渐深入地研究下这块. 注:本文仅为交流学习所用. 登录特点:明文传输,有特殊标志数据 会话对象requests.Session能够跨请求地保持某些参数,比如cookies,即在同一个Session实例发出的所有请求都保持同一个cookies,而requests模块每次会自动处理cookies,这样就很方便地处理登录时的cookies问题.

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

看web看多了,想写写页游的外挂,其实原理是一样的,就是端口不一样协议字段你不知道,而这也提高了点技术门槛,看我们来一点一点突破这些门槛,这次我们来用python发包模拟flash的客户端登陆. 以热血三国2为例,热血三国2是一款balabalaba自己查去吧的游戏. step1 : 在sg2.ledu.com注册个账户  略过...step2 : 登陆游戏,wireshark抓包分析    以双线784服为例,游戏页面地址http://s784.sg2.ledu.com/,现在游戏一般都是联运