PPTP-VPN第二章——使用mysql进行用户登录认证

在上一篇文章中记录了pptp vpn的创建过程和简单实用测试,其中用户名和密码均使用文本数据库/etc/ppp/chap-secrets,小规模用户下,尚可使用这种登陆验证方式,如果用户数多了,则需要将用户登录验证方式修改为查询数据库,在本文中将介绍如何将pptp vpn的用户名和密码认证信息存储在mysql数据库中。

前文传送门:http://ylw6006.blog.51cto.com/470441/1794577

一、安装和配置整合mysql-server和freeradius,和前文一样采用rpm方式安装

1、安装软件包

#yum -y install mysql* freeradius*

2、配置数据库

# service mysqld start
# mysql
mysql> use mysql
mysql> delete from user where user=‘‘;
mysql> update user set password=PASSWORD(‘password‘);
mysql> flush privileges;
mysql> create database radius;
mysql> use radius;
mysql> source /etc/raddb/sql/mysql/admin.sql;
mysql> source /etc/raddb/sql/mysql/cui.sql;
mysql> source /etc/raddb/sql/mysql/nas.sql;
mysql> source /etc/raddb/sql/mysql/schema.sql;
mysql> source /etc/raddb/sql/mysql/wimax.sql;
mysql> insert into radcheck (Username,Attribute,op,Value) 
values (‘yang‘,‘password‘,‘==‘,‘yang123!‘)

3、修改配置文件,注意,第一行为行号,对应的行修改成相应的值

# vi /etc/raddb/radiusd.conf
700         $INCLUDE sql.conf  
 
# vi /etc/raddb/sql.conf
28         database = "mysql"
33         driver = "rlm_sql_${database}"
36         server = "localhost"
38         login = "root"
39         password = "password"
42         radius_db = "radius"
50         acct_table1 = "radacct"
51         acct_table2 = "radacct"
100         readclients = yes
 
# vi /etc/raddb/sites-enabled/default
69 authorize {
170 #       files
177         sql
252 authenticate {
297 #       unix
333 preacct {
372 #       files
389 #       unix
406         sql
449 session {
454         sql
461 post-auth {
475         sql
 
# vi /etc/raddb/sites-enabled/inner-tunnel
125 #       files
132         sql
224 #       unix
256         sql
276         sql

4、测试radius和mysql的整合

# radtest yang yang123! 127.0.0.1 10 testing123

出现rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=101, length=20提示,代表radius和mysql整合成功。

这里面tesing123为密码

# grep -v ‘^#‘ /etc/raddb/clients.conf  |grep -v ‘#‘ |grep -v ‘^$‘

二、整合pptp和freeradius

1、查看操作系统所安装ppp版本

# rpm -qa |grep ppp

ppp-2.4.5-10.el6.x86_64

2、下载对应版本的源码包并修改配置文件

下载地址:http://download.chinaunix.net/download.php?id=35207&ResourceID=8334

# tar -zxvpf ppp-2.4.5.tar.gz 
# mkdir /etc/ppp/radius
# cp -R ppp-2.4.5/pppd/plugins/radius/etc/ /etc/ppp/radius/
# cat /etc/ppp/radius/etc/radiusclient.conf
auth_order      radius
login_tries     4
login_timeout   60
nologin /etc/nologin
issue   /etc/ppp//radius/etc/issue
authserver      localhost:1812
acctserver      localhost:1813
servers         /etc/ppp/radius/etc/servers
dictionary      /etc/ppp/radius/etc/dictionary
login_radius    /usr/local/sbin/login.radius
seqfile         /var/run/radius.seq
mapfile         /etc/ppp/radius/etc/port-id-map
default_realm
radius_timeout  10
radius_retries  3
login_local     /bin/login
 
# tail -4 /etc/ppp/radius/etc/dictionary
INCLUDE /etc/ppp/radius/etc/dictionary.microsoft
INCLUDE /etc/ppp/radius/etc/dictionary.ascend 
INCLUDE /etc/ppp/radius/etc/dictionary.merit   
INCLUDE /etc/ppp/radius/etc/dictionary.compat

3、修改options.pptpd配置文件

# tail -2 /etc/ppp/options.pptpd
plugin /usr/lib64/pppd/2.4.5/radius.so 
radius-config-file /etc/ppp/radius/etc/radiusclient.conf

4、修改radius认证密钥

# grep -v ‘^#‘ /etc/ppp/radius/etc/servers
localhost                                      tesing123

三、客户端拨号测试与debug

客户端拨号报错:rc_check_reply: received invalid reply digest from RADIUS server

把radiusd服务运行在调试模式下观察日志输出,并未发现任何报错信息

#service radiusd stop
#radiusd -X
rad_recv: Access-Request packet from host 127.0.0.1 port 43268, id=213, length=148
        Service-Type = Framed-User
        Framed-Protocol = PPP
        User-Name = "yang"
        MS-CHAP-Challenge = 0x939a7b4308644d99c2f5f9b777207c42
        MS-CHAP2-Response = 0xbc00666bc61ad32272c3ea4db4937b4bd9b4000000000000000000f4da56184820a839a25c1ba0fc5a9f239bf6be4fed9da2
        Calling-Station-Id = "27.151.123.121"
        NAS-IP-Address = 127.0.0.1
        NAS-Port = 0
# Executing section authorize from file /etc/raddb/sites-enabled/default
+group authorize {
++[preprocess] = ok
++[chap] = noop
[mschap] Found MS-CHAP attributes.  Setting ‘Auth-Type  = mschap‘
++[mschap] = ok
++[digest] = noop
[suffix] No ‘@‘ in User-Name = "yang", looking up realm NULL
[suffix] No such realm "NULL"
++[suffix] = noop
[eap] No EAP-Message, not doing EAP
++[eap] = noop
[sql]   expand: %{User-Name} -> yang
[sql] sql_set_user escaped user --> ‘yang‘
rlm_sql (sql): Reserving sql socket id: 30
[sql]   expand: SELECT id, username, attribute, value, op           FROM radcheck           WHERE username = ‘%{SQL-User-Name}‘           ORDER BY id -> SELECT id, username, attribute, value, op           FROM radcheck           WHERE username = ‘yang‘           ORDER BY id
WARNING: Found User-Password == "...".
WARNING: Are you sure you don‘t mean Cleartext-Password?
WARNING: See "man rlm_pap" for more information.
[sql] User found in radcheck table
[sql]   expand: SELECT id, username, attribute, value, op           FROM radreply           WHERE username = ‘%{SQL-User-Name}‘           ORDER BY id -> SELECT id, username, attribute, value, op           FROM radreply           WHERE username = ‘yang‘           ORDER BY id
[sql]   expand: SELECT groupname           FROM radusergroup           WHERE username = ‘%{SQL-User-Name}‘           ORDER BY priority -> SELECT groupname           FROM radusergroup           WHERE username = ‘yang‘           ORDER BY priority
rlm_sql (sql): Released sql socket id: 30
++[sql] = ok
++[expiration] = noop
++[logintime] = noop
[pap] WARNING: Auth-Type already set.  Not setting to PAP
++[pap] = noop
+} # group authorize = ok
Found Auth-Type = MSCHAP
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!    Replacing User-Password in config items with Cleartext-Password.     !!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!! Please update your configuration so that the "known good"               !!!
!!! clear text password is in Cleartext-Password, and not in User-Password. !!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# Executing group from file /etc/raddb/sites-enabled/default
+group MS-CHAP {
[mschap] Creating challenge hash with username: yang
[mschap] Client is using MS-CHAPv2 for yang, we need NT-Password
[mschap] adding MS-CHAPv2 MPPE keys
++[mschap] = ok
+} # group MS-CHAP = ok
# Executing section post-auth from file /etc/raddb/sites-enabled/default
+group post-auth {
[sql]   expand: %{User-Name} -> yang
[sql] sql_set_user escaped user --> ‘yang‘
[sql]   expand: %{User-Password} -> 
[sql]   ... expanding second conditional
[sql]   expand: %{Chap-Password} -> 
[sql]   expand: INSERT INTO radpostauth                           (username, pass, reply, authdate)                           VALUES (                           ‘%{User-Name}‘,                           ‘%{%{User-Password}:-%{Chap-Password}}‘,                           ‘%{reply:Packet-Type}‘, ‘%S‘) -> INSERT INTO radpostauth                           (username, pass, reply, authdate)                           VALUES (                           ‘yang‘,                           ‘‘,                           ‘Access-Accept‘, ‘2016-06-29 17:05:21‘)
rlm_sql (sql) in sql_postauth: query is INSERT INTO radpostauth                           (username, pass, reply, authdate)                           VALUES (                           ‘yang‘,                           ‘‘,                           ‘Access-Accept‘, ‘2016-06-29 17:05:21‘)
rlm_sql (sql): Reserving sql socket id: 29
rlm_sql (sql): Released sql socket id: 29
++[sql] = ok
++[exec] = noop
+} # group post-auth = ok
Sending Access-Accept of id 213 to 127.0.0.1 port 43268
        Password == "yang123!"
        MS-CHAP2-Success = 0xbc533d42383941354543303444354634354438323638414534323146323944344144443935424246433130
        MS-MPPE-Recv-Key = 0xf60049baea9bf3462b5b90d8311848fd
        MS-MPPE-Send-Key = 0x59e4dc74e5310b0fdb7ef0bf10ff10f4
        MS-MPPE-Encryption-Policy = 0x00000001
        MS-MPPE-Encryption-Types = 0x00000006
Finished request 0.
Going to the next request
Waking up in 4.9 seconds.
Cleaning up request 0 ID 213 with timestamp +11
Ready to process requests.

通过google搜索发现一个重要信息,参考文档:

https://community.ubnt.com/t5/EdgeMAX/PPTP-L2TP-Radius-Problem/td-p/630855

修改secert为test之后重启radiusd和pptpd服务,重新拨号测试。发现一切正常!

数据库中记录的客户端拨号信息

至此,PPTP VPN用户登陆采用mysql数据库和freeradiusd服务认证配置完成,对拨号用户的流量控制和同一时刻只允许一个终端登录将在下文中介绍,尽情期待!

时间: 2024-10-12 11:51:45

PPTP-VPN第二章——使用mysql进行用户登录认证的相关文章

OpenVPN 实战3:OpenVPN+MySQL 实现用户登录认证

大纲 一.前言 二.概述 三.具体配置过程 四.总结 注,实战环境 CentOS 5.5 x86_64,软件版本 OpenVPN 2.1,软件下载:http://yunpan.cn/QzT8fGsX8S75a  访问密码 e8e4. 一.前言 在上一篇博客中我们提出一个问题,下面我们来回顾一下: 前面做的实验都是由服务端先生成客户端证书,然后分发到客户端上,让客户端通过证书连接到服务器上.但有时候,这样的分发是比较麻烦的(也不安全).这样,我们可以考虑另外一种方式: 只在服务端制作客户端证书,而

第二章:MySQL介绍与安装

第二章:MySQL介绍与安装 为什么选择MySQL mysql性能卓越,服务稳定,很少出现异常宕机 mysql开源免费,无版权制约,自主性及使用成本低 产品耦合度,mysql支持多种操作系统,支持多开发语言,特别是php 技术积累,庞大的活跃的社区, 软件体积小,安装简单,易于维护 MySQL数据库分类与版本升级 MySQL官网http://www.mysql.com/,MySQL版本采用双授权政策,和大多数开源产品路线一样,分为社区版和商业版,并且这两个版本又分别分成四个版本依次发布,Alph

.NET Core IdentityServer4实战 第二章-OpenID Connect添加用户认证

原文:.NET Core IdentityServer4实战 第二章-OpenID Connect添加用户认证 内容:本文带大家使用IdentityServer4进行使用OpenID Connect添加用户认证 作者:zara(张子浩) 欢迎分享,但需在文章鲜明处留下原文地址. 在这一篇文章中我们希望使用OpenID Connect这种方式来验证我们的MVC程序(需要有IdentityServer4),我们首先需要干什么呢?那就是搞一个UI,这样非常美观既可以看到我们的身份验证效果,那么Iden

radhat Linux 用户登录认证失败

今天客户反映一个问题,ssh不上自己的服务器了,进机房radhat linux本地登录(3级别)的时候发现输入root敲回车的时候出现如下提示: Your account is locked.Maximum amount of failed attempts was reached. 好说,单用户模式下 pam_tally2 -u root  (faillog -u root<查看/var/log/faillog内记录的登陆失败信息>)显示root用户登录失败记录的次数 pam_tally2

基于jwt的用户登录认证

最近在app的开发过程中,做了一个基于token的用户登录认证,使用vue+node+mongoDB进行的开发,前来总结一下. token认证流程: 1:用户输入用户名和密码,进行登录操作,发送登录信息到服务器端. 2:服务器端查询数据库验证用户名密码是否正确,正确,通过jsonwebtoken生成token,返回给客户端:否则返回错误信息给客户端. 3:通过本地存储存储获取的token信息,并且会跳转到路由指定的页面. 4:当客户端需要请求数据时,发送请求,并且在请求的头文件中添加本地存储的t

Java秒杀系统实战系列~整合Shiro实现用户登录认证

摘要: 本篇博文是"Java秒杀系统实战系列文章"的第五篇,在本篇博文中,我们将整合权限认证-授权框架Shiro,实现用户的登陆认证功能,主要用于:要求用户在抢购商品或者秒杀商品时,限制用户进行登陆!并对于特定的url(比如抢购请求对应的url)进行过滤(即当用户访问指定的url时,需要要求用户进行登陆). 内容: 对于Shiro,相信各位小伙伴应该听说过,甚至应该也使用过!简单而言,它是一个很好用的用户身份认证.权限授权框架,可以实现用户登录认证,权限.资源授权.会话管理等功能,在本

JavaWeb-SpringBoot_使用MySQL管理用户登录注册+接入腾讯短信SDK

使用Gradle编译项目 传送门 项目已托管到Github上 传送门 JavaWeb-SpringBoot_一个类实现腾讯云SDK发送短信 传送门 用户注册 用户并非一定要输入正确的手机验证码去激活当前信息,用户提交注册表单后不会去数据库进行重复校验,只有当用户正确输入手机验证码,则该用户state状态在数据库中设置为1,而用户错误错误手机验证码或未输入手机验证码后,则该用户state状态在数据库中设置为0[手机验证码为随机四位整数] 用户登录 用户点击登录按钮时,用户名账号密码输入错误则用户无

linux PAM 用户登录认证

PAM(Pluggable Authentication Modules )是由Sun提出的一种认证机制.它通过提供一些动态链接库和一套统一的API,将系统提供的服务 和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系 统中添加新的认证手段.从本篇开始会总结一些常用的pam模块及其实现的功能,今天讲的是pam_tally2模块. 一.参数与场景 应用场景:设置Linux用户连续N次输入错误密码进行登陆时,自动锁定X分钟或永久锁

关于django用户登录认证中的cookie和session

最近弄django的时候在用户登录这一块遇到了困难,网上的资料也都不完整或者存在缺陷. 写这篇文章的主要目的是对一些刚学django的新手朋友提供一些帮助.前提是你对django中的session和cookie已经有了一定的了解. 我最基本的设想是当用户登陆了网站后,用户访问本网站的其他网页时依旧能识别其身份. 很多教程的方法是在用户的cookie中存储用户名,这种方法当然是非常不安全的. 其实只要我们使用了django中的session,django就会自动在用户的cookie中存储 sess