公司想实现无线上网接入使用企业邮箱用户名密码登录,控制网络接入。但是没有比如ACS、ISE这种专门的radius服务器,所以只能自建freeradius与WLC无线控制器对接,使用python扩展模块认证用户名密码,判断是否能接入。
编译安装freeradius
安装相关库
yum install -y wget expat-devel gcc make gmp-devel gmp pkgconfig perl libpcap gcc-c++ logrotate tar cpio gawk flex bison bison-devel lsof libpcap-devel patch openssl openssl-devel libgcrypt* crypt* autoconf automake libtasn1-devel zlib zlib-devel trousers trousers-devel texinfo libnl-devel libnl dbus dbus-devel ncurses-devel readline-devel libtool-ltdl libtalloc* hiredis* redhat-lsb python python-devel gcc gcc-c++ openssl openssl-devel pcre pcre-devel libtalloc-devel hiredis* ykclient libpcap libpcap-devel libnl-devel libnl net-snmp net-snmp-utils
下载源码安装包
http://freeradius.org/releases/
解压编译安装./configure --with-modules=rlm_rest,rlm_sql_mysql,rlm_python --prefix=/usr/local
确保/root/freeradius-server-3.0.17/src/modules/rlm_python/.configure 编译没问题,否则不能使用python模块
make && make install
启用调试模式
radiusd -X
如果报ssl错误:
修改/usr/local/etc/raddb/radiusd.conf文件
找到allow_vulnerable_openssl = no,修改成allow_vulnerable_openssl = yes
启用python模块ln -s /usr/local/etc/raddb/mods-available/python mods-enabled/
在/usr/local/lib 应该有python相关的文件,如果没有,请看rlm_python模块在编译过程中有没有出错,安装一下python-devel
修改/usr/local/etc/raddb/mods-enabled/python
在/usr/local/etc/raddb/mods-config创建python文件夹(如果没有)
在/usr/local/etc/raddb/mods-config/python中创建example.py文件,这对应刚刚的module名称,以及python_path
example.py代码
#!/usr/bin/env python
#-*- encoding: utf-8 -*-
import os
import radiusd
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# 可能需要设置python path,以便加载其它模块,这个要根据实际情况编辑
import poplib
def authorize(argv):
print "*** authorize ***"
radiusd.radlog(radiusd.L_INFO, '*** radlog call in authorize llllll***')
for i in argv:
if 'NAS-IP-Address' in i:
nas_ip = i[1]
if 'User-Name' in i:
user_name = i[1]
if 'User-Password' in i:
user_passwd = i[1]
print '开始认证邮箱地址'
# pop3服务器地址
host = "pop.exmail.qq.com"
# 创建一个pop3对象,这个时候实际上已经连接上服务器了
print '已经连接pop3'
pp = poplib.POP3_SSL(host)
# 设置调试模式,可以看到与服务器的交互信息
# pp.set_debuglevel(1)
check_result = False
try:
# 向服务器发送用户名
pp.user(user_name)
# 向服务器发送密码
pp.pass_(user_passwd)
# 获取服务器上信件信息,返回是一个列表,第一项是一共有多上封邮件,第二项是共有多少字节
print '登录成功'
pp.quit()
check_result = True
except Exception:
print '登录失败'
pp.quit()
check_result = False
if check_result: # 如果通过邮箱校验
reply = (('Reply-Message', ':=', 'Authen OK!'),)
config = (('Cleartext-Password', user_passwd),)
radiusd.radlog(radiusd.L_INFO, '*** python part end ***')
return (radiusd.RLM_MODULE_OK, reply, config)
else:
radiusd.radlog(radiusd.L_INFO, '*** python ########part end ***')
reply = (('Reply-Message', ':=', 'Authen Failed!'),)
config = (('Cleartext-Password', user_passwd),)
radiusd.radlog(radiusd.L_INFO, '*** python part end ***')
return (1, reply, config)
注意
调整代码需要重启radiusd才能生效
开启python认证模块
编辑 /usr/local/etc/raddb/sites-enabled/default
,在authorize中加入python
调试模式启动freeradius server
radiusd -X
模拟客户端进行radius认证
echo "User-Name=xxxx@xxxxxx.com,User-Password=123123123" | radclient 127.0.0.1:1812 auth testing123 -x
testing123
为radius的预共享密钥
在 /usr/local/etc/raddb/clients.conf
可以修改预共享密钥
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏