如何在Ubuntu 16.04上使用PeerVPN加密流量到Redis

Redis是一个开源的键值数据存储,使用具有可选磁盘写入的内存存储模型进行持久化。它具有事务,发布/订阅消息模式和自动故障切换等功能。 Redis有大多数语言的客户端...

介绍

Redis是一个开源的键值数据存储,使用具有可选磁盘写入的内存存储模型进行持久化。它具有事务,发布/订阅消息模式和自动故障转移等功能。Redis的客户端用大多数语言编写,推荐他们的网站 。 Redis不提供自己的任何加密功能。它的操作假设它已被部署到一个孤立的专用网络,只有信任方才能访问。如果您的环境不匹配该假设,您将必须单独加密Redis流量加密。 在本指南中,我们将演示如何通过一个称为PeerVPN的简单VPN程序路由它来加密Redis流量。服务器之间的所有流量可以通过VPN安全地路由。与一些解决方案不同,这为不绑定到特定端口或服务的一般服务器到服务器通信提供了灵活的解决方案。但是,为了本指南的目的,我们将重点介绍配置PeerVPN以确保Redis流量。我们将使用两个Ubuntu 16.04服务器来演示。

先决条件

要开始,你应该有一个非root用户sudo在每个机器的配置权限。 此外,本指南假设您有一个基本的防火墙。 您可以按照我们的Ubuntu 16.04服务器初始设置指南 ,以满足这些要求。 当您准备好继续,请按照下面。

什么是PeerVPN?

PeerVPN是一种非常简单的VPN技术,用于建立网状拓扑。这意味着没有中央服务器必须总是可用于仲裁节点之间的通信。这对于希望在不重新配置现有主机上的任何东西的情况下在各方之间建立可信环境的情况是理想的。节点之间的所有流量可以通过VPN加密,并且服务和防火墙可以配置为仅接受VPN接口的流量。 使用PeerVPN的一些优势是:
  • 简单直观的配置。与许多VPN不同,PeerVPN可以设置非常少的工作,它不需要中央服务器。
  • 加密网络通信的通用解决方案。不像有些隧道选项中,VPN提供任何流量的安全网络。加密通信只需配置一次即可由所有服务使用。
  • 服务器到服务器通信只需要一个连接。与隧道解决方案不同,两个Redis服务器只需要一个配置进行通信。
一些缺点是:
  • Ubuntu目前在默认存储库中没有用于PeerVPN的软件包。
  • 没有包含init脚本,因此必须创建一个脚本,以便在引导时自动创建必要的连接。
考虑到这些特性,让我们开始吧。

安装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
类型输入在此过程中接受的提示。 安装完成后,请测试您是否可以通过键入以下内容连接到本地Redis服务:
redis-cli ping
如果软件已安装并运行,您应该会看到:
PONG
让我们设置一个我们以后可以使用的密钥:
redis-cli set test 'success'
我们已经设定测试关键价值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。检查它是否等于或低于512字符产生输出wc (你可以在这个命令调整382影响输出长度):
openssl rand -base64 382 | tr -d '\n' | wc
      0       1     512
如果长度是正确的,去掉wc产生一个高熵加密。 我们将增加一个echo在最后摆在最后的新行:
openssl rand -base64 382 | tr -d '\n' && echo
您应该看到这样的事情(不要复制下面的值!):
ajHpYYMJYtv+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
其次,明确设置port的PeerVPN可以使用连接到同行,使我们可以轻松地调整我们的防火墙(我们将在本指南中使用7000)。 设置enabletunneling使这台机器是网络的积极参与。 设置网络的名称interface将在一样的工具显示ipifconfig
/etc/peervpn.conf
networkname RedisNet
psk your_generated_secret

port 7000
enabletunneling yes
interface peervpn0
你需要选择一个VPN网络规模和独特的VPN的IP地址分配给使用的每台服务器ifconfig4指令。 这是通过使用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
Active 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正在公共接口上侦听,但防火墙可能尚未配置为允许流量通过。我们需要允许流量到端口7000,其中PeerVPN正在侦听连接,以及来自10.8.0.0/24网络本身的流量:
sudo ufw allow 7000
sudo ufw allow from 10.8.0.0/24
这将打开访问在您的公共接口上的端口7000 PeerVPN正在侦听。它还将允许流量从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
Active 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服务器。 要做到这一点,在使用Redis的服务器的VPN的IP地址指向你的客户-h选项:
redis-cli -h 10.8.0.1 ping
PONG
查询我们在本指南开头设置的测试键:
redis-cli -p 8000 get test
"success"
这确认我们能够成功地到达远程数据库。

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

我们上面列举的例子使用了一个简单的例子,单个Redis服务器和单个客户端。然而,这可以容易地扩展以适应更复杂的相互作用。 由于PeerVPN使用网状网络,添加其他客户端或服务器很简单。新对等体应完成以下步骤:
  • 通过下载tarball,然后提取和分发文件来安装PeerVPN
  • 从其他服务器复制PeerVPN配置并调整这些指令:
    • ifconfig4应该VPN网络内被设置为一个未使用的IP地址
    • initpeers应指向的至少一个,但优选每一个现有的对等体
  • 将PeerVPN systemd单元文件复制到新客户端计算机
  • 启动PeerVPN服务并使其在引导时启动
  • 在防火墙中打开外部端口和VPN网络
  • (仅适用于Redis服务器)调整Redis配置以绑定到新的VPN接口

结论

Redis是一个强大而灵活的工具,对于许多部署是无价的。但是,在不安全的环境中运行Redis是一个巨大的责任,使您的服务器和数据容易受到攻击或盗窃。如果您没有仅由可信方填充的隔离网络,则通过其他方式确保流量至关重要。本指南中介绍的方法只是确保Redis各方之间通信的一种方法。其他选项包括配置与加密隧道安全通道spiped