OpenVPN 使用“用户名/密码”登录验证
peili0 2012-01-16
使用这种方法在客户端需要"ca.crt、ta.key"和配置文件。
服务端需要"dh1024.pem、openvpn-auth-pam.so、ca.crt"服务端的证书和私钥以及配置文件。
服务端也并不需要ca.key,生成证书时需要。
openvpn-auth-pam.so由OpenVPN的plugin/auth-pam/目录下的文件生成。
ta.key使用OpenVPN生成:openvpn --genkey --secret keys/ta.key。是为了防止恶意攻击(如DoS、UDP port flooding),生成的一个"HMAC firewall"。
别的文件都是由easy-rsa目录下的脚本生成的(都是使用openssl生成的)。
dh1024.pem:Diffie-Hellman文件,SSL/TLS server需要使用的一个文件。脚本:build-dh。
证书的有效期我的试验是最长30年。
./build-key-server 设100年出来的是1970年,设50年出来的是"Bad time value"设40年,出来的是13年,设20年,正确;30年正确;35年13年
Server端配置
首先检查pam-devel包是否安装,否则从系统盘安装改软件包
[root@vpn ~]# rpm -qa | grep pam
pam_smb-1.1.7-3.1
pam-0.77-40
pam_krb5-2.0.10-1
pam-devel-0.77-40
[root@vpn ~]#
检查Mysql是否安装,确认mysql-devel包已经安装,否则从系统盘安装改软件包
[root@vpn ~]# rpm -qa | grep mysql
mysql-3.23.58-9
mysql-server-3.23.58-9
mysql-devel-3.23.58-9
[root@vpn ~]#
安装
在"添加或删除软件包"中选上"SQL数据库服务器"的全部内容,安装,用rpm -qa | grep mysql查询,无mysql-devel包。
mysql-devel包在RedHat 9.0第二张光盘上,RedHat/RPMS/mysql-devel-3.23.54a-11.i386.rpm。
为了能使用OpenVPN的PAM验证插件,我们安装pam_mysql使用MySQL数据库存储用户数据,其它数据库可以找相应的PAM验证模块
[root@vpn ~]# wget
[root@vpn ~]# tar -zxvf pam_mysql-0.5.tar.gz
[root@vpn ~]# cd pam_mysql
[root@vpn ~]# ./configure
[root@vpn ~]# make
[root@vpn ~]# cp pam_mysql.so /lib/security/
我下载的是pam_mysql-0.7RC1.tar.gz。
make时md5.h报错。
解决方法是
./configure --with-openssl
pam_mysql.so在.libs目录下,.libs为隐藏目录。
配置数据库
以管理员身份登录数据库:
mysql> create database vpn;
创建数据库vpn。
mysql> GRANT ALL ON vpn.* TO vpn@localhost IDENTIFIED BY 'vpn123';
授权localhost上的用户vpn(密码vpn123)有对数据库vpn的所有操作权限。
mysql> flush privileges;
更新sql数据库的权限设置。
mysql> use vpn;
使用刚创建的的vpn数据库。
mysql> CREATE TABLE vpnuser (
-> name char(20) NOT NULL,
-> password char(128) default NULL,
-> active int(10) NOT NULL DEFAULT 1,
-> PRIMARY KEY (name)
-> );
mysql> insert into vpnuser (name,password) values('elm',password('elm'));
命令解释:
#创建vpn用户,对vpn这个database有所有操作权限,密码为vpn123
#active不为1,无权使用VPN
#增加用户 用户名:elm 密码:elm
输入mysql报:
ERROR 2002: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
/etc/rc.d/init.d/mysqld status会告诉mysql的运行状态,如果没有运行,执行下列命令:
/ect/rc.d/init.d/mysqld start
测试: mysql
如果成功,屏幕显示
>mysql
上面两条命令也可以是:
service mysqld status
service mysqld start
/etc/init.d/是指向/etc/rc.d/init.d的符号链接。
这一目录下的文件是脚本文件。
也可以使用"系统设置/服务器设置/服务"来设置。
自动启动mysqld,运行chkconfig把MySQL添加到系统的启动服务组里面去。
# /sbin/chkconfig --del mysqld
# /sbin/chkconfig --add mysqld
都可以使用可视化界面来配置。