如何在Ubuntu16.04上使用PeerVPN加密到Redis的流量

来自菜鸟教程
跳转至:导航、​搜索

介绍

Redis 是一个开源的键值对数据存储,使用内存存储模型和可选的磁盘写入来实现持久性。 它具有事务、发布/订阅消息模式和自动故障转移等功能。 Redis 有用大多数语言编写的客户端, 他们的网站 上有推荐的客户端。

Redis 本身不提供任何加密功能。 它的运行假设是它已部署到一个隔离的专用网络,只有受信任的方可以访问。 如果您的环境不符合该假设,您将不得不单独将 Redis 流量包装在加密中。

在本指南中,我们将演示如何通过名为 PeerVPN 的简单 VPN 程序路由 Redis 流量来加密 Redis 流量。 服务器之间的所有流量都可以安全地通过 VPN 路由。 与某些解决方案不同,这为未绑定到特定端口或服务的通用服务器到服务器通信提供了灵活的解决方案。 但是,出于本指南的目的,我们将专注于配置 PeerVPN 以保护 Redis 流量。 我们将使用两台 Ubuntu 16.04 服务器进行演示。

先决条件

首先,您应该在每台机器上配置一个具有 sudo 权限的非 root 用户。 此外,本指南将假设您有一个基本的防火墙。 您可以按照我们的 Ubuntu 16.04 初始服务器设置指南 来满足这些要求。

当您准备好继续时,请按照以下说明进行操作。

什么是 PeerVPN?

PeerVPN 是一种非常简单的 VPN 技术,可建立网状拓扑。 这意味着没有中央服务器必须始终可用于仲裁节点之间的通信。 这非常适合您希望在各方之间建立可信环境而不在现有主机上重新配置任何内容的情况。 节点之间的所有流量都可以通过 VPN 加密,并且服务和防火墙都可以配置为仅接受 VPN 接口上的流量。

使用 PeerVPN 的一些优点是:

  • 简单直观的配置。 与许多 VPN 不同,PeerVPN 只需很少的工作即可设置,并且不需要中央服务器。
  • 用于加密网络通信的通用解决方案。 与某些隧道选项不同,VPN 为 any 流量提供安全网络。 加密通信只需配置一次并且可供所有服务使用。
  • 服务器到服务器的通信只需要一个连接。 与隧道解决方案不同,两台 Redis 服务器只需一项配置即可进行通信。

一些缺点是:

  • Ubuntu 目前在默认存储库中没有 PeerVPN 软件包。
  • 没有包含初始化脚本,因此必须创建一个以便在启动时自动创建必要的连接。

考虑到这些特征,让我们开始吧。

安装 Redis 服务器和客户端软件包

在开始之前,我们应该在一台机器上安装 Redis 服务器,在另一台机器上安装客户端包。 如果您已经配置了其中一项或两项,请随时跳过。

注意: Redis 服务器指令设置了一个测试密钥,稍后将用于测试连接。 如果您已经安装了 Redis 服务器,您可以继续设置此密钥或在我们测试连接时使用任何其他已知密钥。


安装 Redis 服务器

我们将使用 Chris Lea 的 Redis 服务器 PPA 来安装最新版本的 Redis。 使用第三方存储库时请务必小心。 在这种情况下,Chris Lea 是一个值得信赖的打包者,他为几个流行的开源项目维护高质量、最新的包。

添加 PPA 并在您的第一台计算机上安装 Redis 服务器软件,方法是键入:

sudo apt-add-repository ppa:chris-lea/redis-server
sudo apt-get update
sudo apt-get install redis-server

在此过程中输入 Enter 接受提示。

安装完成后,输入以下命令测试是否可以在本地连接到 Redis 服务:

redis-cli ping

如果软件已安装并正在运行,您应该会看到:

Redis server outputPONG

让我们设置一个稍后可以使用的密钥:

redis-cli set test 'success'

我们已将 test 键设置为值 success。 在配置 PeerVPN 后,我们将尝试从我们的客户端计算机访问此密钥。

安装 Redis 客户端

另一台 Ubuntu 16.04 机器将充当客户端。 我们需要的所有软件都可以在默认存储库的 redis-tools 包中找到:

sudo apt-get update
sudo apt-get install redis-tools

由于远程 Redis 服务器的默认配置和防火墙处于活动状态,我们目前无法连接到远程 Redis 实例进行测试。

在每台计算机上安装 PeerVPN

接下来,您需要在每个服务器和客户端上安装 PeerVPN。 如上所述,Ubuntu 目前不在其存储库中包含 PeerVPN 软件包。

幸运的是, 项目的网站下载 部分下包含了一个为 Linux 编译的二进制文件。 右键单击并复制该页面上静态链接的 Linux 二进制文件的链接,以确保您拥有最新版本。

在您的每台机器上,进入 /tmp 目录,然后使用 curl 下载您复制的链接:

cd /tmp
curl -LO https://peervpn.net/files/peervpn-0-044-linux-x86.tar.gz

通过键入以下内容提取下载的 tarball:

tar xzvf peervpn*

将二进制文件复制到 /usr/local/bin 目录,并将示例配置文件复制到 /etc 目录:

sudo cp /tmp/peervpn*/peervpn /usr/local/bin
sudo cp /tmp/peervpn*/peervpn.conf /etc

PeerVPN 现在已安装在系统上并可以使用。

配置 PeerVPN 网络

将可执行文件和配置文件放在适当的位置,我们可以在每台机器上配置 PeerVPN。

生成安全密钥

PeerVPN 使用最多 512 个字符的共享密钥对网络中的合法机器进行身份验证。 使用强值来保护网络流量的完整性非常重要。 由于这是一个共享密钥,我们只需要为我们的网络生成一个值(我们将使用 Redis 服务器机器来执行此操作,但您选择哪个并不重要)。

生成最大长度的强机密的一种简单方法是使用 OpenSSL。 使用 wc 检查它是否产生等于或低于 512 个字符的输出(您可以在此命令中调整 382 以影响输出长度):

openssl rand -base64 382 | tr -d '\n' | wc
Redis server output      0       1     512

如果长度正确,去掉wc,生成高熵秘密。 我们将在末尾添加一个 echo 以放入最后的新行:

openssl rand -base64 382 | tr -d '\n' && echo

您应该会看到类似 的内容(不要复制以下值!)

Redis server outputajHpYYMJYtv+m0K6yZbYmk8npPujlcv9QDozQZ06ucV2gsHoMGqyfd50X8OnY6hicj5iFNjDN/9QVTB3nhMOV2ufU/kfWCbtskUuk1zHWYZsvy71KnLRhA8W8dnu+NEKdIh28H2qUsiay7On5kOZPcrONvv/pHHYbxmFI2G9TyYT+CZWIAxUV/vUWl41VycjASmZYaSI6lWgYONopncNfDF5Z6oznPH8ge6sQsszbe1ZjNqLRUrx/jgL3fy7SXSLCIrsSuifBv/pb36d9/y+YPZEbxsMInoK5QEWrpIf/xjbMFlndtGc20olhh05h66qz/GiimLMivrN8g+PibVaBRUmWav/pngUvKYsEEPSc0wrr5ZuvpvBGTTKqPdR+soCnd/iWPzmwRBW56vBGxed3GNbkgmjDpTSnvNEN+gKPt07drHSbGqfFbdMdsKbjE+IWiqiVO1aviJsNpMhBO/o9uIcKxPmuze6loZKTh7/qjJuY62E//SsgFzDHDhP2w==

复制您生成的输出,以便您可以在 PeerVPN 配置中使用它。

定义 PeerVPN 配置

要配置 PeerVPN,请打开每台服务器上的 /etc/peervpn.conf 文件:

sudo nano /etc/peervpn.conf

在里面,您会发现描述每个配置选项的注释。 随意阅读这些以熟悉可用的设置。 我们的配置将非常简单。 您可以将配置行添加到文件顶部,也可以在整个文件的注释中查找、取消注释并定义适当的行。

首先设置 networknamepsk,在您的 VPN 中的每台机器上都必须相同。 网络名称是这个特定网络的任意标识符,而 psk 是前面提到的共享密钥:

/etc/peervpn.conf

networkname RedisNet
psk your_generated_secret

接下来,明确设置 PeerVPN 可以用来连接对等点的 port,以便我们可以轻松调整防火墙(我们将在本指南中使用 7000)。 设置 enabletunneling 使本机成为网络的活动部分。 为网络 interface 设置一个名称,该名称将显示在 ipifconfig 等工具中。

/etc/peervpn.conf

networkname RedisNet
psk your_generated_secret

port 7000
enabletunneling yes
interface peervpn0

您需要选择一个 VPN 网络大小,并使用 ifconfig4 指令为每个服务器分配一个唯一的 VPN IP 地址。 这是使用 CIDR 表示法 完成的。 我们将 VPN 网络定义为 10.8.0.0/24。 这将为我们提供 254 个潜在地址(比我们需要的多得多),所有地址都从 10.8.0 开始。 由于每个地址必须是唯一的,我们将使用:

  • 10.8.0.1/24 用于我们的 Redis 服务器
  • 10.8.0.2/24 用于我们的客户端服务器

最后,使用 initpeers 指定将在网络中的其他服务器。 由于 PeerVPN 不使用集中管理服务器,因此在初始化期间将联系这些主机以加入 VPN 网络。 连接后,服务器将自动接收有关网络上任何其他对等点的信息。

应使用其公共 IP 地址( 而非 在 PeerVPN 配置中分配的 VPN IP 地址)和 PeerVPN 侦听端口指定对等方。 可以在同一行上指定其他对等点,也可以用空格分隔(查看文件中的注释以获取示例):

/etc/peervpn.conf

networkname RedisNet<^>
psk your_generated_secret

port 7000
enabletunneling yes
interface peervpn0

# Increment the IP address below for each additional server
# For example, the second node on the network could be 10.8.0.2/24
ifconfig4 10.8.0.1/24
initpeers other_server_public_IP 7000

完成后保存并关闭文件。 你的两台机器应该有非常相似的配置文件,只是 ifconfig4initpeers 值不同。

为 PeerVPN 创建一个 systemd 单元文件

为了将 PeerVPN 作为服务进行管理并在启动时启动我们的网络,我们将创建一个 systemd 单元文件。 在每台机器的/etc/systemd/system目录下打开一个新的单元文件开始:

sudo nano /etc/systemd/system/peervpn.service

在里面,创建一个 [Unit] 部分来描述单元并建立顺序,以便在网络可用后启动这个单元:

/etc/systemd/system/peervpn.service

[Unit]
Description=PeerVPN network service
Wants=network-online.target
After=network-online.target

接下来,打开 [Service] 部分以定义要运行的实际命令。 在这里,我们只需要使用 ExecStart 调用 peervpn 二进制文件并将其指向我们创建的配置文件:

/etc/systemd/system/peervpn.service

[Unit]
Description=PeerVPN network service
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/local/bin/peervpn /etc/peervpn.conf

最后,我们将包含一个 [Install] 部分来告诉 systemd 如果启用,何时自动启动该单元:

/etc/systemd/system/peervpn.service

[Unit]
Description=PeerVPN network service
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/local/bin/peervpn /etc/peervpn.conf

[Install]
WantedBy=multi-user.target

完成后,保存并关闭文件。

启动PeerVPN服务并调整防火墙

通过键入以下命令在两台机器上启动并启用新的 peervpn 单元:

sudo systemctl start peervpn.service
sudo systemctl enable peervpn.service

如果您检查服务器上侦听连接的服务,您应该看到 PeerVPN 在端口 7000 上侦听 IPv4 和 IPv6 接口(如果可用):

sudo netstat -plunt
OutputActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      2662/redis-server 1
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1724/sshd       
tcp6       0      0 :::22                   :::*                    LISTEN      1724/sshd       
udp        0      0 0.0.0.0:7000            0.0.0.0:*                           4609/peervpn    
udp6       0      0 :::7000                 :::*                                4609/peervpn

尽管 PeerVPN 正在侦听公共接口,但防火墙可能尚未配置为允许流量通过。 我们需要允许流量到 PeerVPN 正在侦听连接的端口 7000,以及来自 10.8.0.0/24 网络本身的流量:

sudo ufw allow 7000
sudo ufw allow from 10.8.0.0/24

这将打开对 PeerVPN 正在侦听的公共接口上的端口 7000 的访问。 它还将允许流量从 VPN 自由流动。

检查您是否可以使用 VPN IP 地址访问您的其他服务器。 例如,在您的 Redis 服务器上,您可以键入:

ping 10.8.0.2

您应该能够毫无问题地连接。

调整 Redis 服务器设置

现在,VPN 已经设置好了,我们需要调整 Redis 正在监听的接口。 默认情况下,Redis 只绑定到本地接口。

在 Redis 服务器上打开 Redis 配置文件:

sudo nano /etc/redis/redis.conf

在里面,搜索 bind 指令,当前应该设置为 127.0.0.1。 将 Redis 服务器的 VPN IP 地址附加到末尾:

/etc/redis/redis.conf

. . .
bind 127.0.0.1 10.8.0.1
. . .

完成后保存并关闭文件。

现在,通过键入以下命令重新启动 Redis 服务:

sudo systemctl restart redis-server.service

Redis 服务现在应该可用于来自 VPN 对等点的连接。 您可以通过重新检查侦听端口来验证这一点:

sudo netstat -plunt
Redis server outputActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 10.8.0.1:6379           0.0.0.0:*               LISTEN      4767/redis-server 1
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      4767/redis-server 1
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1724/sshd       
tcp6       0      0 :::22                   :::*                    LISTEN      1724/sshd       
udp        0      0 0.0.0.0:7000            0.0.0.0:*                           4609/peervpn    
udp6       0      0 :::7000                 :::*                                4609/peervpn

您可以在此示例的第一行中看到 Redis 现在正在侦听 VPN 接口。

从 Redis 客户端测试连接

在 VPN 运行和 Redis 在 VPN 网络上侦听的情况下,我们可以测试以确保我们的 Redis 客户端机器可以访问 Redis 服务器。

为此,请使用 -h 选项将您的客户端指向 Redis 服务器的 VPN IP 地址:

redis-cli -h 10.8.0.1 ping
Redis client outputPONG

查询我们在本指南开头设置的测试密钥:

redis-cli -h 10.8.0.1 get test
Redis client output"success"

这确认我们能够成功访问远程数据库。

将上述示例扩展为多客户端和服务器到服务器通信

我们上面概述的示例使用了单个 Redis 服务器和单个客户端的简单示例。 然而,这可以很容易地扩展以适应更复杂的交互。

由于 PeerVPN 使用网状网络,因此添加额外的客户端或服务器很简单。 新对等体应完成以下步骤:

  • 通过下载 tarball 然后解压缩和分发文件来安装 PeerVPN
  • 从其他服务器复制 PeerVPN 配置并调整这些指令:
    • ifconfig4 应设置为 VPN 网络中未使用的 IP 地址
    • initpeers 应该指向至少一个,但最好是每个现有的对等点
  • 将 PeerVPN systemd 单元文件复制到新的客户端计算机
  • 启动 PeerVPN 服务并使其在启动时启动
  • 在防火墙中打开外部端口和 VPN 网络
  • (仅适用于 Redis 服务器)调整 Redis 配置以绑定到新的 VPN 接口

结论

Redis 是一个功能强大且灵活的工具,对于许多部署来说都是无价的。 但是,在不安全的环境中运行 Redis 是一项巨大的责任,会使您的服务器和数据容易受到攻击或盗窃。 如果您没有仅由受信任方组成的隔离网络,则必须通过其他方式保护流量。 本指南中概述的方法只是保护 Redis 各方之间通信的一种方法。 其他选项包括使用 stunnelspiped 配置加密隧道。