一、安装
centos8
1.更换yum源为aliyun
# centos7 : http://mirrors.aliyun.com/repo/Centos-7.repo
$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
$ wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
$ yum clean all
$ yum makecache
2.关闭 SELinux,开启会限制pam_mysql远程访问数据库,客户端不需要
# 临时修改,不需重启 0 警告模式 1 强制模式
$ setenforce 0
# 永久关闭
$ vim /etc/selinux/config
SELINUX=disabled
3.安装openvpn
$ yum install -y openvpn
# 查看安装状态
$ openvpn --version
OpenVPN 2.4.8 x86_64-redhat-linux-gnu [Fedora EPEL patched] [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Nov 1 2019
library versions: OpenSSL 1.0.2o-fips 27 Mar 2018, LZO 2.08
Originally developed by James Yonan
Copyright (C) 2002-2018 OpenVPN Inc
...
# 需要用到的服务
$ find /usr/lib/systemd/system | grep openvpn
/usr/lib/systemd/system/openvpn-client@.service
/usr/lib/systemd/system/openvpn-server@.service
/usr/lib/systemd/system/openvpn@.service
# 查找认证模块
$ whereis openvpn
openvpn: /usr/sbin/openvpn /usr/lib64/openvpn /etc/openvpn /usr/share/man/man8/openvpn.8.gz
$ cd /usr/lib64/openvpn/plugins/
$ ls
openvpn-plugin-auth-pam.so openvpn-plugin-down-root.so
二、easy-rsa
用来制作ca证书,签发服务端和客户端证书(使用pam_mysql认证之后就不需要用客户端证书了,安全起见还是证书和用户名双重认证),此处使用easy-rsa3
1.下载
# wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
$ yum install -y easy-rsa
$ whereis easy-rsa
easy-rsa: /usr/share/easy-rsa
$ cp -r /usr/share/easy-rsa/3.0.7/ /etc/openvpn/easy-rsa
cp /usr/share/doc/easy-rsa-3.0.7/vars.example /etc/openvpn/easy-rsa/
2.编辑vars文件
此文件为制作证书所用的配置文件
$ cp vars.example vars
修改以下配置,取消#注释
# 国家
#set_var EASYRSA_REQ_COUNTRY "CN"
# 省份
#set_var EASYRSA_REQ_PROVINCE "Zhe Jiang"
# 城市
#set_var EASYRSA_REQ_CITY "Hang Zhou"
# 公司名称
#set_var EASYRSA_REQ_ORG "Copyleft Certificate Co"
# 邮箱
#set_var EASYRSA_REQ_EMAIL "me@example.net"
# 公司部门
#set_var EASYRSA_REQ_OU "My Organizational Unit"
# 默认值,若不是此值,建议修改为此值,增加安全性,修改之后需要重新生成证书
#set_var EASYRSA_KEY_SIZE 2048
# 过期时间,单位为天
#set_var EASYRSA_CA_EXPIRE 3650
4.初始化,生成ca证书
$ ./easyrsa init-pki
# 创建ca证书,nopass 不需要密码
$ ./easyrsa build-ca nopass
三、服务端配置
1.生成服务端证书
$ cd /etc/openvpn/easy-rsa/
$ ./easyrsa build-server-full vpn-server nopass
2.创建 Diffie-Hellman
初始化PKI后,任何实体都可以创建需要它们的DH参数。这通常仅由TLS服务器使用。虽然CA PKI可以生成这个,但在服务器本身上执行它更有意义,以避免在生成后将文件发送到另一个系统
$ ./easyrsa gen-dh
3.把所需文件复制到/etc/openvpn/server下,方便管理,ca.crt文件需妥善保管
$ cp pki/private/vpn-server.key /etc/openvpn/server/
$ cp pki/issued/vpn-server.crt /etc/openvpn/server/
$ cp pki/ca.crt /etc/openvpn/server/
$ cp pki/dh.pem /etc/openvpn/server/
4.tls-auth,增加安全性
$ cd /etc/openvpn/server
# 会生成一个ta.key文件
$ openvpn --genkey --secret ta.key
5.创建服务器文件
$ vim server.conf
配置如下,文件路径最好使用绝对路径:
port 1194
proto udp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/vpn-server.crt
key /etc/openvpn/server/vpn-server.key
dh /etc/openvpn/server/dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /etc/openvpn/server/ipp.txt
# 固定客户端ip,如:/cdd/user1 内容为ifconfig-push 10.9.0.1 10.9.0.2,则固定ip10.9.0.1
client-config-dir /etc/openvpn/server/ccd
# 客户端互相可以访问
;client-to-client
# 可以多个终端登录一个账户
;duplicate-cn
# 心跳,每10s ping一次,ping不到120s之后认定客户端宕机
keepalive 10 120
# tls 加密验证,服务端为0,客户端为1
tls-auth /etc/openvpn/server/ta.key 0
cipher AES-256-CBC
# 压缩
comp-lzo
# 最大连接客户端
max-clients 1000
# 使用nobody用户运行,更安全
user nobody
group nobody
# 禁止openvpn证书自动过期,以便用户保持连接
reneg-sec 0
persist-key
persist-tun
# 状态日志
status openvpn-status.log
# 日志级别 0-9,等级越高日志内容越详细
verb 3
# 当服务器重新启动时,通知客户端,以便它可以自动重新连接。只支持udp协议
explicit-exit-notify 1
# pam认证插件,后面是/etc/pam.d的文件名
# plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn
# 不验证客户端的证书,但是服务端的证书还是需要的
# client-cert-not-required
# 使用客户提供的UserName作为Common Name
# username-as-common-name
6.试运行openvpn
# 配置中开启了client-config-dir,若不创建文件夹,会报错
$ mkdir /etc/openvpn/server/ccd
$ openvpn --config server.conf
...
Thu Apr 16 22:24:45 2020 MULTI: multi_init called, r=256 v=256
Thu Apr 16 22:24:45 2020 IFCONFIG POOL: base=10.235.246.4 size=62, ipv6=0
Thu Apr 16 22:24:45 2020 IFCONFIG POOL LIST
Thu Apr 16 22:24:45 2020 Initialization Sequence Completed
四、配置pam_mysql(使用证书验证,就跳过)
1.安装mysql (centos8)
$ yum install mysql-server
2.安装pam_mysql,请使用0.8.1以上版本,0.7版本有问题
$ rpm -Uvh http://repo.iotti.biz/CentOS/7/x86_64/pam_mysql-0.8.1-0.22.el7.lux.x86_64.rpm
# 安装之后在这里
/usr/lib64/security/pam_mysql.so
# 修改openvpn server配置
$ vim /etc/openvpn/server/server.conf
plugin /usr/lib64/security/pam_mysql.so openvpn
报错处理,缺少mysql-community-libs-compat(依赖于mysql-community-common、mysql-community-libs)导致,请去这里找寻对应版本安装:
error: Failed dependencies:
libmysqlclient.so.18()(64bit) is needed by pam_mysql-1:0.8.1-0.22.el7.lux.x86_64
libmysqlclient.so.18(libmysqlclient_18)(64bit) is needed by pam_mysql-1:0.8.1-0.22.el7.lux.x86_64
3.创建/etc/pam.d/openvpn
以下只列举了一些配置,详细配置请参考官方说明
$ cd /etc/pam.d/
$ vim openvpn
auth required /usr/lib64/security/pam_mysql.so user=your_user passwd=your_password host=your_host db=your_db table=your_table usercolumn=username passwdcolumn=password where=mysql_where crypt=1 sqllog=0
account required /usr/lib64/security/pam_mysql.so user=your_user passwd=your_password host=your_host db=your_db table=your_table usercolumn=username passwdcolumn=password where=mysql_where crypt=1
sqllog=0
# crypt 密码加密方式 :
# 0 明文密码,1 encrypt() 加密 2 password() 加密 3 MD5 4 sha2
# where: mysql的select查询条件
#usercolumn: 用户在表中的字段
#passwdcolumn:密码在表中的字段
#sqllog:把log写入到mysql表中 0 不启用 1 启用
4.测试,安装测试工具,若有则不用安装
$ yum install cyrus-sasl-devel cyrus-sasl-gssapi cyrus-sasl-md5 cyrus-sasl-plain cyrus-sasl-lib cyrus-sasl
# 开启
$ systemctl start saslauthd
# 测试,报错日志在 /var/log/secure,可以调试,要想连接远程数据库,请保证1. 数据库可以访问 2. 关闭selinux
$ testsaslauthd -u user1 -p 1234 -s openvpn
0: OK "Success."
5.优化
基于pam_mysql v0.7新加的config_file属性来指定配置文件
auth required /usr/lib64/security/pam_mysql.so config_file=/etc/openvpn/server/pam_mysql.conf
account required /usr/lib64/security/pam_mysql.so config_file=/etc/openvpn/server/pam_mysql.conf
/etc/openvpn/server/pam_mysql.conf 文件如下
users.host (host)
users.database (db)
users.db_user (user)
users.db_passwd (passwd)
users.table (table)
users.update_table (update_table)
users.user_column (usercolumn)
users.password_column (passwdcolumn)
users.status_column (statcolumn)
users.password_crypt (crypt)
users.use_323_password (use_323_passwd)
users.use_md5 (md5)
users.where_clause (where)
users.disconnect_every_operation (disconnect_every_op) *1
verbose (verbose)
log.enabled (sqllog)
log.table (logtable)
log.message_column (logmsgcolumn)
log.pid_column (logpidcolumn)
log.user_column (logusercolumn)
log.host_column (loghostcolumn)
log.rhost_column (logrhostcolumn) *2
log.time_column (logtimecolumn)
五、客户端配置(证书验证)
1.生成客户端证书
$ cd /etc/openvpn/easy-rsa/
$ ./easyrsa build-client-full vpn-client nopass
2.整理证书文件
$ cp pki/private/vpn-client.key /etc/openvpn/client/
$ cp pki/issued/vpn-client.crt /etc/openvpn/client/
3.创建配置文件
client
dev tun
proto udp
# 服务端ip和端口
remote ip port
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
# 服务端开启,这里也要开启
comp-lzo
# 避免用户在操作的过程中由于证书超时而中断,如果没有设置这个参数,openvpn连接会每个小时自动断开连接
reneg-sec 0
verb 3
# ca证书,文件形式: ca 文件路径
<ca>
...
</ca>
#<cert> 客户端cert , 文件形式:cert 文件路径
...
#</cert>
#<key> 客户端key , 文件形式:key 文件路径
...
#</key>
# tls-auth , 文件形式:tls-auth 文件路径 1
key-direction 1
<tls-auth>
...
</tls-auth>
route-nopull
# 指定客户端访问10.8.0.0网段走vpn(10.8.0.0换成你设置的网段)
route 10.8.0.0 255.255.0.0 vpn_gateway
五、客户端配置(mysql验证)
1.配置文件
client
dev tun
proto udp
# 服务端ip和端口
remote ip port
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
# 服务端开启,这里也要开启
comp-lzo
# 避免用户在操作的过程中由于证书超时而中断,如果没有设置这个参数,openvpn连接会每个小时自动断开连接
reneg-sec 0
verb 3
# ca证书,文件形式: ca 文件路径
<ca>
...
</ca>
#<cert> 客户端cert , 文件形式:cert 文件路径
...
#</cert>
#<key> 客户端key , 文件形式:key 文件路径
...
#</key>
# tls-auth , 文件形式:tls-auth 文件路径 1
key-direction 1
<tls-auth>
...
</tls-auth>
route-nopull
# 指定客户端访问10.8.0.0网段走vpn(10.8.0.0换成你设置的网段)
route 10.8.0.0 255.255.0.0 vpn_gateway
# 提示客户端用账户和密码连接,pass.txt 记录账户和密码,就会自动连接,若不指定文件,则每次连接都会让输入账户和密码
auth-user-pass pass.txt
pass.txt格式如下:
账户
密码
六、使用systemctl管理openvpn
1.关闭防火墙
$ systemctl stop firewalld
或者开放你的服务端openvpn端口,--permanent代表永久有效,不指定重启会失效
$ firewall-cmd --zone=public --add-port=1194/udp --permanent
# 载入配置
$ firewall-cmd --reload
2.查看openvpn服务
$ cd /usr/lib/systemd/system
$ find . | grep openvpn
./openvpn-client@.service
./openvpn-server@.service
./openvpn@.service
# 这里使用openvpn-server@.service,查看服务的运行方式:
$ vim ./openvpn-server@.service
# 可以看出使用的配置文件是 /etc/openvpn/server/%i.conf
WorkingDirectory=/etc/openvpn/server
ExecStart=/usr/sbin/openvpn --status %t/openvpn-server/status-%i.log --status-version 2
--suppress-timestamps --config %i.conf
- 启动服务端,@后面是配置文件的名称,可以自定义,一个配置文件一个进程
$ systemctl start openvpn-server@server
$ systemctl status openvpn-server@server
$ systemctl stop openvpn-server@server
$ systemctl enable openvpn-server@server
3.客户端
和服务端的一样,只不过用的是openvpn-client@server,文件最好都放置在/etc/openvpn/client 里
4.迁移
在新服务器上先安装openvpn,然后把旧服务器上的/etc/openvpn/server/、/etc/openvpn/client/、/etc/openvpn/easy-rsa复制过去即可
七、windows客户端的自动连接
系统:windows server 2008 R2
进入HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun 添加执行程序 "C:Program FilesOpenVPNbinopenvpn-gui.exe" --connect client.ovpn
![624_0.png 624_0.png]()
勾选不管用户是否登录都运行和最高权限运行
![626_0.png 626_0.png]()
触发器添加启动时执行~~~~
![628_0.png 628_0.png]()
添加启动要做什么,可选参数不要忘记了
![630_0.png 630_0.png]()
其他设置,红框的选项可能导致任务停止,请注意取消勾选
![632_0.png 632_0.png]()
八、总结
以上就是自主搭建openvpn+pam_mysql的所走过的路,文中内容可能有不严谨 or 错误的地方,请各位大佬多多指教
查看原文
用来制作ca证书,签发服务端和客户端证书(使用pam_mysql认证之后就不需要用客户端证书了,安全起见还是证书和用户名双重认证),此处使用easy-rsa31.下载