openvpn通过使用公开密钥(非对称密钥,加密解密使用不同的key,一个称为Publice key,另外一个是Private key)对数据进行加密的。这种方式称为TLS加密
openvpn使用TLS加密的工作过程是,首先VPN Sevrver端和VPN Client端要有相同的CA证书,双方通过交换证书验证双方的合法性,用于决定是否建立VPN连接。
然后使用对方的CA证书,把自己目前使用的数据加密方法加密后发送给对方,由于使用的是对方CA证书加密,所以只有对方CA证书对应的Private key才能解密该数据,这样就保证了此密钥的安全性,并且此密钥是定期改变的,对于窃听者来说,可能还没有获取到此密钥,VPN通信双方可能就已经更换密钥了。
一、环境准备和安装
vim /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
baseurl=http://archives.fedoraproject.org/pub/archive/epel/6/$basearch
enabled=1
gpgcheck=0
sed -i '41 s/^/* soft nofile 65535\n* hard nofile 65535\n* soft nproc 65535\n* hard nproc 65535/g' /etc/security/limits.conf
ulimit -n 65535
sed -i '/^SELINUX=enforcing/c#SELINUX=enforcing' /etc/selinux/config
sed -i '12 s/^/SELINUX=disabled/g' /etc/selinux/config
sed -i '/^SELINUXTYPE=targeted/c#SELINUXTYPE=targeted' /etc/selinux/config
setenforce 0
service iptables stop
chkconfig iptables off
yum -y install openvpn easy-rsa ntpdate
ntpdate -u cn.pool.ntp.org
echo "*/20 * * * * /usr/sbin/ntpdate -u cn.pool.ntp.org >/dev/null &" >> /var/spool/cron/root
二、服务端证书制作
mkdir /etc/openvpn/easy-rsa/ -p
cp -r /usr/share/easy-rsa/3.0.8/* /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsa
cp /usr/share/doc/easy-rsa-3.0.8/vars.example ./vars
vim vars
set_var EASYRSA_REQ_COUNTRY "CN" #国家
set_var EASYRSA_REQ_PROVINCE "Shanghai" #省
set_var EASYRSA_REQ_CITY "Shanghai" #城市
set_var EASYRSA_REQ_ORG "Tech Support " #组织
set_var EASYRSA_REQ_EMAIL "test@example.net" #邮箱
set_var EASYRSA_REQ_OU "Bank" #公司、组织
./easyrsa init-pki #初始化pki,生成目录文件结构
./easyrsa build-ca #创建ca证书,中间有输入password,这里设置123456
./easyrsa gen-req server nopass #nopass设置免证书认证,如果要设置password可以取消此参数选项
./easyrsa sign server server #第二个server是只上面服务端证书的CN名
./easyrsa gen-dh
cd /etc/openvpn
openvpn --genkey --secret ta.key
三、客户端证书制作
mkdir -p /etc/openvpn/client
cp -r /usr/share/easy-rsa/3.0.8/* /etc/openvpn/client/
cd /etc/openvpn/client
cp /usr/share/doc/easy-rsa-3.0.8/vars.example ./vars
./easyrsa init-pki
./easyrsa gen-req client nopass #client是证书名,可自定义,nopass同样设置免密
######################对客户端证书签名#############################
cd /etc/openvpn/easy-rsa
./easyrsa import-req /etc/openvpn/client/pki/reqs/client.req client
./easyrsa sign client client #签名,第一个client表示客户端,第二个client指上面导入的客户端证书名
四、修改配置文件
cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/
cp /etc/openvpn/easy-rsa/pki/private/server.key /etc/openvpn/
cp /etc/openvpn/easy-rsa/pki/issued/server.crt /etc/openvpn/
cp /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/
cp /usr/share/doc/openvpn-2.4.9/sample/sample-config-files/server.conf /etc/openvpn/
vim /etc/openvpn/server.conf
local 0.0.0.0
port 1194 #指定端口
proto tcp #指定协议
dev tun #采用路由隧道模式
ca ca.crt #ca证书位置,相对路径,表示ca.crt和server.conf要在同一目录
cert server.crt #服务端证书
key server.key #服务端key
dh dh.pem #dh密钥
server 10.8.0.0 255.255.255.0 #给客户端分配的地址池
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp" #客户端网关使用openvpn服务器网关
push "dhcp-option DNS 8.8.8.8" #指定dns
push "dhcp-option DNS 114.114.114.114"
keepalive 10 120 #心跳检测,10秒检测一次,2分钟内没有回应则视为断线
tls-auth ta.key 0 #服务端值为0,客户端为1
cipher AES-256-CBC
comp-lzo #传输数据压缩
persist-key
persist-tun
status openvpn-status.log
verb 3
cp /usr/share/doc/openvpn-2.4.9/sample/sample-config-files/client.conf /etc/openvpn/client.ovpn
vim /etc/openvpn/client.ovpn
client
dev tun
proto tcp #和server端一致
remote 123.xxx.xxx.xxx 1194 #指定服务端IP和端口
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
ca ca.crt #ca证书
cert client.crt #客户端证书
key client.key #客户端密钥
tls-auth ta.key 1 #ta密钥
cipher AES-256-CBC
comp-lzo #传输内容压缩
verb 3 #日志级别
service openvpn start
###############下面的文件下载放在客户端指定目录下#################################
/etc/openvpn/easy-rsa/pki/issued/client.crt #在服务端证书生成目录下
/etc/openvpn/client/pki/private/client.key #上面的客户端生成目录下
/etc/openvpn/easy-rsa/pki/ca.crt #ca证书
/etc/openvpn/ta.key
/etc/openvpn/easy-rsa/pki/private/ca.key
/etc/openvpn/client.ovpn
五、客户端安装软件
windows客户端下载链接:https://pan.baidu.com/s/14IDo-7QO9v25vPdvkS5Zdg
提取码:3brh
下载的文件放在windowsC:/Program Files/OpenVPN/config目录下
Linux客户端:
openvpn --daemon --cd /etc/openvpn --config client.ovpn --log-append /var/log/openvpn.log #放后台执行