《Linux系统安全:纵深防御、安全扫描与入侵检测 》 —3.3 使用OpenVPN创建点到点的虚拟专用网络
3.3 使用OpenVPN创建点到点的虚拟专用网络
在某些运维场景中,我们会遇到只需要把两台处于Internet上的服务器使用虚拟专用网络互联起来的需求,比如远程的SNMP信息抓取、远程数据库备份等。
在这种情况下,我们可以使用OpenVPN来创建点到点(Peer-to-Peer)的虚拟专用网络的物理架构,如图3-1所示。
图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所示。
图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所示。
图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所示。
图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中所示的流程相同。
- 点赞
- 收藏
- 关注作者
评论(0)