我正在尝试使用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
我在网上搜索了很长时间。但没用。请帮助或尝试提供一些如何实现这一点的想法。
答案 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
希望这有帮助。