1.OpenVPN概述

什么是VPN

VPN直译就是虚拟专用通道,是提供给企业之间或者个人与公司之间安全数据传输的隧道,OpenVPN无疑是Linux下开源VPN的先锋,提供了良好的性能和友好的用户GUI

OpenVPN和传统VPN相比,它的优点是简单易用

Open VPN

Open VPN大量使用了OpenSSL加密库中的SSLv3/TLSv1协议函数库。

目前OpenVPN能在Solaris、Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X与Microsoft Windows以及Android和iOS上运行,并包含了许多安全性的功能。它并不是一个基于Web的VPN软件,也不与IPsec及其他VPN软件包兼容

Open VPN认证方式

1、基于与共享密钥(公钥/私钥)

2、基于电子证书

3、可使用用户名/密码进行身份验证

2.OpenVPN应用场景

1.Peer-to-Peer VPN(点对点连接)

将internet两台机器(公网地址)shiyongVPN连接起来,比如广州服务器和上海服务器之间的数据需要相互调用,但是数据又比较敏感,直接通过公共网络传输,容易被窃取数据。如果拉一条专线成本又太高。那么我们可以通过VPN使用现有网络,将两台主机逻辑上捆绑在一个虚拟网络中,这样既保证了数据的传输安全,同时又节省了成本。

2.Site-to-Site VPN(站点对站点连接)

用于连接两个或者多个地域上不同的局域网(LAN),每个LAN有一台OpenVPN服务器作为接入点,组成虚拟专用网络,是得不同LAN里面的主机和服务都能够相互通讯(比如国内公司与海外分公司的连接)

3.Remote AccessVPN(远程访问)

应用于外网用户访问内部资源。在这个场景中远程访问者,一般通过公网IP连接VPN服务,然后通过分配后的内网地址与其内网网段进行通信

3.OpenVPN远程拨号

OpenVPN场景实践拓扑图

OpenVPN场景实践地址规划

主机角色外网IP内网IP
OpenVPN Server10.0.0.61172.16.1.61
OpenVPN Client10.0.0.1
web172.16.1.7

所有系统:Centos7.4

1.安装openvpn软件

[root@openvpn-server ~]# yum install openvpn -y
[root@openvpn-server ~]# 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.2k-fips  26 Jan 2017, LZO 2.06
....

2.为了保证OpenVPN的安装,需要使用easy-rsa

[root@openvpn-server ~]# yum install easy-rsa -y

3.生成密钥证书前,需要准备vars文件

[root@openvpn-server ~]# mkdir /etc/openvpn/easy-rsa && cd /etc/openvpn/easy-rsa/
[root@openvpn-server easy-rsa]# cp -a /usr/share/easy-rsa/3.0.6/* ./
[root@openvpn-server easy-rsa]# cp -a /usr/share/doc/easy-rsa-3.0.6/vars.example ./vars
[root@openvpn-server easy-rsa]# vim vars
...
set_var EASYRSA_DN  "cn_only"
set_var EASYRSA_REQ_COUNTRY "CN"                      #所在的国家
set_var EASYRSA_REQ_PROVINCE "Guangdong"              #所在的省份
set_var EASYRSA_REQ_CITY "ShenZh"                     #所在的城市
set_var EASYRSA_REQ_ORG "SA"                          #所在的组织
set_var EASYRSA_REQ_EMAIL "jasonminghao@163.com"      #邮箱的地址
set_var EASYRSA_REQ_OU          "sky"                 #所在公司/组织
...

4.初始化生成证书

#1.初始化,在当前目录创建PKI目录,用于存储证书 
[root@openvpn-server easy-rsa]# ./easyrsa init-pki
#2.创建根证书,会提示设置密码,用于ca对之后生成的serverclient证书签名时使用,其他可默认
[root@openvpn-server easy-rsa]# ./easyrsa build-ca
#3.创建server端证书和私钥文件,nopass表示不加密私钥文件,其他可默认
[root@openvpn-server easy-rsa]# ./easyrsa gen-req server nopass
#4.给server端证书签名,首先是对一些信息的确认,输入yes,然后创建ca根证书时设置的密码 
[root@openvpn-server easy-rsa]# ./easyrsa sign server server
#5.创建Diffie-Hellman文件,秘钥交换时的Diffie-Hellman算法(这个过程需要很长时间,1~3 Minutes[root@openvpn-server easy-rsa]# ./easyrsa gen-dh
#6.创建client端证书和私钥文件,nopass表示不加密私钥文件,其他可默认
[root@openvpn-server easy-rsa]# ./easyrsa gen-req client nopass
#7.给client端证书签名,首先是对一些信息的确认,可以输入yes,然后创建ca根证书时设置的密码 
[root@openvpn-server easy-rsa]# ./easyrsa sign client client

5.根据配置需要文件中定义,需要拷贝openvpnServer端用到的证书至/etc/openvpn/pki目录中

[root@openvpn-server ~]# mkdir /etc/openvpn/pki && cd /etc/openvpn/pki
[root@openvpn-server pki]# cp /etc/openvpn/easy-rsa/pki/ca.crt  ./
[root@openvpn-server pki]# cp /etc/openvpn/easy-rsa/pki/issued/server.crt ./
[root@openvpn-server pki]# cp /etc/openvpn/easy-rsa/pki/private/server.key ./
[root@openvpn-server pki]# cp /etc/openvpn/easy-rsa/pki/dh.pem  ./
# 查看已拷贝好的证书
[root@openvpn-server pki]# ll
total 20
-rw------- 1 root root 1172 Mar  1 01:39 ca.crt
-rw------- 1 root root  424 Mar  1 01:39 dh.pem
-rw------- 1 root root 4552 Mar  1 01:38 server.crt
-rw------- 1 root root 1704 Mar  1 01:39 server.key

6.配置openvpn

[root@openvpn-server ~]# vi /etc/openvpn/server/server.conf
user root
group root
port 1194                               #端口
proto tcp                               #协议
dev tun                                 #采用路由隧道模式tun
ca /etc/openvpn/pki/ca.crt              #ca证书文件位置
cert /etc/openvpn/pki/server.crt        #服务端公钥名称
key /etc/openvpn/pki/server.key         #服务端私钥名称
dh /etc/openvpn/pki/dh.pem              #交换证书
server 10.8.0.0 255.255.255.0           #给客户端分配地址池,注意:不能和VPN服务器内网网段有相同
ifconfig-pool-persist ipp.txt           #地址池记录文件位置
push "route 172.16.1.0 255.255.255.0"   #允许客户端访问内网172.16.1.0网段
push "dhcp-option DNS 114.114.114.114"  # 分配给客户端DNS地址
keepalive 10 120                        #存活时间,10ping一次,120 如未收到响应则视为断线
max-clients 100                         #最多允许100个客户端连接
status openvpn-status.log               #日志记录位置
verb 3                                  #openvpn版本
log /var/log/openvpn.log                #openvpn日志记录位置
persist-key                                     #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keyspersist-tun                                   #检测超时后,重新启动VPN,一直保持tunlinkup的。否则网络会先linkdown然后再linkup

7.配置openvpn,首先需要开启内核转发功能

[root@openvpn-server ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
[root@openvpn-server ~]# systemctl restart network

8.启动openvpn服务

[root@openvpn-server server]# openvpn --daemon --config /etc/openvpn/server/server.conf
[root@openvpn-server server]# ps -ef |grep openvpn
root       4052      1  0 01:53 ?        00:00:00 openvpn --daemon --config /etc/openvpn/server/server.conf

4.OprnVPN访问内网网段

客户端发送的数据包虽然能抵达openvpn的内网地址,但无法与openvpn服务同内网网段主机进行通信,因为后端主机没有回10.8.0.0的路由,所以会导致无法ping通,可以在后端主机增加一条抵达10.8.0.0的路由

解决方法一,在后端主机添加抵达去往10.8.0.0网段的走openvpn的内网地址即可

#指定添加去10.8.0.0网段走openvpn内网
[root@web01 ~]# route add  -net 10.8.0.0/24 gw 172.16.1.61
#添加完路由的效果如下
[root@web01 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.8.0.0        172.16.1.61     255.255.255.0   UG    0      0        0 eth1

如上的配置需要在所有后端主机添加,如果机器量过多,那么添加起来非常麻烦,建议用firewalld防火墙的转发功能

解决方法二,在vpn服务器上配置防火墙转发规则

[root@m01 ~]# systemctl start firewalld
[root@m01 ~]# firewall-cmd --add-service=openvpn --permanent
[root@m01 ~]# firewall-cmd --add-masquerade --permanent
[root@m01 ~]# firewall-cmd --reload

5.客户端连接

①MAC OS客户端

1.下载MAC OS的openvpn软件

GitHub

2.下载服务端生成的客户端密钥文件和ca文件至NAC OS指定~/Documents/OpenVPN/config 目录中

[root@openvpn-client ~]# cd /etc/openvpn/easy-rsa/pki
[root@openvpn-client openvpn]# sz ca.crt
[root@openvpn-client openvpn]# sz issued/client.crt
[root@openvpn-client openvpn]# sz private/client.key

3.在~/Documents/OpenVPN/config 创建一个客户端配置文件,名称叫client.ovpn内容如下

client                  #指定当前VPN是客户端
dev tun                 #使用tun隧道传输协议
proto tcp               #使用udp协议传输数据
remote 10.4.7.61 1194   #openvpn服务器IP地址端口号(根据openvpn服务端IP地址修改)
resolv-retry infinite   #断线自动重新连接,在网络不稳定的情况下非常有用
nobind                  #不绑定本地特定的端口号
ca ca.crt               #指定CA证书的文件路径
cert client.crt         #指定当前客户端的证书文件路径
key client.key          #指定当前客户端的私钥文件路径
verb 3                  #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
persist-key             #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
persist-tun             #检测超时后,重新启动VPN,一直保持tunlinkup的。否则网络会先linkdown然后再linkup

4.最终MAC OS的目录中配置文件如下

5.双击运行openvpn,然后连接即可。

②Linux客户端

1.安装openvpn

[root@openvpn-client ~]# yum install openvpn -y

2.下载证书文件

[root@openvpn-client ~]# cd /etc/openvpn/
[root@openvpn-client openvpn]# scp root@172.16.1.61:/opt/easy-rsa/pki/ca.crt ./
[root@openvpn-client openvpn]# scp root@172.16.1.61:/opt/easy-rsa/pki/issued/client.crt ./
[root@openvpn-client openvpn]# scp root@172.16.1.61:/opt/easy-rsa/pki/private/client.key ./

3.配置客户端

[root@openvpn-client openvpn]# cat client.ovpn
client                  #指定当前VPN是客户端
dev tun                 #使用tun隧道传输协议
proto udp               #使用udp协议传输数据
remote 10.0.0.61 1194   #openvpn服务器IP地址端口号
resolv-retry infinite   #断线自动重新连接,在网络不稳定的情况下非常有用
nobind                  #不绑定本地特定的端口号
ca ca.crt               #指定CA证书的文件路径
cert client.crt         #指定当前客户端的证书文件路径
key client.key          #指定当前客户端的私钥文件路径
verb 3                  #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
persist-key     #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
persist-tun     #检测超时后,重新启动VPN,一直保持tunlinkup的。否则网络会先linkdown然后再linkup

4.启动Linux客户端的openvpn

[root@openvpn-client ~]# openvpn --daemon --cd /etc/openvpn --config client.ovpn --log-append /var/log/openvpn.log
# --daemonopenvpndaemon方式启动。
# --cd dir:配置文件的目录,openvpn初始化前,先切换到此目录。
# --config file:客户端配置文件的路径。
# --log-append file:日志文件路径,如果文件不存在会自动创建。