openeuler搭建虚拟专用网络

虚拟专用网络部署之-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时,网关1识别出该用户为VPN用户后,发起与总部网关即网关2的隧道连接,从而网关1和网关2之间建立VPN隧道。
  2. 网关1将数据封装在VPN隧道中,发送给网关2。
  3. 网关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

实验虚拟机规划

序号主机名称地址规划(外网)地址规划(内网)系统环境
01openvpn-server192.168.1.210/24172.16.1.10/24openEuler 22.03 LTS
02openvpn-client192.168.1.211/24/openEuler 22.03 LTS
03openvpn-app-server/172.16.1.100/24openEuler 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  429 19:29 ca.crt
-rw-------. 1 root root 3.2K  429 19:26 ca.key
-rw-r--r--. 1 root root 8.1K  429 19:51 client.crt
-rw-r--r--. 1 root root 1.8K  429 19:51 client.csr
-rw-------. 1 root root 3.2K  429 19:51 client.key
-rw-r--r--. 1 root root  424  429 19:51 dh2048.pem
-rw-r--r--. 1 root root 8.2K  429 19:51 server.crt
-rw-r--r--. 1 root root 1.8K  429 19:51 server.csr
-rw-------. 1 root root 3.2K  429 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 # 查看此文件内的指定的路径文件是否存在

  1. 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是否放行规则


搭建web服务可以有很多种方式,下面我介绍一种基于Apache的搭建方式: 1. 安装Apache 在openEuler上安装Apache可以使用yum命令,执行以下命令即可: ``` sudo yum install httpd ``` 2. 配置Apache Apache的主要配置文件是/etc/httpd/conf/httpd.conf,您可以使用文本编辑器(如vi)打开该文件并进行编辑。在编辑之前,建议您备份该文件。 打开httpd.conf文件后,您可以修改以下重要配置项: a. ServerName 找到以下行并取消注释(即去掉#),并将ServerName修改为您的主机名或IP地址: ``` #ServerName www.example.com:80 ``` 例如: ``` ServerName 192.168.1.100:80 ``` b. DocumentRoot DocumentRoot是Apache服务器的文档根目录,即Web服务器从中提供文档的目录。默认情况下,Apache在/var/www/html中设置DocumentRoot。 如果您想更改文档根目录,请找到以下行并取消注释(去掉#),并将DocumentRoot修改为您想要的目录: ``` #DocumentRoot "/var/www/html" ``` 例如: ``` DocumentRoot "/home/user/public_html" ``` c. DirectoryIndex DirectoryIndex指定当客户端请求目录时,服务器应该返回的文件。默认情况下,Apache设置DirectoryIndex为index.html。 如果您想更改DirectoryIndex,请找到以下行并取消注释(去掉#),并添加您想要的文件名: ``` #DirectoryIndex index.html ``` 例如: ``` DirectoryIndex index.php index.html ``` 3. 启动Apache 完成Apache的配置后,您可以使用以下命令启动Apache: ``` sudo systemctl start httpd ``` 如果您想在系统启动时自动启动Apache,请使用以下命令: ``` sudo systemctl enable httpd ``` 4. 创建网页 完成Apache的配置和启动后,您可以在DocumentRoot目录中创建您的网页。例如,如果您的DocumentRoot是/home/user/public_html,则可以在该目录中创建一个index.html文件来测试您的Web服务器。 5. 访问网页 在完成上述步骤后,您可以在Web浏览器中输入您的服务器IP地址或主机名来访问您的网页。如果您在上一步中创建了一个名为index.html的文件,则可以在Web浏览器中输入以下地址: ``` http://your_server_IP_address_or_hostname/ ``` 例如,如果您的服务器IP地址是192.168.1.100,则可以在Web浏览器中输入以下地址: ``` http://192.168.1.100/ ``` 如果一切顺利,您应该能够在浏览器中看到您创建的网页。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值