返回介绍

最佳实践 54:使用 OpenVPN 创建 Peer-to-Peer 的 VPN

发布于 2025-04-20 17:44:46 字数 4817 浏览 0 评论 0 收藏

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

在这种情况下,使用 OpenVPN 来创建 Peer-to-Peer(点到点)的 VPN 的物理架构图如图 10-1 所示。

图 10-1 Peer-to-Peer 的 VPN 物理架构图

创建 Peer-to-Peer 的 VPN 的操作步骤如下。

步骤 1 在 2 台需要互联的服务器 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 指定 peer-to-peer 架构中,对端的公网 IP。

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

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

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

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

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

图 10-2 Peer-to-Peer 的 VPN 虚拟网络图

步骤 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)在这种 Peer-to-Peer 模式中,使用静态密码的方式时,--secret 指定的 key 文件是需要进行严格保密的。

2)在这种 Peer-to-Peer 模式中,只能有 2 个端点进行参与。

3)Peer-to-Peer 是最简单的部署方式。初步学习 OpenVPN 时,建议先了解该模式 VPN 的构建方式。

Linux tun 设备精讲

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 及物理网卡之间的工作流程如图 10-3 所示。

图 10-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 收到经过互联网传输过来的数据时,它的工作流程如图 10-4 所示。

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

下面进行详细说明。

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

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

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

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

5)内核模块处理。

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。