一、服务器程序安装:

1、安装依赖程序:

[root@dba~]# yum install epel-release    #Open×××软件包不在CentOS标准Yum源里,所以需要安装先通过yum安装epel源才能正常安装相关软件包!
[root@dba~]# yum -y install lzo lzo-devel openssl openssl-devel gcc gcc-c++    #部署基础环境安装

2、open***服务器端程序安装:

[root@dba ~]# yum install open*** -y
[root@dba ~]# rpm -qa | grep"open***"
open***-2.4.3-1.el7.x86_64

安装完成涉及目录如下:
[root@dba ~]# whereis open***    #查看Open×××安装成功后的相关路径
open***: /usr/sbin/open*** /usr/lib64/open*** /etc/open*** /usr/share/man/man8/open***.8.gz
/usr/sbin/open***:Open×××二进制程序文件
/etc/open***:Open×××配置文件存储路径
[root@dba ~]# yum -y install easy-rsa    #包含生存Open×××认证所需的证书、密钥等程序文件

二、配置生成open***运行所需证书文件:

Open×××服务器与客户端双方基于PKI(公钥基础设施)验证双方身份并进行认证,所以开始配置时首先要建立认证所需的证书以及密钥。

1、证书、密钥生成流程(推荐):http://www.softown.cn/post/146.html

[root@dba ~]# mkdir -p/etc/open***/easy-rsa/keys
[root@dba~]# cp -rf /usr/share/easy-rsa/2.0/* /etc/open***/easy-rsa/
[root@dba easy-rsa]# ll
total 116
-rwxr-xr-x 1 root root   119 Aug 22 03:08 build-ca  #创建CA证书和密钥,对应文件为ca.crt,ca.key
-rwxr-xr-x 1 root root   352 Aug 22 03:08 build-dh  #创建迪菲·赫尔曼密钥,会生成dh2048.pem文件
-rwxr-xr-x 1 root root   188 Aug 22 03:08 build-inter
-rwxr-xr-x 1 root root   163 Aug 22 03:08 build-key  #用于创建客户端证书及私钥
-rwxr-xr-x 1 root root   157 Aug 22 03:08 build-key-pass    #用于创建经过密码加密的私钥
-rwxr-xr-x 1 root root   249 Aug 22 03:08 build-key-pkcs12
-rwxr-xr-x 1 root root   268 Aug 22 03:08 build-key-server  #用于创建服务器端证书及私钥
-rwxr-xr-x 1 root root   213 Aug 22 03:08 build-req
-rwxr-xr-x 1 root root   158 Aug 22 03:08 build-req-pass
-rwxr-xr-x 1 root root   449 Aug 22 03:08 clean-all  #用于清空服务器端已经生成端证书及密钥,慎用!
-rwxr-xr-x 1 root root  1471 Aug 22 03:08 inherit-inter
drwx------ 2 root root  4096 Aug 22 03:22 keys
-rwxr-xr-x 1 root root   302 Aug 22 03:08 list-crl
-rw-r--r-- 1 root root  7791 Aug 22 03:08 openssl-0.9.6.cnf
-rw-r--r-- 1 root root  8348 Aug 22 03:08 openssl-0.9.8.cnf
-rw-r--r-- 1 root root  8245 Aug 22 03:08 openssl-1.0.0.cnf
-rwxr-xr-x 1 root root 12966 Aug 22 03:08 pkitool
-rwxr-xr-x 1 root root   928 Aug 22 03:08 revoke-full
-rwxr-xr-x 1 root root   178 Aug 22 03:08 sign-req
-rw-r--r-- 1 root root  2057 Aug 22 03:11 vars  #用于存储服务器/客户端生成证书、密钥过程中需要的参数信息
-rwxr-xr-x 1 root root   740 Aug 22 03:08 whichopensslcnf

1.1 修改vars文件,配置生成证书所需的信息(可以安自己需求修改,或保持默认):

[root@dba ~]# vi/etc/open***/easy-rsa/vars 
# These are the default values forfields
# which will be placed in thecertificate.
# Don't leave any of these fieldsblank.
export KEY_COUNTRY="CN"
exportKEY_PROVINCE="BeiJing"
export KEY_CITY="BeiJing"
export KEY_ORG="YunWei"
exportKEY_EMAIL="yunwei@163.com"
exportKEY_OU="YunWeiUnit"

1.2 开始生成ca证书、密钥;服务器端证书、密钥;客户端证书、密钥(注:生成证书之前,请保证服务器端时区、时间等信息正确!);

[root@dba open***]# cd /etc/open***/easy-rsa/
[root@dba easy-rsa]# source vars  #让上面修改端的vars参数文件生效,之后生成证书时就可以调用到了
NOTE: If you run ./clean-all, Iwill be doing a rm -rf on /etc/open***/easy-rsa/keys
[root@dba easy-rsa]# ./clean-all   
[root@dba easy-rsa]# ./build-ca  # 1、生成CA证书及密钥,可以一直回车,默认用的vars中的参数进行配置,但是Common Name请保证每台主机唯一。
Common Name (eg, your name or yourserver's hostname) [YunWei CA]:    ##注意:生成服务器客户端证书时,请保证各证书该名不一致!!!

[root@dba easy-rsa]# ll keys/
-rw-r--r-- 1 root root 1712 Aug 22 03:15 ca.crt    #生成的CA证书
-rw------- 1 root root 1704 Aug 22 03:15 ca.key    #生成的CA密钥

1.3 生成服务器端证书及对应端密钥:

[root@dba easy-rsa]# ./build-key-server server
[root@dba easy-rsa]# ll keys/
-rw-r--r-- 1 root root 5457 Aug 22 03:16 server.crt    #生成的服务器端证书
-rw-r--r-- 1 root root 1074 Aug 22 03:16 server.csr
-rw------- 1 root root 1704 Aug 22 03:16 server.key    #生成的服务器端密钥

1.4 生成客户端用户对应的证书及密钥:

[root@dbaeasy-rsa]# ./build-key client
-rw-r--r-- 1 root root 5339 Aug 22 03:17 client.crt    #生成的客户端证书
-rw-r--r-- 1 root root 1074 Aug 22 03:17 client.csr
-rw------- 1 root root 1708 Aug 22 03:17 client.key    #生成的客户端密钥

1.5 生成迪菲·赫尔曼参数(必须生成):

[root@localhost easy-rsa]# ./build-dh
[root@localhost easy-rsa]# ll keys/dh2048.pem 
-rw-r--r--. 1 root root 424 8月  23 18:13 keys/dh2048.pem

1.6 生成ta.key,用于预防Dos***:

[root@dba easy-rsa]# open***--genkey --secret /etc/open***/easy-rsa/keys/ta.key
-rw------- 1 root root  636 Aug 22 03:22 ta.key

2、服务器/客户端配置文件构建:

示例配置文件路径如下,可以在此基础上做修改:

[root@dba ~]# ll /usr/share/doc/open***-2.4.3/sample/sample-config-files/client.conf /usr/share/doc/open***-2.4.3/sample/sample-config-files/server.conf
-rw-r--r-- 1 root root  3584 Jun 20 08:48 /usr/share/doc/open***-2.4.3/sample/sample-config-files/client.conf
-rw-r--r-- 1 root root 10782 Jun 20 08:48 /usr/share/doc/open***-2.4.3/sample/sample-config-files/server.conf

2.1 服务器端:

复制open***配置文件模版到配置文件目录:
[root@dba ~]# cp /usr/share/doc/open***-2.4.3/sample/sample-config-files/server.conf /etc/open***/
[root@dba ~]# cp /usr/share/doc/open***-2.4.3/sample/sample-config-files/client.conf /etc/open***/client

复制服务器端和客户端对应的证书和密钥文件到各自的目录:
[root@dba ~]# cd /etc/open***/easy-rsa/keys
[root@dba ~]# cp ca.crt server.crt server.key dh2048.pem ta.key ../../server
[root@dba ~]# cp ca.crt client.crt client.key ta.key ../../client

根据具体情况修改配置文件:
[root@dba ~]# vi server.conf 
local 0.0.0.0    #open***服务监听地址,默认为本地
port 1194        #监听端口
proto udp        #使用的协议,默认tcp,proxy模式下必须用tcp
dev tun          #申明使用的设备可选tap和tun,tap是二层设备,支持链路层协议;tun是ip层的点对点协议,限制稍微多一些
ca   /etc/open***/server/ca.crt        #用于验证客户的证书是否合法
cert /etc/open***/server/server.crt    #Server使用的证书文件
key  /etc/open***/server/server.key    #Server使用的Key文件,注意本文件权限配置,防止泄漏
dh   /etc/open***/server/dh2048.pem
server 10.8.0.0 255.255.255.0          #配置×××服务使用的地址池,不能与实际的局域网冲突
ifconfig-pool-persist ipp.txt          #用于记录某个Client获得的IP地址,类似于dhcpd.lease文件,防止open***重新启动后“忘记”Client曾经使用过的IP地址
push "route 10.8.0.0 255.255.255.0"    #配置客户端网络内网段需要访问服务器所在局域网的网络的路由
push "route 192.168.20.0 255.255.255.0"
;push "redirect-gateway def1 bypass-dhcp"    #开启之后,客户端所有流量都走Open×××
push "dhcp-option DNS 180.76.76.76"          #推送给客户端的DNS地址
push "dhcp-option DNS 114.114.114.114"
keepalive 10 120    #连通性检测机制,10s进行ping检测一次,120s不通认证连接丢失,自动重启×××并进行连接
tls-auth /etc/open***/server/ta.key 0 # 用于防止Dos***
cipher AES-256-CBC
comp-lzo    #对数据进行压缩,注意Server和Client一致
max-clients 100    #允许连接Open×××的最大客户端数量
user nobody        #运行Open×××的用户和组
group nobody
persist-key
persist-tun
status      /etc/open***/server/log/open***-status.log
log         /etc/open***/server/log/open***.log
log-append  /etc/open***/server/log/open***.log
verb 3    #相当于debug level,改成verb 5可以多查看一些调试信息

#服务器端启用用户名/密码认证的配置
client-cert-not-required
plugin /lib64/security/open***-auth-pam.so open***_mysql
username-as-common-name
auth-nocache


2.2 客户端:

2.2.1 默认值配置文件(5个文件):

[root@dba client]# more client.conf
client
dev tun
proto udp
remote my-server-1 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt    #单独以一个文件存在
cert client.crt    #单独以一个文件存在,用户名/密码认证时需要注释该行!
key client.key    #单独以一个文件存在,用户名/密码认证时需要注释该行!
remote-cert-tls server
tls-auth ta.key 1    #ta.key用于预防Dos***
cipher AES-256-CBC
verb 3

#客户端启用用户名/密码认证的配置
auth-user-pass

上面默认的客户端配置文件,管理起来很不方便,为便于客户端用户使用可以整合成一个文件来进行配置!

2.2.2 整合后的配置文件(1个文件):

模版(Mac,Windos系统整合后的客户端配置文件的后缀名为o***):

[root@dba client]# more client.o*** 
client
dev tun
proto udp
remote my-server-ip 1194    #my-server-ip替换为open***服务器对应到域名或IP地址。
resolv-retry infinite
nobind
persist-key
persist-tun

<ca>
ca ca.crt        #本行以ca.crt文件内容替换
</ca>

<cert>
cert client.crt    #本行以client.crt文件内容替换
</cert>

<key>
key client.key    #本行以client.key文件内容替换
</key>

<tls-auth>
tls-auth ta.key 1    #本行以ta.key文件内容替换
</tls-auth>
key-direction 1   #需要增加本行,指定上面参数1对应的配置     

remote-cert-tls server
cipher AES-256-CBC
verb 3
comp-lzo

3、使用MySQL-PAM模块进行用户认证:

3.1 安装配置MySQL数据库:

[root@localhost open***]# yum -y install mariadb mariadb-libs mariadb-server mariadb-devel mariadb-test
[root@localhost open***]# rpm -qa | grep -i mariadb
mariadb-5.5.52-1.el7.x86_64
mariadb-libs-5.5.52-1.el7.x86_64
mariadb-server-5.5.52-1.el7.x86_64
mariadb-test-5.5.52-1.el7.x86_64
mariadb-devel-5.5.52-1.el7.x86_64

[root@localhost open***]# mysql_secure_installation    #安装完成之后,执行mysql_secure_installation进行数据库初始化设定root账号密码

[root@localhost open***]# systemctl start mariadb.service    #启动mariadb(CentOS 7.x)数据库
[root@localhost ~]# mysql -u root -p123456
MariaDB [(none)]>create user open*** identified by '123456';
MariaDB [(none)]>create database open***;
MariaDB [(none)]>use open***;
MariaDB [(none)]>create table users (
               -> id int AUTO_INCREMENT NOT NULL,
               -> name char(16) binary NOT NULL,
               -> passwd char(48) binary NOT NULL,
               -> primary key(id)
               -> );
MariaDB [open***]> INSERT INTOuser(name, passwd) VALUES('test', ENCRYPT('123456'));
MariaDB [open***]> grant all on open***.* to 'open***'@'%' identified by '123456';
MariaDB [open***]> flush privileges;

[root@localhost ~]# mysql -u open*** -p123456
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 29
Server version: 5.5.52-MariaDB MariaDB Server

3.2 安装pam_mysql插件:

Google搜索下载tar包:pam_mysql-0.7RC1.tar.g
[root@localhost ~]# tar -zxf pam_mysql-0.7RC1.tar.gz
[root@localhost ~]# cd pam_mysql-0.7RC1
[root@localhost pam_mysql-0.7RC1]# ./configure --with-mysql=/usr --with-openssl=/usr --with-pam-mods-dir=/lib64/security
[root@localhost pam_mysql-0.7RC1]# make && make install

确认/lib64/security目录下是否生成pam_mysql.so文件:
[root@localhost pam_mysql-0.7RC1]# ll /lib64/security/pam_mysql.so 
-rwxr-xr-x. 1 root root 141680 Aug 24 10:25 /lib64/security/pam_mysql.so

3.3 安装pam_mysql插件:

Google搜索下载tar包:open***-2.0.9.tar.gz
[root@localhost auth-pam]# tar -zxvf open***-2.0.9.tar.gz
[root@localhost ~]# cd open***-2.0.9/plugin/auth-pam/
[root@localhost auth-pam]# make
[root@localhost auth-pam]# ll open***-auth-pam.so 
-rwxr-xr-x. 1 root root 22712 Aug 24 12:32 open***-auth-pam.so
[root@localhost auth-pam]# cp open***-auth-pam.so /lib64/security/

3.4 修改配置文件:

在/etc/pam.d下新建pam认证文件:open***_mysql

[root@localhost auth-pam]# cd /etc/pam.d/
[root@localhost pam.d]# more open***_mysql 
auth	sufficient /lib64/security/pam_mysql.so user=open*** passwd=123456 host=localhost db=open*** table=user usercolumn=name passwdcolumn
=passwd sqllog=0 crypt=1 
account	sufficient /lib64/security/pam_mysql.so user=open*** passwd=123456 host=localhost db=open*** table=user usercolumn=name passwdcolumn
=passwd sqllog=0 crypt=1

open***服务器端配置文件,在最后面添加下面四行:

[root@localhost open***]# vi server.conf
client-cert-not-required
plugin /lib64/security/open***-auth-pam.so open***_mysql
username-as-common-name
auth-nocache

open***客户端配置文件,在最后面添加下面四行:

[root@localhost open***]# vi client.o***
cert client.crt    #注释该行或证书文件内容替换的该行!
key  client.key    #注释该行或证书文件内容替换的该行!

#客户端启用用户名/密码认证的配置
auth-user-pass     #添加该行!

3.5 修改open***服务器路由相关配置:

开启路由转发功能
# echo 1 > /proc/sys/net/ipv4/ip_forward
或者
# sed -i '/net.ipv4.ip_forward/s/0/1/' /etc/sysctl.conf
# sysctl -p
配置防火墙,别忘记保存
# iptables -A INPUT -s 10.8.0.0/24 -j ACCEPT   # 开启虚拟网段
# iptables -A INPUT -s 10.8.0.0/24 -m state --state NEW -m tcp -p tcp -j ACCEPT # 
# iptables -A INPUT -m state --state NEW -m udp -p udp --dport 1194 -j ACCEPT # 
# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -d 10.2.8.0/24 -o eho0 -j SNAT --to-source 10.2.8.10 # 将虚拟网段10.8.0.0/24访问内网10.2.8.0/24都通过内网网卡eth0并且将源地址转换成10.2.8.10转发
# service iptables save
# service iptables restart # 重启

3.6 重启open***服务器端程序,客户端重新加载配置文件进行测试。。。Ok啦


4、配置启动服务器,客户端程序并进行测试:

CentOS 6.x启动方式:

[root@dba ~]# /etc/init.d/open*** start(restart,stop)

CentOS 7.x启动方式:

[root@dba ~]# systemctl restart open***@server
[root@dba ~]# ss -lnup
State      Recv-Q Send-Q                   Local Address:Port                                  Peer Address:Port              
Cannot open netlink socket: Protocol not supported
UNCONN     0      0                                    *:1194                                             *:*                   users:(("open***",pid=15933,fd=6))

三、安装配置过程问题解决:

1、问题报错:VERIFY ERROR: depth=1, error=certificate is not yet valid or error 9 at 1 depth lookup:certificate is not yet valid

解决方法:更新服务器系统时间到最新,重新生成服务器和客户端所有证书以及配置文件即可。因为centos7默认安装(没有桌面)的情况下timezone没设置对并且时间没有校对,导致服务器时间还没到证书的签名时间,所以需要从新设置一下timezone并校对时间。