Несколько вопросов по Пираду

Я пытаюсь использовать библиотеку pyrad 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]))

Если я запускаю сервер и подключаюсь с локального, это работа! скриншот

Но если я подключусь с другого компьютера, он истечет, и pyrad.log покажет это:

Dropping packet: Received packet from unknown host

Я давно ищу в сети. Но бесполезно. Пожалуйста, помогите или попробуйте дать некоторые идеи, как этого добиться.

2 ответа

Чтобы быть действительным запросом RADIUS, сервер RADIUS обычно ожидает не только запросы на использование секрета RADIUS, но и запросы, поступающие с определенного IP-адреса.

Не зная Python / Pyrad Я предполагаю, что по крайней мере один из IP-адресов в следующей части кода вашего сервера должен быть IP-адресом клиента, с которого вы пытаетесь отправить запрос:

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

Проверьте документацию Pyrad, он должен что-то сказать о клиентских IP-адресах.

Я нашел это, когда искал ответ сам. В конце концов я перерыл библиотеку кода и получил ответ от сервера. Для фона я настраиваю это для рю-контроллера. Мой сервер FreeRADIUS, и они находятся на разных виртуальных машинах. Я проводил тестирование с помощью утилиты radclient, поэтому я уже знал, что сервер работает.

На этой линии:

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

убедитесь, что server="192.168.3.183" - это IP-адрес вашего сервера. Когда я сначала посмотрел на этот код, я подумал, что мне нужно включить IP-адрес клиента, но я вспомнил, что Radtest не требует этого - так что это побудило меня изменить параметр. Также я удалил NAS_IP_Address из метода / функции CreateAuthPacket.

Ваш код сервера, кажется, перечисляет 192.168.3.183 в качестве клиента. Таким образом, ваш клиентский объект настраивается как сервер "RADIUS". Я бы порекомендовал настроить FreeRADIUS и использовать утилиту radtest/radclient (она является частью FreeRADIUS) и протестировать каждый фрагмент кода отдельно. Руководство по быстрой установке

Надеюсь это поможет.

Другие вопросы по тегам