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 
都可以使用可视化界面来配置。