虚拟专用网络部署之-openvpn
很多人对虚拟专用网络这个词或许没有那么熟,但是虚拟专用还有另外一个名字 VPN 相比大家对VPN这个词就觉得比较熟悉了,但是大多数人对VPN的概念停留在一个用来使用做违反一些规定的事,所以该词在网上出现的会比较少。
而实际企业中网络架构往往是又离不开VPN的,那么什么是VPN呢?
虚拟专用网络介绍
什么是VPN
VPN可以在不改变现有网络结构的情况下,建立虚拟专用连接。因其具有廉价、专用和虚拟等多种优势,在现网中应用非常广泛。
产生背景
在VPN(Virtual Private Network)出现之前,跨越Internet的数据传输只能依靠现有物理网络,具有很大的不安全因素。
如下图所示,某企业的总部和分支机构位于不同区域(比如位于不同的国家或城市),当分支机构员工需访问总部服务器的时候,数据传输要经过Internet。由于Internet中存在多种不安全因素,则当分支机构的员工向总部服务器发送访问请求时,报文容易被网络中的黑客窃取或篡改。最终造成数据泄密、重要数据被破坏等后果。
为了防止信息泄露,可以在总部和分支机构之间搭建一条物理专网连接,但其费用会非常昂贵。
VPN出现后,通过部署不同类型的VPN便可解决上述问题。VPN对数据进行封装和加密,即使网络黑客窃取到数据,也无法破解,确保了数据的安全性。且搭建VPN不需改变现有网络拓扑,没有额外费用。
定义
VPN即虚拟专用网,用于在公用网络上构建私人专用虚拟网络,并在此虚拟网络中传输私网流量。VPN把现有的物理网络分解成逻辑上隔离的网络,在不改变网络现状的情况下实现安全、可靠的连接。
VPN具有以下两个基本特征:
- 专用(Private):VPN网络是专门供VPN用户使用的网络,对于VPN用户,使用VPN与使用传统专网没有区别。VPN能够提供足够的安全保证,确保VPN内部信息不受外部侵扰。VPN与底层承载网络(一般为IP网络)之间保持资源独立,即VPN资源不被网络中非该VPN的用户所使用。
- 虚拟(Virtual):VPN用户内部的通信是通过公共网络进行的,而这个公共网络同时也可以被其他非VPN用户使用,VPN用户获得的只是一个逻辑意义上的专网。这个公共网络称为VPN骨干网(VPN Backbone)。
封装原理
VPN的基本原理是利用隧道(Tunnel)技术,对传输报文进行封装,利用VPN骨干网建立专用数据传输通道,实现报文的安全传输。
隧道技术使用一种协议封装另外一种协议报文(通常是IP报文),而封装后的报文也可以再次被其他封装协议所封装。对用户来说,隧道是其所在网络的逻辑延伸,在使用效果上与实际物理链路相同。
参考下图VPN封装后的报文传输
如上图所展示的网络中,如果存在VPN隧道,则数据传输如这个图所示。当分支机构员工访问总部服务器时,报文封装过程如下:
- 报文发送到网关1时,网关1识别出该用户为VPN用户后,发起与总部网关即网关2的隧道连接,从而网关1和网关2之间建立VPN隧道。
- 网关1将数据封装在VPN隧道中,发送给网关2。
- 网关2收到报文后进行解封装,并将原始数据发送给最终接收者,即服务器。
反向的处理也一样。VPN网关在封装时可以对报文进行加密处理,使Internet上的非法用户无法读取报文内容,因而通信是安全可靠的。
优势
VPN和传统的数据专网相比具有如下优势:
- 安全:在远端用户、驻外机构、合作伙伴、供应商与公司总部之间建立可靠的连接,保证数据传输的安全性。这对于实现电子商务或金融网络与通讯网络的融合特别重要。
- 廉价:利用公共网络进行信息通讯,企业可以用更低的成本连接远程办事机构、出差人员和业务伙伴。
- 支持移动业务:支持驻外VPN用户在任何时间、任何地点的移动接入,能够满足不断增长的移动业务需求。
- 可扩展性:由于VPN为逻辑上的网络,物理网络中增加或修改节点,不影响VPN的部署。
VPN在保证网络的安全性、可靠性、可管理性的同时提供更强的扩展性和灵活性。在全球任何一个角落,只要能够接入到Internet,即可使用VPN。
虚拟专用网络分类概述
根据VPN组网方式不同进行划分
- 远程访问VPN:
这种方式适用于出差员工拨号接入VPN的方式,员工可以在只要有Internet的地方都可以通过VPN接入访问企业内网资源。
最常见类型有:SSL VPN、L2TP VPN - 站点之间VPN:
这种方式适合用于企业两个局域网互通的情况;例如企业的分支机构访问总部,企业的分支机构互访;
最常见类型有:MPLS VPN、IPsec VPN
根据VPN工作网络层次进行划分:
- 应用层VPN:SSL VPN
- 网络层VPN:IPsec VPN、GRE VPN
- 链路层VPN:L2TP VPN、PPTP VPN
专用网络开源产品
PPTP
点到点隧道协议(PPTP)是由包括微软和3COM等公司组成的PPTP论坛开发的一种点到点隧道协议;
基于拨号使用的PPP协议,使用PAP或CHAP之类的加密算法,或者使用Microsoft的点对点加密算法MPPE。
使用PPTP VPN的最大优势在于,无需再Windows客户端单独安装客户端软件,默认就支持PPTP VPN拨号连接功能。
**适用场景:**适合远程的企业用户拨号到企业内部进行办公应用
**开源软件:**PPTP VPN
IPsec VPN
IPsec 隧道模式是封装、路由与解封装的整个过程。隧道将原始数据包隐藏(或封装)在新的数据包内部;
隧道与数据保密性结合使用时,在网络上窃听通讯的人将无法获取原始数据包数据(以及原始的源和目地址);
**适用场景:**企业异地两地总分公司或多个IDC机房之间的VPN不间断按需连接
**开源软件:**openswan
SSL VPN
SSL VPN提供了数据私密性、端到端验证、信息完整性等特性;
SSL 独立于应用,因此仁和一个应用程序都可以享受它的安全性而不必理会执行细节,也就是TLS,https也是使用的SSL做为加密技术。
**适用场景:**企业异地或者移动用户拨号连接总部实现VPN不间断按需连接
**开源软件:**openvpn
说明:属于C/S架构的软件,需要单独安装openvpn客户端和服务端
虚拟专用网络部署实验-openvpn
实验拓扑图
实验数据规划
实验平台环境:
ESXI 6.7
实验虚拟机规划
序号 | 主机名称 | 地址规划(外网) | 地址规划(内网) | 系统环境 |
---|---|---|---|---|
01 | openvpn-server | 192.168.1.210/24 | 172.16.1.10/24 | openEuler 22.03 LTS |
02 | openvpn-client | 192.168.1.211/24 | / | openEuler 22.03 LTS |
03 | openvpn-app-server | / | 172.16.1.100/24 | openEuler 22.03 LTS |
关于以上的数据规划,在ESXI上在额外创建一个VSW,实现服务器的双网卡地址,并且隔离开来。
系统环境修改
# 系统环境修改主要是关闭安全方面的组件,以免造成不必要的流量拦截。正式环境按需配置
# 使能SELinux的permissive模式
setenforce 0
# 关闭防火墙
systemctl stop firewalld
# 永久关闭
systemctl disable firewalld
生成所需要的证书
openVPN的认证是需要通过证书进行认证的,所以在进行配置openvpn之前需要做的一个工作就是生成需要的证书。
需要的证书:
CA证书,用于签发服务端证书和客户端证书
服务端证书,用于服务端的身份认证
客户端证书,用于客户端的身份认证
DH证书,用于数据传输的加密
生成证书open VPN为我们提供了一个便捷的工具easy-rsa
# 到GitHub上下载工具,并且上传到服务器中,下载地址:https://github.com/OpenVPN/easy-rsa-old
# 上传到服务器后进行解压该文件到 easy-2.3.3/ 目录下
tar -zxvf easy-rsa-old-2.3.3.tar.gz -C easy-2.3.3/
# 进入目录
cd /root/easy-2.3.3/easy-rsa-old-2.3.3/easy-rsa/2.0
# 修改配置文件,该文件为生成证书需要的一些配置,只需要修改以下列出来的字段为自己需要填写的字段
vim vars
export KEY_COUNTRY="CN" #表示国家
export KEY_PROVINCE="SiChuang" #省份
export KEY_CITY="ChengDu" #城市
export KEY_ORG=" " #组织名称
export KEY_EMAIL=" " #邮箱
export KEY_CN= # CN 字段,对于 SSL 证书,一般为网站域名或IP地址;而对于代码签名证书则为申请单位名称;而对于客户端证书则为证书申请者的姓名;
export KEY_NAME= #名字
export KEY_OU= #部门名字
# 修改完配置文件后进行加载配置文件后会有回显
source ./vars
**************************************************************
No /root/easy-rsa-old-2.3.3/easy-rsa/2.0/openssl.cnf file could be found
Further invocations will fail
**************************************************************
NOTE: If you run ./clean-all, I will be doing a rm -rf on /root/easy-rsa-old-2.3.3/easy-rsa/2.0/keys
#根据以上回显执行后会生成一个keys目录,用来存放证书文件的
./clean-all
# 查看/root/easy-rsa-old-2.3.3/easy-rsa/2.0/ 目录是否生成了一个keys文件
ll /root/easy-rsa-old-2.3.3/easy-rsa/2.0/
# 生成目录申请CA证书
# 在openEuler22.03 LTS版本上会报错,因为该版本系统使用的是openssl 1.1.1的,在easy-rsa脚本中并没该版本,脚本需要找到一个openssl.cnf的文件,但是该工具没有生成该文件,需要手动拷贝一份,把openssl-1.0.0.cnf拷贝一份为openssl.cnf
cp openssl-1.0.0.cnf openssl.cnf
# 生成CA证书
./build-ca
# 生成服务器证书
./build-key-server server
# 生成客户端证书
./build-key client
# 生成交换密钥证书
./build-dh
# 证书生成完成,查看keys目录
-rw-r--r--. 1 root root 2.5K 4月 29 19:29 ca.crt
-rw-------. 1 root root 3.2K 4月 29 19:26 ca.key
-rw-r--r--. 1 root root 8.1K 4月 29 19:51 client.crt
-rw-r--r--. 1 root root 1.8K 4月 29 19:51 client.csr
-rw-------. 1 root root 3.2K 4月 29 19:51 client.key
-rw-r--r--. 1 root root 424 4月 29 19:51 dh2048.pem
-rw-r--r--. 1 root root 8.2K 4月 29 19:51 server.crt
-rw-r--r--. 1 root root 1.8K 4月 29 19:51 server.csr
-rw-------. 1 root root 3.2K 4月 29 19:51 server.key
# 该目录中这些文件是需要使用到的,后续服务器端的拷贝到服务器的etc/openvpn/server目录下,客户端的拷贝到客户端中
服务端安装openvpn并配置
# 安装openvpn
dnf install openvpn
# 查看openvpn的包所安装的路径
rpm -ql openvpn
/etc/ima/digest_lists.tlv/0-metadata_list-compact_tlv-openvpn-2.5.5-2.oe2203.x86_64
/etc/ima/digest_lists/0-metadata_list-compact-openvpn-2.5.5-2.oe2203.x86_64
/etc/openvpn/client/client.conf
/etc/openvpn/server/server.conf
/run/openvpn-client
/run/openvpn-server
/usr/lib/systemd/system/openvpn-client@.service
/usr/lib/systemd/system/openvpn-server@.service
/usr/lib/tmpfiles.d/openvpn.conf
/usr/lib64/openvpn
/usr/lib64/openvpn/plugins
/usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so
/usr/lib64/openvpn/plugins/openvpn-plugin-down-root.so
/usr/sbin/openvpn
/usr/share/licenses/openvpn
/usr/share/licenses/openvpn/AUTHORS
/usr/share/licenses/openvpn/COPYING
/usr/share/licenses/openvpn/COPYRIGHT.GPL
/var/lib/openvpn
# 修改/etc/openvpn/server/server.conf配置文件
vim /etc/openvpn/server/server.conf
# 需要将这四个证书拷贝到/etc/openvpn/server/ 目录下,如果不拷贝证书可以把该配置文件的路劲修改为证书文件的路径
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
# 修改建立隧道的地址
server 10.0.1.0 255.255.255.0
# 修改推送路由信息
push "route 172.16.1.0 255.255.255.0"
# 待会需要生成ta.key文件在/etc/openvpn/server/ 目录下
tls-auth ta.key 0 # This file is secret
# 修改为GCM
cipher AES-256-GCM
# 修改完成保存配置文件并退出
# 拷贝文件到/etc/openvpn/server/
cp /root/easy-rsa-old-2.3.3/easy-rsa/2.0/keys/ca.crt /etc/openvpn/server/
cp /root/easy-rsa-old-2.3.3/easy-rsa/2.0/keys/server.crt /etc/openvpn/server/
cp /root/easy-rsa-old-2.3.3/easy-rsa/2.0/keys/server.key /etc/openvpn/server/
cp /root/easy-rsa-old-2.3.3/easy-rsa/2.0/keys/dh2048.pem /etc/openvpn/server/
# 拷贝文件完成后进入到该目录
cd /etc/openvpn/server/
# 生成ta.key文件
openvpn --genkey --secret ta.key
# 完成后检查目录中的文件是否都存在,加上配置文件一共六个文件
# 修改内核转发路由
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
# 生效内核配置文件
sysctl -p
# 配置完成后启动openvpn
openvpn --daemon --config /etc/openvpn/server/server.conf
# 检查启动是否正常
[root@openvpn-server ~]# netstat -lntup | grep 1194
udp 0 0 0.0.0.0:1194 0.0.0.0:* 9175/openvpn
服务端上配置客户端需要的文件
# 客户端要连接首先在服务端配置好客户端的连接文件发送给客户端
# 创建一个目录用于存放客户端的文件
mkdir openvpn_cilent
cp /etc/openvpn/client/client.conf /root/openvpn_cilent/
vim /root/openvpn_cilent/client.conf
# 修改连接的服务器地址和端口,该实验服务器的公网地址为192.168.1.210,端口为1194
remote 192.168.1.210 1194
# 证书,这四项修改为自己创建的证书名字
ca ca.crt
cert client.crt
key client.key
tls-auth ta.key 1
# 没修改之前是cipher AES-256-CBC,修改成GCM
cipher AES-256-GCM
# 客户端配置文件修改完成保存并退出
# 把客户端用到的对应的证书文件拷贝到创建的目录中
cp /root/easy-rsa-old-2.3.3/easy-rsa/2.0/keys/client.crt /root/openvpn_cilent/
cp /root/easy-rsa-old-2.3.3/easy-rsa/2.0/keys/client.key /root/openvpn_cilent/
cp /root/easy-rsa-old-2.3.3/easy-rsa/2.0/keys/ca.crt /root/openvpn_cilent/
cp /etc/openvpn/server/ta.key /root/openvpn_cilent/
# 拷贝完成后检查目录存在 四个证书文件一个配置文件
# 如果客户端是Windows时,需要修改配置文件的后缀名才能使用
cp client.conf client.ovpn
# 打包客户端文件
zip client.zip ./openvpn_cilent/*
# 把文件拷贝到客户机
scp client.zip root@192.168.1.211:/root/
客户端连接openvpn
# 安装openvpn
dnf install openvpn
# 解压服务端拷贝的配置文件
unzip client.zip
# 连接openvpn
openvpn --daemon --config /root/openvpn_cilent/client.conf
# 检查连接是否正常,生成了tun0接口,并且获得了地址
[root@openvpn-client openvpn_cilent]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:16:0c:d9 brd ff:ff:ff:ff:ff:ff
altname enp11s0
inet 192.168.1.211/24 brd 192.168.1.255 scope global noprefixroute ens192
valid_lft forever preferred_lft forever
inet6 2409:8a62:e34:c1f0:6a9f:5a4c:1e0a:6368/64 scope global dynamic noprefixroute
valid_lft 230863sec preferred_lft 144463sec
inet6 fe80::58cc:93b4:97d4:eb0c/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500
link/none
inet 10.0.1.6 peer 10.0.1.5/32 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::15a2:6422:fd9a:3850/64 scope link stable-privacy
valid_lft forever preferred_lft forever
[root@openvpn-client openvpn_cilent]#
# 查看路由推送是否正常
[root@openvpn-client openvpn_cilent]# ip route
default via 192.168.1.1 dev ens192 proto static metric 100
10.0.1.1 via 10.0.1.5 dev tun0
10.0.1.5 dev tun0 proto kernel scope link src 10.0.1.6
172.16.1.0/24 via 10.0.1.5 dev tun0
192.168.1.0/24 dev ens192 proto kernel scope link src 192.168.1.211 metric 100
[root@openvpn-client openvpn_cilent]#
# 可以看到推送了一条172.16.1.0/24的路由,下一跳为tun0口
# ping 内网服务器测试
[root@openvpn-client openvpn_cilent]# ping 172.16.1.100
PING 172.16.1.100 (172.16.1.100) 56(84) 字节的数据。
64 字节,来自 172.16.1.100: icmp_seq=1 ttl=63 时间=0.468 毫秒
64 字节,来自 172.16.1.100: icmp_seq=2 ttl=63 时间=0.452 毫秒
64 字节,来自 172.16.1.100: icmp_seq=3 ttl=63 时间=0.387 毫秒
^C
--- 172.16.1.100 ping 统计 ---
已发送 3 个包, 已接收 3 个包, 0% packet loss, time 2055ms
rtt min/avg/max/mdev = 0.387/0.435/0.468/0.035 ms
[root@openvpn-client openvpn_cilent]#
以上为本次openvpn实验的整个过程,在网络厂商中会存在很多专业的VPN设备,配置和调试跟使用体验都要比openvpn好得多,但是做为硬件厂商,他们的vpn软件都是需要花钱的,而可以免费使用的openvpn成为了很多中小规模的以及个人的使用。
排错方法
1. 服务器openvpn启动异常
server:
cat /etc/openvpn/server.conf # 查看此文件内的指定的路径文件是否存在
2. windows客户端软件链接异常
client:
查看client.ovpn文件中ip地址、端口、以及文件名是否正常 并与服务端的server.conf进行比对
查看client.ovpn文件之中是否有空格,可能会导致(管理接口)这种报错
server:
(1) netstat -lntp # 查看端口(服务)是否开启
(2) cat /etc/sysctl.conf # 查看路由转发功能是否开启
net.ipv4.ip_forward = 1
(3) iptables -nvL -t nat # 查看iptables是否放行规则
..............
ver:
cat /etc/openvpn/server.conf # 查看此文件内的指定的路径文件是否存在
- windows客户端软件链接异常
client:
查看client.ovpn文件中ip地址、端口、以及文件名是否正常 并与服务端的server.conf进行比对
查看client.ovpn文件之中是否有空格,可能会导致(管理接口)这种报错
server:
(1) netstat -lntp # 查看端口(服务)是否开启
(2) cat /etc/sysctl.conf # 查看路由转发功能是否开启
net.ipv4.ip_forward = 1
(3) iptables -nvL -t nat # 查看iptables是否放行规则
…