文档章节

OpenVPN mysql授权

 玖零後大叔
发布于 2017/05/08 16:03
字数 1102
阅读 111
收藏 0

OpenVPN通过mysql授权

1.安装OpenVPN

2.安装数据库

1)创建数据库,用户授权,openvpn用户表,openvpn日志表

mysql> create database openvpn;
mysql> grant all on openvpn.* to 'openvpn'@'localhost' identified by 'VPN@58pic';

CREATE TABLE IF NOT EXISTS `user` (
  `username` char(32) COLLATE utf8_unicode_ci NOT NULL,
  `password` char(128) COLLATE utf8_unicode_ci DEFAULT NULL,
  `active` int(10) NOT NULL DEFAULT '1',
  `creation` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `name` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `email` char(128) COLLATE utf8_unicode_ci DEFAULT NULL,
  `note` text COLLATE utf8_unicode_ci,
  `quota_cycle` int(10) NOT NULL DEFAULT '30',
  `quota_bytes` bigint(20) NOT NULL DEFAULT '10737418240',
  `enabled` int(10) NOT NULL DEFAULT '1',
  PRIMARY KEY (`username`),
  KEY `idx_active` (`active`),
  KEY `idx_enabled` (`enabled`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


CREATE TABLE IF NOT EXISTS `log` (
  `username` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `end_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `trusted_ip` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,
  `trusted_port` int(10) DEFAULT NULL,
  `protocol` varchar(16) COLLATE utf8_unicode_ci DEFAULT NULL,
  `remote_ip` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,
  `remote_netmask` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,
  `bytes_received` bigint(20) DEFAULT '0',
  `bytes_sent` bigint(20) DEFAULT '0',
  `status` int(10) NOT NULL DEFAULT '1',
  KEY `idx_username` (`username`),
  KEY `idx_start_time` (`start_time`),
  KEY `idx_end_time` (`end_time`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

2)安装pam_mysql模块

tar -zxf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1
./configure --with-openssl --with-mysql=/usr/local/data/mysql/

报错

configure: error: Cannot locate mysql client library. Please check your mysql installation.

解决

yum -y install mysql-devel

生成的pam_mysql.so在

ls /lib/security/
pam_mysql.so

报错:

configure: error: Cannot find pam headers. Please check if your system is ready for pam module development.

解决

yum install pam-devel

3)配置openvpn的pam

[root@test pam.d]# pwd
/etc/pam.d
[root@58pic_test pam.d]# cat openvpn
# The PAM configuration file for the openvpn daemon
#
#
auth            sufficient      /lib/security/pam_mysql.so user=openvpn passwd=VPN@58pic host=localhost db=openvpn table=user usercolumn=username passwdcolumn=password where=active=1 sqllog=0 crypt=1
account         required        /lib/security/pam_mysql.so user=openvpn passwd=VPN@58pic host=localhost db=openvpn table=user usercolumn=username passwdcolumn=password where=active=1 sqllog=0 crypt=1
其中数据库、用户名、密码按照自己的实际情况设置。
crypt表示密码在数据库中加密存储的方式,含义如下:

0 (or “plain”):不加密,明文存储。不推荐使用。
1 (or “Y”):使用crypt(3)函数,相当于MySQL中的ENCRYPT()函数。
2 (or “mysql”):使用MySQL的PASSWORD()函数。PAM可能与MySQL的函数不同,不推荐使用。
3 (or “md5″):使用MD5。
4 (or “sha1″):使用SHA1。
/etc/init.d/saslauthd restart

测试saslauthd是否配置成功

testsaslauthd -u hckj164_58pic -p Hanchuang1! -s openvpn
0: NO "authentication failed"

如果认证不成功:则查看日志文件/var/log/auth.log或/var/log/secure进行错误排除。 如果没有auth.log文件,则

vim /etc/rsyslog.conf     #添加
authpriv.*                                              /var/log/secure

auth.*                                                  /var/log/auth.log

遇到一个问题是

Apr 25 17:29:10 ooopic_test saslauthd[10708]: PAM unable to dlopen(/lib/security/pam_mysql.so): libmysqlclient.so.18: cannot open shared object file: No such file or directory

mysql相关的库文件没有放在默认路径下

配置openvpn pam认证模块

[root@test soft]# tar -zxf openvpn-2.0.9.tar.gz
[root@test soft]# cd openvpn-2.0.9
[root@test openvpn-2.0.9]# cd plugin/auth-pam/
[root@test auth-pam]# ls
auth-pam.c  Makefile  pamdl.c  pamdl.h  README
[root@test auth-pam]# make
gcc -O2 -Wall -DDLOPEN_PAM=1 -fPIC -c -I../.. auth-pam.c
gcc -O2 -Wall -DDLOPEN_PAM=1 -fPIC -c -I../.. pamdl.c
gcc -O2 -Wall -DDLOPEN_PAM=1 -fPIC -shared -Wl,-soname,openvpn-auth-pam.so -o openvpn-auth-pam.so auth-pam.o pamdl.o -lc -ldl
[root@test auth-pam]# ls
auth-pam.c  auth-pam.o  Makefile  openvpn-auth-pam.so  pamdl.c  pamdl.h  pamdl.o  README
[root@test auth-pam]# cp openvpn-auth-pam.so /usr/local/data/openvpn/

修改配置文件server_udp.conf

# user/pass auth from mysql
plugin ./openvpn-auth-pam.so openvpn
client-cert-not-required
username-as-common-name
vim connect.sh
#!/bin/bash

DB='openvpn'
DBADMIN='openvpn'
DBPASSWD='openvpn'

mysql -S /tmp/mysql.sock -u$DBADMIN -p$DBPASSWD -e "INSERT INTO log(username,start_time,trusted_ip,trusted_port,protocol,remote_ip,remote_netmask,status) VALUES('$common_name',now(),'$trusted_ip',$trusted_port,'$proto_1','$ifconfig_pool_remote_ip','$route_netmask_1',1)" $DB
vim disconnect.sh

#!/bin/bash

DB='openvpn'
DBADMIN='openvpn'
DBPASSWD='openvpn'

mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE log SET end_time=now(),bytes_received=$bytes_received,bytes_sent=$bytes_sent,status=0 WHERE trusted_ip='$trusted_ip' AND trusted_port=$trusted_port AND remote_ip='$ifconfig_pool_remote_ip' AND username='$common_name' AND status=1" $DB

mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE user SET active=0 WHERE user.username IN (SELECT username FROM (SELECT log.username AS username, quota_bytes FROM user, log WHERE log.username='$common_name' AND log.username=user.username AND log.status=0 AND TO_DAYS(NOW())-TO_DAYS(start_time)< =quota_cycle GROUP BY log.username HAVING SUM(bytes_received)+SUM(bytes_sent)>=quota_bytes) AS u);" $DB
chmod ugo+x *.sh

testsaslauthd -u hckj164_58pic -p Hanchuang1! -s openvpn

客户端配置

client
dev tun
proto udp
remote 121.42.233.38 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
auth-user-pass
comp-lzo
verb 3
vim server_udp.conf
local 121.42.233.38
port 1194
proto udp
dev tun
ca /usr/local/data/openvpn/easy-rsa/2.0/keys/ca.crt
cert /usr/local/data/openvpn/easy-rsa/2.0/keys/server.crt
key /usr/local/data/openvpn/easy-rsa/2.0/keys/server.key
dh /usr/local/data/openvpn/easy-rsa/2.0/keys/dh1024.pem
server 192.168.210.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 10.0.0.0  255.0.0.0"
push "route 100.0.0.0  255.0.0.0"
push "dhcp-option DNS 10.202.72.116"
push "dhcp-option DNS 10.202.72.118"
client-to-client
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
verb 3
status /usr/local/data/openvpn/logs/openvpn-status.log
log-append /usr/local/data/openvpn/logs/openvpn.log
;mute 20
;crl-verify /etc/openvpn/easy-rsa/2.0/keys/crl.pem
client-config-dir /etc/openvpn/ccd/
;route "192.168.6.0 255.255.255.0"
;push "route 192.168.6.0  255.255.255.0"
#user/pass auth from mysql
plugin ./openvpn-auth-pam.so openvpn
client-cert-not-required
username-as-common-name
#
script-security 2
client-connect ./connect.sh
client-disconnect ./disconnect.sh

参考:

http://www.cnblogs.com/dongc/p/5369765.html

http://blog.csdn.net/zhangguoliang521/article/details/50483608

添加用户

INSERT INTO user(username,password,name) VALUES('goforit', ENCRYPT('2017'),'gfi');

保存用户名密码 auth-user-pass pass.txt 建立文件 vim pass.txt 用户名 密码

© 著作权归作者所有

上一篇: php swoole扩展
下一篇: CentOS6.5安装vsftpd
粉丝 1
博文 128
码字总数 31973
作品 0
浦东
运维
私信 提问
centos6安装openvpn2.3.6教程

wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm rpm -Uvh epel-release-6-8.noarch.rpm yum install openvpn wget https://github.com/OpenVPN/easy-rsa/ar......

果树啊
2015/03/02
1K
0
Linux自学笔记——模拟搭建openvpn

VPN直译就是虚拟专用通道,是提供给企业之间或者个人与公司之间安全数据传输的隧道,openvpn无疑是linux开源vpn的先锋,提供了良好的性能和友好的用户GUI。 OpenVPN是一个基于OpenSSL库的应用...

claude_liu
2018/04/26
0
0
[原创]OpenVPN使用User/Pass验证登录 (消费者权益日献大礼)

OpenVPN使用User/Pass验证登录 在之前的OpenVPN+CA中已经介绍了使用CA验证登录的方式,详见: http://bbs.chinaunix.net/forum/viewtopic.php?t=503434&show_type=new 本文主要介绍使用Usern...

范堡
2009/05/05
1K
0
III(二十一)OpenVPN(2)

案例1: 多个机房利用OpenVPN互联架构方案: 注: vpn client角色相当于宿主机win的拨号端; vpn server和vpn client均执行(1、firewall(避免影响port服务和转发);2、关闭selinux;3、开...

技术小阿哥
2017/11/27
0
0
CentOS6.4下部署OpenVpn服务及使用方法

环境说明: vpn服务器:eth0:120.3.243.54(外网IP) eth1:192.168.5.253(私网IP) 客户端地址:201.1.36.111 软件版本:服务端OpenVPN 2.3.2 实现:访问公司内网及授权vpn地址访问的网段,...

Geekwolf
2013/12/26
5.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

spring源码分析6: ApplicationContext的初始化与BeanDefinition的搜集入库

先前几篇都是概念的讲解:回顾下 BeanDefinition 是物料 Bean是成品 BeanFactory是仓库,存储物料与成品 ApplicationContext初始化搜集物料入库,触发生产线,取出物料生产Bean 本文研究spr...

星星之焱
27分钟前
5
0
彻底解决tomcat乱码问题

本地项目请求访问,浏览器中文输出没问题。 部署到服务器上面之后,返回到浏览器的中文就乱码了。 尝试办法: 1.修改tomcat下的conf中的service.xml中的配置信息: 重新启动后,没有效果还是...

诗书易经
43分钟前
5
0
Java开发需要掌握的IDEA插件大全

1、Lombok 解释:这是最基本的插件,2017年就火了,还没用的百度一下吧。 博客链接:Intellij IDEA 安装lombok及使用详解 2、PlantUML integration 解释:各种类之间的关联图,高级开发必备。...

木九天
43分钟前
6
0
python学习10.05:Python range()快速初始化数字列表

实际场景中,经常需要存储一组数字。例如在游戏中,需要跟踪每个角色的位置,还可能需要跟踪玩家的几个最高得分。在数据可视化中,处理的几乎都是由数字(如温度、距离、人口数量、经度和纬度...

太空堡垒185
51分钟前
4
0
java单元测试,PowerMockito模拟方法内new对象

在做单元测试中有时候需要对方法内new出来的对象进行隔离,这是我们需要使用PowerMockito。 添加依赖 <dependency> <groupId>org.powermock</groupId> <artifactId>......

如梦之猿
52分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部