关于Pyrad的一些问题

时间:2017-11-23 08:27:28

标签: python python-3.x radius

我正在尝试使用python库pyrad(https://github.com/wichert/pyrad)来构建一个简单的Radius服务器。但我遇到了一些问题。

这是我用来创建Radius服务器的代码:

from pyrad import dictionary, packet, server

class FakeServer(server.Server):
    def _HandleAuthPacket(self, pkt):
        server.Server._HandleAuthPacket(self, pkt)

    print('Received an authentication request')
    print("Attributes: ")
    for attr in pkt.keys():
        print("%s: %s" % (attr, pkt[attr]))
    # print

    username = pkt['User-Name'][0]
    password = pkt['User-Password'][0]
    password = pkt.PwDecrypt(password)
    device_ip = pkt['NAS-IP-Address'][0]
    reply = self.CreateReplyPacket(pkt)

    # Default to refuse
    reply.code = packet.AccessReject
    reply['Reply-Message'] = 'You are unable to login'
    return self.SendReplyPacket(pkt.fd, reply)

def _HandleAcctPacket(self, pkt):
    server.Server._HandleAcctPacket(self, pkt)

    print("Received an accounting request")
    print("Attributes: ")
    for attr in pkt.keys():
        print("%s: %s" % (attr, pkt[attr]))
    # print
    reply = self.CreateReplyPacket(pkt)
    self.SendReplyPacket(pkt.fd, reply)

if __name__ == '__main':
    srv = FakeServer(dict=dictionary.Dictionary("dictionary/dictionary"))
    srv.hosts["192.168.3.183"] = server.RemoteHost("192.168.3.183",
                                               b"Kah3choteereethiejeimaeziecumi",
                                               "192.168.3.183")
    srv.BindToAddress("")
    print('Radius server is ready to start!')
    srv.Run()

这是我用来连接服务器的代码:

from __future__ import print_function
from pyrad.client import Client
from pyrad.dictionary import Dictionary
import pyrad.packet

srv = Client(server="192.168.3.183", secret=b"Kah3choteereethiejeimaeziecumi",
             dict=Dictionary("dictionary/dictionary"))

# create request
req = srv.CreateAuthPacket(code=pyrad.packet.AccessRequest, User_Name="test",
                           NAS_IP_Address="192.168.2.101")
req["User-Password"] = req.PwCrypt("password")

# send request
reply = srv.SendPacket(req)


if reply.code == pyrad.packet.AccessAccept:
    print("access accepted")
else:
    print("access denied")

print("Attributes returned by server:")
for i in reply.keys():
    print("%s: %s" % (i, reply[i]))

如果我启动服务器并从本地连接,那就可以了! the screenshot

但如果我从其他电脑上连接,它会超时,而pyrad.log会显示:

Dropping packet: Received packet from unknown host

我在网上搜索了很长时间。但没用。请帮助或尝试提供一些如何实现这一点的想法。

2 个答案:

答案 0 :(得分:0)

要成为有效的RADIUS请求,RADIUS服务器通常不仅要求请求使用RADIUS密钥,还要求来自某个IP的请求。

不知道Python / Pyrad我猜测服务器代码的以下部分中的至少一个IP应该是客户端IP,您尝试从该客户端IP发送请求:

server.RemoteHost("192.168.3.183", b"Kah3choteereethiejeimaeziecumi", "192.168.3.183")

查看Pyrad的文档,它应该说明客户端IP。

答案 1 :(得分:0)

我在寻找答案时发现了这一点。我最终摸索了代码库并得到了服务器的响应。对于背景,我为ryu-controller设置了这个。我的服务器是FreeRADIUS,它们位于不同的VM上。我一直在测试radclient实用程序 - 所以我已经知道服务器工作了。

在这一行:

1) Use the product file as static input to the mapper. Use `DistributedCahe` or alternatively you may add a big `JSON` object consisting of all the products into the context.

2) In the Mapper, make sure that one order is input to the mapper. Using `product` file from `DistributedCahe` (or `product` JSON from the context); create your output JSON and write to context.

3) You do not need a reducer here.

确保server =" 192.168.3.183"是您的服务器的IP。当我最初查看此代码时,我认为我必须包含客户端IP但我记得radtest并不需要这样 - 所以这促使我更改参数。我还从CreateAuthPacket方法/函数中删除了NAS_IP_Address。

您的服务器代码似乎将192.168.3.183列为客户端。因此,您的客户端对象将自己设置为" RADIUS"服务器。我建议设置FreeRADIUS并使用radtest / radclient实用程序(它是FreeRADIUS的一部分)并分别测试每段代码。 Quick Setup Guide

希望这有帮助。