OpenVPN 是一个基于 OpenSSL 库的应用层 VPN 实现。和传统 VPN 相比,它的优点是简单易用。
OpenVPN允许参与建立VPN的单点使用共享金钥,电子证书,或者用户名/密码来进行身份验证。它大量使用了OpenSSL加密库中的SSLv3/TLSv1 协议函式库。OpenVPN能在Solaris、Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X与Windows 2000/XP/Vista上运行,并包含了许多安全性的功能。它并不是一个基于Web的VPN软件,也不与IPsec及其他VPN软件包兼容。
Server端环境
- Centos7
- OpenVPN 版本:2.4.7
- easy-rsa 版本:3.0.3
yum安装OpenVPN
首先从yum安装OpenVPN及证书生成工具Easy-Rsa:
1 | yum install openvpn easy-rsa |
从示例配置文件复制一份配置文件到/etc/openvpn
1 | cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/server.conf |
使用easy-rsa生成证书及密钥
完成了对于配置文件的修改之后,我们接下来生成keys和certificates。
yum安装完后有关的文件都在/usr/share/easy-rsa/2.0/ 这个目录中。
1 | cd /usr/share/easy-rsa/2.0/ |
- vars脚本, 是用来创建环境变量,设置所需要要的变量的脚本
- clean-all脚本,是创建生成ca证书及密钥文件所需要的文件及目录
- build-ca脚本, 生成ca证书(交互)
- build-dh脚本, 生成Diffie-Hellman文件(交互)
- build-key-server脚本, 生成服务器端密钥(交互)
- build-key脚本, 生成客户端密钥(交互)
- pkitool脚本,直接使用vars的环境变量设置,直接生成证书(非交互)
初始化PKI配置
首先需要修改的是vars文件
1 | vim vars |
将以下这些值修改成你自己的值
1 | export KEY_SIZE=2048 //生成密钥的位数 |
修改完成之后,执行 source ./vars, 清空目录并生成 Certificate Authority(CA):
1 | source ./vars |
创建生成ca证书及密钥文件所需要的文件及目录并创建证书
1 | ./clean-all |
执行完成之后在/usr/share/easy-rsa/2.0/keys目录中产生了CA正式的相关文件。
接下来为服务器生成证书及密钥
1 | ./build-key-server server |
再生成Diffie Hellman key exchange文件,这里生成的长度由之前的KEY_SIZE决定:
1 | ./build-dh |
执行完成会产生dh2048.pem (如果你的KEY_SIZE =1024,这里产生的文件是dh1024.pem)
生成TLS-auth密钥,OpenVPN提供了TLS-auth功能,可以用来抵御Dos、UDP端口淹没攻击。
1 | openvpn --genkey --secret keys/ta.key |
生成证书吊销链文件防止日后有人丢失证书被非法用户接入VPN
1 | ./make-crl vpncrl.pem |
生成客户端证书及密钥
1 | ./build-key client |
生成证书吊销链文件防止日后有人丢失证书被非法用户接入VPN
1 | ./make-crl vpncrl.pem |
将7个所需文件复制到OpenVPN配置目录中去:
1 | mkdir /etc/openvpn/keys/ |
配置OpenVPN
打开 /etc/openvpn/server.conf 编辑:
1 | vim /etc/openvpn/server.conf |
根据需求调整相应的配置项:
1 | ################################################# |
附checkpsw.sh脚本代码
1 |
|
准备用户名和密码认证文件,用户名和密码用空格隔开,同时确保openvpn启动用户可读取该文件
1 | vim psw-file |
调整系统设置并启动OpenVPN Server
防火墙配置
在CentOS 7中,iptables防火墙已经被firewalld所取代,需要使用如下方法:
首先启动firewalld
1 | systemctl status firewalld.service |
查看有哪些服务已经在列表中允许通过:
1 | firewall-cmd --list-services |
可以看到已经有了dhcpv6-client, http, https, ssh四项,接下来添加openvpn:
1 | firewall-cmd --permanent --zone=pupublic --add-service openvpn |
检查一下:
1 | firewall-cmd --list-services |
最后添加masquerade:
1 | firewall-cmd --add-masquerade |
以下命令用于确认masquerade是否添加成功:
1 | firewall-cmd --query-masquerade |
允许IP转发
在sysctl中开启IP转发
1 | vim /etc/sysctl.conf |
启动OpenVPN服务
启动OpenVPN服务器并添加自动启动项
1 | systemctl start openvpn@server.service |
至此服务端搭建完成。
OpenVPN客户端配置
客户端配置文件
取回之前生成的位于/etc/openvpn/keys中的4个文件:
ca.crt client.crt client.key ta.key
在你的客户端创建文件client.ovpn, 将这4个文件与其放在同一目录中,配置client.ovpn内容如下:
1 | ############################################## |
也可将证书集成到客户端配置文件中,易于使用及传输
1 | ca ca.crt 改为:;ca ca.crt |
将client.ovpn文件拷贝到程序目录config下。
右键以管理员身份运行openvpn客户端软件(不以管理员运行可以出现连接后也不能访问的情况)稍后在桌面右下角灰色小图标处右击选择connect即可
Android
直接使用OpenVPN官方的OpenVPN Connect即可,选择import导入配置文件。
Mac OS X
使用第三方的Tunnelblick连接,注意根据你的操作系统版本选择合适的版本。