《Linux系统安全:纵深防御、安全扫描与入侵检测 》 —3.3 使用OpenVPN创建点到点的虚拟专用网络

华章计算机 发表于 2019/11/14 12:23:08 2019/11/14
【摘要】 本节书摘来自华章计算机《Linux系统安全:纵深防御、安全扫描与入侵检测》一书中第3章,第3.3节,作者是胥峰。

3.3 使用OpenVPN创建点到点的虚拟专用网络

在某些运维场景中,我们会遇到只需要把两台处于Internet上的服务器使用虚拟专用网络互联起来的需求,比如远程的SNMP信息抓取、远程数据库备份等。

在这种情况下,我们可以使用OpenVPN来创建点到点(Peer-to-Peer)的虚拟专用网络的物理架构,如图3-1所示。

 image.png

图3-1 点到点的虚拟专用网络物理架构图

创建点到点模式的虚拟专用网络的操作步骤如下。

1)在两台需要互联的服务器x.y.z.28和a.b.c.239上都执行如下安装操作。

#下载epel的扩展仓库,其中提供了OpenVPN的rpm包

wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm

#安装epel的rpm包

rpm -ivh epel-release-latest-6.noarch.rpm

#安装OpenVPN前,需要安装OpenVPN的依赖库(lzo库用于压缩;openssl库用于支持加密和证书认证)

yum -y install lzo lzo-devel openssl openssl-devel

#安装OpenVPN

yum -y install openvpn

2)在服务器x.y.z.28上生成静态密码。使用的命令如下。

openvpn --genkey --secret key

key的内容如下:

#

# 2048 bit OpenVPN static key

#

-----BEGIN OpenVPN Static key V1-----

8acc8d8feae2fc13ec66fac4eabc72b8

10fa75f239e8cd77d0cec0361dd77046

c6e757c9ed392410b6671899229983cc

6c85f9a3449ae6847fb569559bdebd93

bfecdf00bee63453e2cac80e4429e98d

3162eae826837836fe37959fd96040c4

445b568028e8cc251e557d3ce39b88e2

385af0b64bcb7860bc133859bcd9a8da

63f2729b1f5ebf003cb26005249dcf03

9fd37cba370af73be523ad549a3df6b5

b53f441e674f8e05201f051ce66f2f87

83c3c33fd29cf7bfb85be3370ee00c07

a8e7227e78557155fb365c812570d8bf

c0bf845a7c24abc262de77a68567d1b2

afc96447fcfc1e3286f18a22512abfa3

f68bcd0bfe892fa14848166bc1b36bac

-----END OpenVPN Static key V1-----

3)使用scp把该key文件传到对端a.b.c.239服务器上。

4)创建隧道。

在服务器x.y.z.28上执行以下命令。

openvpn --remote a.b.c.239--dev tun0 --ifconfig 10.6.0.1 10.6.0.2 --secret key --daemon

在对端服务器a.b.c.239上执行以下命令。

openvpn --remote x.y.z.28 --dev tun0 --ifconfig 10.6.0.2 10.6.0.1 --secret key --daemon

其中的关键配置项解释如下:

--remote,指定点到点架构中对端的公网IP。

--dev,指定使用tun设备。

--ifconfig,指定虚拟隧道的本端和远端IP地址。

--secret,指定包含静态密码的文件。

--daemon,指定使用后台驻守进程的模式。

执行步骤4后,两台服务器之间的虚拟专用网络如图3-2所示。

 image.png

图3-2 两台服务器间的虚拟专用网络

5)验证隧道功能。

在服务器x.y.z.28上执行以下命令。

ping 10.6.0.2 -c 2

在a.b.c.239使用tcpdump可以看到以下输出。

tcpdump -vvv -nnn -i tun0 icmp

tcpdump: listening on tun0, link-type RAW (Raw IP), capture size 65535 bytes

10:07:04.031236 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)

    10.6.0.1 > 10.6.0.2: ICMP echo request, id 26451, seq 1, length 64

10:07:04.031272 IP (tos 0x0, ttl 64, id 42617, offset 0, flags [none], proto ICMP (1), length 84)

    10.6.0.2 > 10.6.0.1: ICMP echo reply, id 26451, seq 1, length 64

10:07:05.032546 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)

    10.6.0.1 > 10.6.0.2: ICMP echo request, id 26451, seq 2, length 64

10:07:05.032565 IP (tos 0x0, ttl 64, id 42618, offset 0, flags [none], proto ICMP (1), length 84)

    10.6.0.2 > 10.6.0.1: ICMP echo reply, id 26451, seq 2, length 64

10:07:06.033775 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)

1)在这种点到点模式中,使用静态密码的方式时,--secret指定的key文件是需要进行严格保密的。

2)在这种点到点模式中,只能有两个端点参与。

3)点到点是最简单的部署方式。初步学习OpenVPN时,建议先了解该模式虚拟专用网络的构建方式。

tun和tap是Linux等操作系统中提供的一种虚拟网络设备。tun设备可以理解为Point-to-Point的设备;tap设备可以理解为Ethernet设备。

需要注意的是:tun/tap设备不是从物理网卡设备中读取包,而是从用户空间的程序中读取包;向该设备写入时,并不实际从物理网卡设备上发出包,而是由内核提交到应用程序。

讲起来比较难以理解,那么我们以本案例中的ping 10.6.0.2为例,对OpenVPN使用到的关键技术tun设备进行详细说明。

在服务器x.y.z.28上由用户使用BASH输入ping 10.6.0.2后,tun设备和内核、OpenVPN及物理网卡之间的工作流程如图3-3所示。

 image.png

图3-3 x.y.z.28上的tun设备工作流程图

详细说明如下:

1)用户使用BASH进程输入ping 10.6.0.2。此时,内核收到的IP包地址信息为:源地址10.6.0.1,目的地址10.6.0.2。

2)内核经过路由判断,把该IP包写入tun0设备(tun0的IP地址是10.6.0.1)。

3)OpenVPN进程读取该IP包。

4)OpenVPN对该包进行封装、加密后,向内核写入,此时IP包地址信息为:源地址x.y.z.28,目的地址a.b.c.239。1)中的包信息,含IP头部,被封装到该IP包内。

5)内核经过路由判断,把该包写入物理网卡(Physical NIC)。

6)物理网卡经过封装成帧(Frame)通过物理链路,经过互联网发送到a.b.c.239上。

服务器a.b.c.239收到经过互联网传输过来的数据时,它的工作流程如图3-4所示。

 image.png

图3-4 a.b.c.239的tun设备工作流程图

详细说明如下:

1)物理网卡收到帧(Frame)。

2)物理网卡将帧提交到内核。

3)OpenVPN读取该IP包后,经过解封装、解密,获得内容是ICMP的ping包,目的地址是tun0。

4)OpenVPN向tun0写入经过步骤3解封的ICMP包。

5)内核模块处理。

内核模块处理完成后,会发回ICMP请求响应。回包的流程与图3-3中所示的流程相同。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。