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

介绍

Redis是一个开源的关键值数据存储,使用内存存储模型,可选为持久性写磁盘。它具有交易、 pub/sub 消息模式和自动故障转换等功能。

Redis 不提供任何加密功能,它假定它已部署在一个孤立的私人网络中,只有受信任的方可访问。

在此指南中,我们将演示如何通过一个名为PereVPN的简单的VPN程序来加密Redis流量. 服务器之间的所有流量都可以安全地通过VPN. 与一些解决方案不同,这为一般的服务器到服务器的通信提供了灵活的解决办法,这些通信不受特定端口或服务的约束. 然而,为了本指南的目的,我们将侧重于配置PeerVPN,以确保Redis的交通. 我们将使用两台Ubuntu 16.04服务器进行演示.

前提条件

要开始,你应该有一个非根用户,每个机器上都配置了sudo权限。 此外,本指南将假定你有一个基本的防火墙,你可以遵循我们的Ubuntu 16.04初始服务器设置指南(https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-16-04)来满足这些要求。

当你准备好继续时,继续下方。

什么是PeerVPN?

PeerVPN是一种非常简单的VPN技术,它建立了网状地貌. 这意味着没有中央服务器可以总是用来仲裁节点之间的通信. 这对于您想要在缔约方之间建立一种信任的环境而不对现有主机进行重新配置的情况来说是理想的. 所有节点之间的流量都可以通过VPN加密,服务与防火墙都可以被配置,只接受VPN接口的流量.

使用PeerVPN的一些优点是:

  • 简单而直观的配置。 与许多VPN不同,PeerVPN的设置工作很少,也不需要中央服务器.
  • 加密网络通信的通用解决方案。 与一些地道方案不同,VPN为_Any_流量提供了安全网络. 加密通信只需配置一次,所有服务都可以使用。
  • 联合国 服务器对服务器的通信只需要单一的连接. 与隧道解决方案不同,两台Redis服务器通信只需要一个配置. .

一些缺点是:

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

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

安装 Redis 服务器和客户端包

在我们开始之前,我们应该在一台机器上安装 Redis 服务器和在另一台机器上提供客户端包。

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

安装 Redis 服务器

我們將使用 Chris Lea 的 Redis 伺服器 PPA來安裝最新版本的 Redis. 在使用第三方儲存庫時,總是要小心。

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

1[environment third]
2sudo apt-add-repository ppa:chris-lea/redis-server
3sudo apt-get update
4sudo apt-get install redis-server

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

安装完成后,测试您可以通过键入本地连接到 Redis 服务:

1[environment third]
2redis-cli ping

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

1[environment third]
2[secondary_label Redis server output]
3PONG

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

1[environment third]
2redis-cli set test 'success'

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

安装 Redis 客户端

另一个Ubuntu 16.04 机器将作为客户端运作,我们所需要的所有软件都可在默认存储库中的redis-tools包中使用:

1[environment second]
2sudo apt-get update
3sudo apt-get install redis-tools

随着远程 Redis 服务器的默认配置和启用防火墙,我们目前无法连接到远程 Redis 实例进行测试。

在每个计算机上安装PeerVPN

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

幸运的是,该项目的网站(https://peervpn.net/)包含一个为Linux编译的二进制文件,在下载部分中。

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

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

通过键入提取下载的 tarball:

1tar xzvf peervpn*

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

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

PeerVPN现在已安装在系统上,并准备好使用。

配置 PeerVPN 网络

有了可执行和配置文件,我们可以在每个机器上配置PeerVPN。

生成安全秘密密钥

PeerVPN 使用多达 512 个字符的共享秘密来验证合法机器进入网络. 使用强有力的价值观来保护网络流量的完整性很重要. 因为这是一个共享的秘密,我们只需要为我们的网络产生一个值(我们将使用 Redis 服务器机器来做到这一点,但无论您选择哪个)。

一个简单的方法来生成强大的最大长度秘密是使用OpenSSL。 检查它是否以wc生成512个字符或以下的输出(您可以调整这个命令中的382来影响输出长度):

1[environment third]
2openssl rand -base64 382 | tr -d '\n' | wc
1[environment third]
2[secondary_label Redis server output]
3      0 1 512

如果长度是正确的,删除wc来生成一个高 entropy 秘密. 我们将在末尾添加一个Echo来插入一个最终的新行:

1[environment third]
2openssl rand -base64 382 | tr -d '\n' && echo

你应该看到这样的东西 (不要复制下面的值!) :

1[environment third]
2[secondary_label Redis server output]
3ajHpYYMJYtv+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 文件:

1sudo nano /etc/peervpn.conf

内部,你会发现描述每个配置选项的评论. 请自由阅读这些以熟悉可用的设置. 我们的配置将是非常简单的. 您可以添加配置行到文件的顶部或找到,不评论,并在整个文件的评论中定义相应的行。

首先,设置网络名称psk,它们在您的VPN中的每个机器上都必须相同。

1[label /etc/peervpn.conf]
2networkname RedisNet
3psk your_generated_secret

接下来,明确设置PeerVPN可以使用的端口,以便我们可以轻松调整我们的防火墙(我们将在本指南中使用7000)。

1[label /etc/peervpn.conf]
2networkname RedisNet
3psk your_generated_secret
4
5port 7000
6enabletunneling yes
7interface peervpn0

您需要选择一个VPN网络大小,并使用ifconfig4指令为每个服务器分配一个独特的VPN IP地址。 这是通过使用CIDR符号(https://andsky.com/tech/tutorials/understanding-ip-addresses-subnets-and-cidr-notation-for-networking)进行的。 我们将VPN网络定义为10.8.0.0/24. 这将给我们254个潜在的地址(比我们需要的要多),所有这些都从10.8.0开始。 由于每个地址必须是独一无二的,我们将使用:

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

最后,使用initpeers来指定其他服务器将在网络中。由于PeerVPN不使用集中管理服务器,这些主机将在初始化过程中被联系,以便加入VPN网络。

Peer 应该使用他们的公共 IP 地址(不是 在 PeerVPN 配置中分配的 VPN IP 地址)和 PeerVPN 倾听端口来指定。

 1[label /etc/peervpn.conf]
 2networkname RedisNet
 3psk your_generated_secret
 4
 5port 7000
 6enabletunneling yes
 7interface peervpn0
 8
 9# Increment the IP address below for each additional server
10# For example, the second node on the network could be 10.8.0.2/24
11ifconfig4 10.8.0.1/24
12initpeers other_server_public_IP 7000

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

创建 PeerVPN 的 systemd 单元文件

为了管理 PeerVPN 作为服务并启动我们的网络,我们将创建一个 systemd 单元文件。

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

内部,创建一个[单位]部分来描述该单位并建立排序,以便该单位在可用后启动网络:

1[label /etc/systemd/system/peervpn.service]
2[Unit]
3Description=PeerVPN network service
4Wants=network-online.target
5After=network-online.target

在这里,我们只需要使用ExecStart来调用peervpn二进制并指向我们创建的配置文件:

1[label /etc/systemd/system/peervpn.service]
2[Unit]
3Description=PeerVPN network service
4Wants=network-online.target
5After=network-online.target
6
7[Service]
8ExecStart=/usr/local/bin/peervpn /etc/peervpn.conf

最后,我们将包括一个[安装]部分,以告诉系统d在启用时何时自动启动设备:

 1[label /etc/systemd/system/peervpn.service]
 2[Unit]
 3Description=PeerVPN network service
 4Wants=network-online.target
 5After=network-online.target
 6
 7[Service]
 8ExecStart=/usr/local/bin/peervpn /etc/peervpn.conf
 9
10[Install]
11WantedBy=multi-user.target

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

启动PeerVPN服务并调整防火墙

在两台机器上启动并启用新的peervpn单元,键入:

1sudo systemctl start peervpn.service
2sudo systemctl enable peervpn.service

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

1sudo netstat -plunt
1[secondary_label Output]
2Active Internet connections (only servers)
3Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
4tcp 0 0 127.0.0.1:6379 0.0.0.0:*               LISTEN 2662/redis-server 1
5tcp 0 0 0.0.0.0:22 0.0.0.0:*               LISTEN 1724/sshd       
6tcp6 0 0 :::22                   :::*                    LISTEN 1724/sshd       
7udp 0 0 0.0.0.0:7000 0.0.0.0:*                           4609/peervpn    
8udp6 0 0 :::7000                 :::*                                4609/peervpn

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

1sudo ufw allow 7000
2sudo ufw allow from 10.8.0.0/24

这将打开您在PeerVPN正在收听的公共界面上的7000端口,还将允许流量从VPN自由流动。

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

1[environment third]
2ping 10.8.0.2

你应该能够连接无问题。

调整 Redis 服务器设置

现在,VPN已经设置了,我们需要调整Redis正在收听的界面.默认情况下,Redis只与本地界面结合。

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

1[environment third]
2sudo nano /etc/redis/redis.conf

内部,搜索绑定指令,目前应该设置为 127.0.0.1。

1[environment third]
2[label /etc/redis/redis.conf]
3. . .
4bind 127.0.0.1 10.8.0.1
5. . .

保存并关闭文件,当你完成。

现在,通过键入重新启动 Redis 服务:

1[environment third]
2sudo systemctl restart redis-server.service

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

1[environment third]
2sudo netstat -plunt
 1[environment third]
 2[secondary_label Redis server output]
 3Active Internet connections (only servers)
 4Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
 5tcp 0 0 10.8.0.1:6379 0.0.0.0:*               LISTEN 4767/redis-server 1
 6tcp 0 0 127.0.0.1:6379 0.0.0.0:*               LISTEN 4767/redis-server 1
 7tcp 0 0 0.0.0.0:22 0.0.0.0:*               LISTEN 1724/sshd       
 8tcp6 0 0 :::22                   :::*                    LISTEN 1724/sshd       
 9udp 0 0 0.0.0.0:7000 0.0.0.0:*                           4609/peervpn    
10udp6 0 0 :::7000                 :::*                                4609/peervpn

在这个例子中,你可以看到,Redis现在正在倾听VPN界面。

从Redis客户端测试连接

随着VPN运行并在VPN网络上收听Redis,我们可以测试以确保我们的Redis客户端机器可以访问Redis服务器。

要做到这一点,请使用 -h 选项将客户端指向 Redis 服务器的 VPN IP 地址:

1[environment second]
2redis-cli -h 10.8.0.1 ping
1[environment second]
2[secondary_label Redis client output]
3PONG

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

1[environment second]
2redis-cli -h 10.8.0.1 get test
1[environment second]
2[secondary_label Redis client output]
3"success"

这证实我们能够成功访问远程数据库。

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

我们上面描述的例子使用了一个简单的例子,一个单一的Redis服务器和一个单一的客户端,但是,这可以很容易地扩展到更复杂的交互。

由于PeerVPN使用网格网络,添加额外的客户端或服务器很简单。

  • 通过下载柏油球并提取和分发文件来安装PeerVPN
  • 联合国 从其他服务器复制 PereVPN 配置并调整这些指令 :
  • " 如果配置4 " 应设定为VPN网络内未使用的IP地址
  • " 商人 " 应至少指一个,但最好是每个现有的同行
  • 联合国 将 PeerVPN 系统单元文件复制到新的客户端机
  • 启动PeerVPN服务并使其能够启动
  • 联合国 在防火墙中打开外部端口和 VPN 网络 *(仅用于Redis服务器) 调整 Redis 配置以绑定到新的 VPN 接口

结论

Redis是一个强大而灵活的工具,对许多部署都非常宝贵. 然而,在不安全的环境中运行Redis是一个巨大的责任,使你的服务器和数据容易受到攻击或被窃取. 若您没有仅由信任方组成的孤立网络, 本指南中概述的方法只是确保Redis当事人之间通信的一种方式. 其他选项包括将加密隧道配置为 [stunnel] (https://andsky.com/tech/tutorials/how-to-encrypt-traffic-to-redis-with-stunnel-on-ubuntu-16-04) 或 [spiped (https://andsky.com/tech/tutorials/how-to-encrypt-traffic-to-redis-with-spiped-on-ubuntu-16-04).

Published At
Categories with 技术
comments powered by Disqus