您现在的位置是:首页 > 技术教程 正文

VPN的介绍及自建点对点的OpenVPN和使用方法:保姆级详细教程,(windou客户端版)后附脚本

admin 阅读: 2024-03-18
后台-插件-广告管理-内容页头部广告(手机)

VPN到底是啥?

VPN即虚拟专用网,泛指通过VPN技术在公用网络上构建的虚拟专用网络。

VPN用户在此虚拟网络中传输私网流量,在不改变网络现状的情况下实现安全、可靠的连接。

1.VPN和传统的数据专网相比,优势很多:

安全:
在远端用户、驻外机构、合作伙伴、供应商与公司总部之间建立可靠的连接,保证数据传输的安全性。这对于实现电子商务或金融网络与通讯网络的融合特别重要。

廉价:
利用公共网络进行信息通讯,企业可以用更低的成本连接远程办事机构、出差人员和业务伙伴。

支持移动业务:
支持驻外VPN用户在任何时间、任何地点的移动接入,能够满足不断增长的移动业务需求。

可扩展性:
由于VPN为逻辑上的网络,物理网络中增加或修改节点,不影响VPN的部署。

公共网络又经常被称为VPN骨干网(VPN Backbone),公共网络可以是Internet,也可以是企业自建专网或运营商租赁专网。
工作在网络层和数据链路层的VPN又被称为三层VPN和二层VPN。

2.VPN关键技术:隧道技术

VPN技术的基本原理是利用隧道(Tunnel)技术,对传输报文进行封装,利用VPN骨干网建立专用数据传输通道,实现报文的安全传输。

位于隧道两端的VPN网关,通过对原始报文的“封装”和“解封装”,建立一个点到点的虚拟通信隧道。

隧道的功能就是在两个网络节点之间提供一条通路,使数据能够在这个通路上透明传输。

VPN隧道一般是指在VPN骨干网的VPN节点之间建立的用来传输VPN数据的虚拟连接。

隧道是构建VPN不可或缺的部分,用于把VPN数据从一个VPN节点透明传送到另一个上。

隧道通过隧道协议实现

目前已存在不少隧道协议,如GRE(Generic Routing Encapsulation)、L2TP(Layer 2 Tunneling Protocol)等。

隧道协议通过在隧道的一端给数据加上隧道协议头,即进行封装,使这些被封装的数据能都在某网络中传输,并且在隧道的另一端去掉该数据携带的隧道协议头,即进行解封装。

报文在隧道中传输前后都要通过封装和解封装两个过程。

部分隧道可以混合使用,如GRE Over IPSec隧道。

3.VPN关键技术:身份认证、数据加密与验证

身份认证、数据加密和认证技术可以有效保证VPN网络与数据的安全性:

身份认证:
可用于部署了远程接入VPN的场景,VPN网关对用户的身份进行认证,保证接入网络的都是合法用户而非恶意用户。也可以用于VPN网关之间对对方身份的认证。

数据加密:
将明文通过加密变成密文,使得数据即使被黑客截获,黑客也无法获取其中的信息。

数据验证:
通过数据验证技术对报文的完整性和真伪进行检查,丢弃被伪造和被篡改的报文。

4.常见VPN技术—IPSec

(1) IPSec概述

IPSec(IP Security) VPN一般部署在企业出口设备之间,通过加密与验证等方式,实现了数据来源验证、数据加密、数据完整性保证和抗重放等功能。

数据来源验证:接收方验证发送方身份是否合法。
数据加密:发送方对数据进行加密,以密文的形式在Internet上传送,接收方对接收的加密数据进行解密后处理或直接转发。
数据完整性:接收方对接收的数据进行验证,以判定报文是否被篡改。
抗重放:接收方拒绝旧的或重复的数据包,防止恶意用户通过重复发送捕获到的数据包所进行的攻击。

(2) IPSec协议体系

IPSec不是一个单独的协议,它给出了IP网络上数据安全的一整套体系结构,包括AH(Authentication Header)、ESP(Encapsulating Security Payload)、IKE(Internet Key Exchange)等协议。

IPSec使用认证头AH(Authentication Header)和封装安全载荷ESP(Encapsulating Security Payload)两种安全协议来传输和封装数据,提供认证或加密等安全服务。

AH和ESP协议提供的安全功能依赖于协议采用的验证、加密算法。
AH仅支持认证功能,不支持加密功能。ESP支持认证和加密功能。
安全协议提供认证或加密等安全服务需要有秘钥的存在。

(3)秘钥交换的方式有两种

带外共享密钥:
在发送、接收设备上手工配置静态的加密、验证密钥。
双方通过带外共享的方式(例如通过电话或邮件方式)保证密钥一致性。
这种方式的缺点是可扩展性差,在点到多点组网中配置密钥的工作量成倍增加。
另外,为提升网络安全性需要周期性修改密钥,这种方式下也很难实施。

通过IKE协议自动协商密钥:
IKE建立在Internet安全联盟和密钥管理协议ISAKMP定义的框架上,采用DH(Diffie-Hellman)算法在不安全的网络上安全地分发密钥。

这种方式配置简单,可扩展性好,特别是在大型动态的网络环境下此优点更加突出。

同时,通信双方通过交换密钥交换材料来计算共享的密钥,即使第三方截获了双方用于计算密钥的所有交换数据,也无法计算出真正的密钥。

在vm中安装kvm的虚拟机测试实现

外网ip内网ip
192.168.121.159192.168.122.167

开始测试实验
在这里插入图片描述
首先准备好epel源,可以从阿里源下载,我的就是从阿里源下来的epel源

wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
  • 1

配置好安装源以后,先清理yum缓存,再重新制作缓存

#重新制作yum缓存 yum clean all yum makecache
  • 1
  • 2
  • 3

然后安装openvpn和制作证书工具

yum -y install openvpn yum -y install easy-rsa
  • 1
  • 2

然后复制服务端配置文件,这里需要注意一下openvpen的版本,因为yum源不同的话可能版本不同
版本差别一般不大,就是复制的时候目录名称记得改变

[root@server159 ~]# cp /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/server.conf /etc/openvpn/
  • 1

然后复制证书签发的相关文件

[root@server159 ~]# cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa-server
  • 1

准备服务端签发证书相关变量的配置文件

[root@server159 ~]# cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa-server/3/vars
  • 1

初始化服务端PKI生成PKI相关目录和文件

[root@server159 ~]# cd /etc/openvpn/easy-rsa-server/3 [root@server159 3]# ./easyrsa init-pki
  • 1
  • 2

创建CA证书

[root@server159 3]# ./easyrsa build-ca nopass
  • 1

生成服务端证书

[root@server159 3]# ./easyrsa gen-req server nopass
  • 1

签发服务端证书

[root@server159 3]# ./easyrsa sign server server
  • 1

创建 Diffie-Hellman 密钥(Diffie-Hellman是一种密钥交换协议,用于在公开信道上安全地共享密钥)

[root@server159 3]# ./easyrsa gen-dh
  • 1

编写服务端的配置文件

[root@server159 3]# cat > /etc/openvpn/server.conf < port 1194 proto tcp dev tun ca /etc/openvpn/certs/ca.crt cert /etc/openvpn/certs/server.crt key /etc/openvpn/certs/server.key # This file should be kept secret dh /etc/openvpn/certs/dh.pem server 10.8.0.0 255.255.255.0 push "route 192.168.122.0 255.255.255.0" #内网网段 keepalive 10 120 cipher AES-256-CBC compress lz4-v2 push "compress lz4-v2" max-clients 2048 user openvpn group openvpn status /var/log/openvpn/openvpn-status.log log-append /var/log/openvpn/openvpn.log verb 3 mute 20 EOF
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

配置防火墙转发规则

[root@server159 3]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf [root@server159 3]# sysctl -p [root@server159 3]# yum install iptables-services -y [root@server159 3]# systemctl disable --now firewalld [root@server159 3]# systemctl start iptables [root@server159 3]# iptables -F [root@server159 3]# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE [root@server159 3]# iptables -vnL -t nat
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

创建日志存放目录

[root@server159 3]# mkdir -p /var/log/openvpn
  • 1

拷贝相关证书认证文件

[root@server159 3]# mkdir -p /etc/openvpn/certs [root@server159 3]# cp /etc/openvpn/easy-rsa-server/3/pki/issued/server.crt /etc/openvpn/certs/ [root@server159 3]# cp /etc/openvpn/easy-rsa-server/3/pki/private/server.key /etc/openvpn/certs/ [root@server159 3]# cp /etc/openvpn/easy-rsa-server/3/pki/ca.crt /etc/openvpn/certs/ [root@server159 3]# cp /etc/openvpn/easy-rsa-server/3/pki/dh.pem /etc/openvpn/certs/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

启动openvpn看下情况,是否能启动

[root@server159 3]# systemctl daemon-reload [root@server159 3]# systemctl enable --now openvpn@server [root@server159 3]# systemctl restart openvpn@server
  • 1
  • 2
  • 3

到此服务端的配置完毕,能够启动并看到1194端口启动就是没有问题
在这里插入图片描述
然后到客户端的配置,跟上面步骤差不多
先创建客户端证书环境做准备

[root@server159 3]# cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa-client [root@server159 3]# cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa-client/3/varsa [root@server159 3]# cd /etc/openvpn/easy-rsa-client/3
  • 1
  • 2
  • 3

初始化pki证书目录

[root@server159 3]# ./easyrsa init-pki
  • 1

生成客户端证书

[root@server159 3]# ./easyrsa gen-req yiyezhiqiu nopass
  • 1

然后将客户端证书同步到服务端

[root@server159 3]# cd /etc/openvpn/easy-rsa-server/3 [root@server159 3]# ./easyrsa import-req /etc/openvpn/easy-rsa-client/3/pki/reqs/yiyezhiqiu.req yiyezhiqiu
  • 1
  • 2

查看客户端信息

[root@server159 3]# ll pki/reqs/yiyezhiqiu.req /etc/openvpn/easy-rsa-client/3/pki/reqs/yiyezhiqiu.req -rw------- 1 root root 887 Feb 6 16:04 /etc/openvpn/easy-rsa-client/3/pki/reqs/yiyezhiqiu.req -rw------- 1 root root 887 Feb 6 16:04 pki/reqs/yiyezhiqiu.req
  • 1
  • 2
  • 3
  • 4

然后签发客户端证书

[root@server159 3]# ./easyrsa sign client yiyezhiqiu
  • 1

创建客户端配置文件目录

[root@server159 3]# mkdir -p /etc/openvpn/client/yiyezhiqiu [root@server159 3]# cd /etc/openvpn/client/yiyezhiqiu
  • 1
  • 2

创建客户端配置文件

[root@server159 yiyezhiqiu]# cat > /etc/openvpn/client/yiyezhiqiu/yiyezhiqiu.ovpn < client dev tun proto tcp remote 192.168.121.159 1194 # 外网ip,在云服务上是EIP resolv-retry infinite nobind ca ca.crt cert yiyezhiqiu.crt key yiyezhiqiu.key remote-cert-tls server cipher AES-256-CBC verb 3 compress lz4-v2 EOF
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

将认证文件拷贝到客户端目录下

[root@server159 yiyezhiqiu]# cp /etc/openvpn/easy-rsa-client/3/pki/private/yiyezhiqiu.key . [root@server159 yiyezhiqiu]# cp /etc/openvpn/easy-rsa-server/3/pki/issued/yiyezhiqiu.crt . [root@server159 yiyezhiqiu]# cp /etc/openvpn/easy-rsa-server/3/pki/ca.crt .
  • 1
  • 2
  • 3

然后客户端配置文件就配置好了
现在重启openvpn,看看是否启动成功,端口是否起来

[root@server159 yiyezhiqiu]# systemctl daemon-reload [root@server159 yiyezhiqiu]# systemctl enable --now openvpn@server [root@server159 yiyezhiqiu]# systemctl restart openvpn@server
  • 1
  • 2
  • 3

然后到window上的设置
创建一个openvpn目录存放认证文件
在这里插入图片描述
然后安装openvpn软件,在网上下载随便就可以,这个也不需要破解什么的
这是我用的openvpn软件,大家自行选择,链接大概会在2024年8月份过期
在这里插入图片描述

然后点击连接vpn
在这里插入图片描述
下面这个是连接前后实验,在没有连接vpn之前ping 另一个内网网段的时候是不通的
连接vpn后就可以ping通了,说明vpn隧道已经成功建立连接
在这里插入图片描述
特别注意一下!!!
特别注意一下!!!
特别注意一下!!!
然后如果设置vpn后kvm虚拟机无法连接外网,添加一下iptable规则就可以了
需要将kvm网段的转发规则设置一下
如果你是按照我之前的文章来安装kvm的,那直接执行下面这条语句就可以了,注意网段和网卡名称

iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -o br0 -j MASQUERADE
  • 1

如果是自己安装的,那就根据对应的设置转发规则就好了,都学习到这个程度了,大家肯定都不是小白了,按照网络问题排查网关什么的就好了

实验过程大概就是这样,希望对大家理解vpn的原理有用

下面是将上面的执行操作变为脚本

安装epel源并下载相关安装包

#! /bin/bash #下载阿里epel源 wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo #重新制作yEOFum缓存 yum clean all yum makecache #然后安装openvpn和制作证书工具 yum -y install openvpn yum -y install easy-rsa yum -y install expect
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

服务端脚本

#! /bin/bash # 准备相关配置文件 echo "生成服务器配置文件" cp /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/server.conf /etc/openvpn/ echo "准备证书签发相关文件" cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa-server echo "准备签发证书相关变量的配置文件" cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa-server/3/vars echo "初始化服务端PKI生成PKI相关目录和文件" cd /etc/openvpn/easy-rsa-server/3 ./easyrsa init-pki echo "创建CA证书" # ./easyrsa build-ca nopass expect <<EOF spawn ./easyrsa build-ca nopass expect { "Easy-RSA" {send "\n"} } expect eof EOF cat pki/serial echo "生成服务端证书" # ./easyrsa gen-req server nopass expect <<EOF spawn ./easyrsa gen-req server nopass expect { "server" {send "\n"} } expect eof EOF echo "签发服务端证书" # ./easyrsa sign server server expect <<EOF spawn ./easyrsa sign server server expect { "*details:" {send "yes\n"} } expect eof EOF echo "创建 Diffie-Hellman 密钥" ./easyrsa gen-dh cat > /etc/openvpn/server.conf <<EOF port 1194 proto tcp dev tun ca /etc/openvpn/certs/ca.crt cert /etc/openvpn/certs/server.crt key /etc/openvpn/certs/server.key # This file should be kept secret dh /etc/openvpn/certs/dh.pem server 10.8.0.0 255.255.255.0 push "route 192.168.122.0 255.255.255.0" keepalive 10 120 cipher AES-256-CBC compress lz4-v2 push "compress lz4-v2" max-clients 2048 user openvpn group openvpn status /var/log/openvpn/openvpn-status.log log-append /var/log/openvpn/openvpn.log verb 3 mute 20 EOF echo "添加防火墙" echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf sysctl -p yum install iptables-services -y systemctl disable --now firewalld systemctl start iptables iptables -F iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE iptables -vnL -t nat mkdir -p /var/log/openvpn mkdir -p /etc/openvpn/certs cp /etc/openvpn/easy-rsa-server/3/pki/issued/server.crt /etc/openvpn/certs/ cp /etc/openvpn/easy-rsa-server/3/pki/private/server.key /etc/openvpn/certs/ cp /etc/openvpn/easy-rsa-server/3/pki/ca.crt /etc/openvpn/certs/ cp /etc/openvpn/easy-rsa-server/3/pki/dh.pem /etc/openvpn/certs/ echo "重启OpenVpn" systemctl daemon-reload systemctl enable --now openvpn@server systemctl restart openvpn@server
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108

客户端脚本
这里需要你依次输入自己定义的名字和ip

#! /bin/bash read -p "请输入用户的姓名拼音(如:${NAME}): " NAME read -p "请输入VPN服务端的公网IP(如:${IP}): " IP echo "客户端证书环境" cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa-client cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa-client/3/varsa cd /etc/openvpn/easy-rsa-client/3 echo "初始化pki证书目录" # ./easyrsa init-pki expect << EOF spawn ./easyrsa init-pki expect { "removal" {send "yes\n"} } expect eof EOF echo "生成客户端证书" # ./easyrsa gen-req ${NAME} nopass expect << EOF spawn ./easyrsa gen-req ${NAME} nopass expect { "${NAME}" {send "\n"} } expect eof EOF echo "将客户端证书同步到服务端" cd /etc/openvpn/easy-rsa-server/3 ./easyrsa import-req /etc/openvpn/easy-rsa-client/3/pki/reqs/${NAME}.req ${NAME} echo "查看客户端证书" ll pki/reqs/${NAME}.req /etc/openvpn/easy-rsa-client/3/pki/reqs/${NAME}.req echo "签发客户端证书,请输入:yes" # ./easyrsa sign client ${NAME} expect << EOF spawn ./easyrsa sign client ${NAME} expect { "*details" {send "yes\n"} } expect eof EOF echo "查看证书" cat pki/index.txt ll pki/certs_by_serial/ cat pki/issued/${NAME}.crt echo "创建客户端配置文件" mkdir -p /etc/openvpn/client/${NAME} cd /etc/openvpn/client/${NAME} cat > /etc/openvpn/client/${NAME}/${NAME}.ovpn <<EOF client dev tun proto tcp remote ${IP} 1194 resolv-retry infinite nobind ca ca.crt cert ${NAME}.crt key ${NAME}.key remote-cert-tls server cipher AES-256-CBC verb 3 compress lz4-v2 EOF cp /etc/openvpn/easy-rsa-client/3/pki/private/${NAME}.key . cp /etc/openvpn/easy-rsa-server/3/pki/issued/${NAME}.crt . cp /etc/openvpn/easy-rsa-server/3/pki/ca.crt . echo "打包用户证书" tar -czvf ${NAME}.tar.gz ./ echo "重启OpenVpn" systemctl daemon-reload systemctl enable --now openvpn@server systemctl restart openvpn@server
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90

然后如果设置vpn后kvm虚拟机无法连接外网,添加一下iptable规则就可以了
需要将kvm网段的转发规则设置一下
如果你是按照我之前的文章来安装kvm的,那直接执行下面这条语句就可以了,注意网段和网卡名称

iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -o br0 -j MASQUERADE
  • 1

如果是自己安装的,那就根据对应的设置转发规则就好了,都学习到这个程度了,大家肯定都不是小白了,按照网络问题排查就好了
有参考一写其他人的文章,如有侵权请及时告知删除

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索
排行榜