如何使用OpenVPN保护VPS之间的流量
介绍
OpenVPN 是确保流量不被窃听的绝佳工具。 您可以使用它来确保从笔记本电脑到 DigitalOcean VPS(droplet)以及云服务器之间的安全连接。 您也可以同时完成两者。
这不是一套万无一失的、明确的、绝对安全的、生命依赖的指令集。 我们将在这里采取三个捷径,在我看来,这是易用性和安全性之间的合理权衡,但即使您遵循这些说明,我和 DigitalOcean 也不能对您的 VPS 的安全性负责。
引用一位密码学摇滚明星的话,“你必须知道从构思到安装的每一步你在做什么。” — Bruce Schneier
本文旨在帮助您开始设置虚拟专用网络。 你被警告了。 我'将在附录1中指出所采用的快捷方式和避免使用这些快捷方式的一般顺序。
如果您只想让两台云服务器相互连接,您可能希望找到一个更简单(但安全性较低)的 教程 — 尽管这是在易于设置和安全性之间的良好折衷。
笔记: 本教程涵盖 IPv4 安全性。 在 Linux 中,IPv6 的安全性与 IPv4 分开维护。 例如,“iptables”仅维护 IPv4 地址的防火墙规则,但它有一个称为“ip6tables”的 IPv6 对应项,可用于维护 IPv6 网络地址的防火墙规则。
如果您的 VPS 配置为 IPv6,请记住使用适当的工具保护您的 IPv4 和 IPv6 网络接口。 有关 IPv6 工具的更多信息,请参阅本指南:如何配置工具以在 Linux VPS 上使用 IPv6
入门
对于这个 OpenVPN 设置,您至少需要两个 Droplet 或 VPS,并且无需进行重大修改即可达到 60 VPS 左右。 所以要开始,创建两个液滴。 对于本教程的其余部分,我 ' 将它们称为 Droplet 1 和 Droplet 2。
在液滴 1 上
• 使用 Ubuntu 13.04 x32 创建 Droplet。
这应该在 DigitalOcean 提供的任何版本的 Ubuntu 上无需修改即可工作,但仅在 13.04 上进行了测试。
通过安全外壳连接到 VPS。 我们将更新软件包并安装一些东西。
aptitude update && aptitude dist-upgrade -y && aptitude install openvpn firehol -y && reboot
请注意,如果您的 shell 在此期间变为紫色,只需选择两次“Install Package Maintainer's Version”。
同时,在 Droplet 2
• 使用 Ubuntu 13.04 x32 创建 Droplet。
同样,这应该适用于任何版本的 Ubuntu。
通过安全外壳连接到 VPS。 我们将在安装一些东西时更新软件包。
aptitude update && aptitude dist-upgrade -y && aptitude install openvpn -y && reboot
同样,如果您的外壳在此期间变为紫色,只需选择“安装包维护者的版本”两次。
生成密钥
密钥生成将仅在 Droplet 1 上完成。 在 shell 中键入以下命令:
cd /etc/openvpn/ mkdir easy-rsa cd easy-rsa cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/* .
接下来,我们将输入一些预设,这将大大加快密钥生成过程。 键入以下命令:
nano /etc/openvpn/easy-rsa/vars
继续并编辑以下值(您只需要对这些值进行操作,尽管还有几个):
- KEY_COUNTRY
- KEY_PROVINCE
- KEY_CITY
- KEY_ORG and
- KEY_EMAIL
您可以将 KEY_SIZE 调整为 2048 或更高以增加保护。
使用 Control-O、Enter 和 Control-X 保存并退出。
创建证书颁发机构证书和密钥
接下来,键入以下命令:
source vars ./clean-all ./build-ca
您应该可以通过所有问题按 Enter 键。
注意:如果您必须返回并创建更多密钥,您 ' 需要重新键入 source vars 但 don't 键入 ./clean- all 或您' 将删除您的证书颁发机构,从而破坏您的整个 VPN 设置。
创建服务器证书和密钥
使用以下命令生成服务器证书和密钥:
./build-key-server server
您应该能够在默认值上按 Enter,但请确保证书的公用名是“服务器”。
它会要求您添加密码短语,但只需按 Enter 即可,无需输入密码。
当它询问您“签署证书?”时,输入 y 并按 Enter。
当它显示“1 个证书请求中的 1 个已通过认证,提交?”时,键入 y 并按 Enter。
生成客户端密钥
接下来是为客户端生成证书和密钥。 出于安全目的,每个客户端都将获得自己的证书和密钥。
我将第一个客户端命名为“client1”,因此如果您更改它,您将不得不在以后对其进行多次调整。 所以输入以下内容:
./build-key client1
与服务器密钥一样,当它询问您“签署证书?”时,键入 y 并按 Enter。
当它显示“1 个证书请求中的 1 个已通过认证,提交?”时,键入 y 并按 Enter。
继续为您需要的尽可能多的客户重复此操作。 您也可以稍后再回来(尽管如果这样做,请记住再次“source var”)。
生成 Diffie-Hellman 参数
这在身份验证后用于确定加密参数。 只需键入以下行:
./build-dh
将密钥复制到位
接下来,我们将各种密钥和证书复制到云服务器上:
cd /etc/openvpn/easy-rsa/keys cp ca.crt dh1024.pem server.crt server.key /etc/openvpn
确保密钥安全非常重要。 仔细检查是否只有 root 具有读取权限。 所以输入:
ls -lah /etc/openvpn
您' 正在寻找的是 server.key 具有 -rw------- 权限(所有者为读/写,组为无,无每个人)。 如果您需要更改它,请使用以下命令:
chmod 600 /etc/openvpn/server.key
分发客户端证书和密钥
下表显示了哪些文件进入哪个客户端。
客户1 | 客户2 |
---|---|
ca.crt | ca.crt |
客户端1.crt | 客户端2.crt |
client1.key (SECRET) | client2.key (SECRET) |
我们将使用安全副本将文件安全地复制到第二个 VPS。 (您也可以 cat,然后在 SSH 窗口中复制和粘贴。 但这是一种安全复制文件的好方法。)
在液滴 1 上
使用以下命令生成 SSH 密钥:
ssh-keygen -t rsa
它将选择一个默认文件名,然后要求您提供一个安全密码,您应该设置该密码。 找到刚刚生成的 SSH 公钥并输入:
cat ~/.ssh/id_rsa.pub
将结果复制到剪贴板。 这是几行字母和数字,看起来像:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCo249TgbI1gYP42RbLcDhsNN28r/fNT6ljdFOZxhk+05UAPhxq8bASaqSXZI3K8EEI3wSpigaceNUu65pxLEsZWS8xTtjY4AVxZU2w8GIlnFDSQYr3M2A77ZAq5DqyhGmnnB3cPsIJi5Q6JQNaQ/Meg1v7mYR9prfEENJeXrDiXjxUqi41NlVdb5ZQnPL1EdKM+KN/EPjiTD5XY1q4ICmLJUB8RkffHwH2knEcBoSZW2cNADpMu/IqtxTZpFL0I1eIEtoCWg4mGIdIo8Dj/nzjheFjavDhiqvUEImt1vWFPxHEXt79Iap/VQp/yc80fhr2UqXmxOa0XS7oSGGfFuXz root@openvpn1
但是使用你自己的,而不是我的。 您的 id_rsa.pub 不需要保持安全,但如果您使用上面的密钥,那将允许我访问您的 VPS。
同时,在 Droplet 2
cd ~/.ssh
(如果出现错误,请使用 mkdir ~/.ssh
创建文件夹)。
nano authorized_keys
将剪贴板中的公钥粘贴到新行上,然后使用 Control-O、Enter、Control-X 保存并退出。
返回液滴 1
接下来,我们将适当的密钥复制到第二台服务器上:
scp /etc/openvpn/easy-rsa/keys/ca.crt \ /etc/openvpn/easy-rsa/keys/client1.crt \ /etc/openvpn/easy-rsa/keys/client1.key \ root@droplet2ip:~/
它会问你“你确定要继续连接(是/否)吗?”,所以输入 yes 并按 Enter。
然后输入您刚刚创建的密码。
再次切换到 Droplet 2
接下来,我们将证书和密钥移动到它们的最终位置:
cd ~ mv ca.crt client1.crt client1.key /etc/openvpn ls -l /etc/openvpn
由于密钥必须保持安全,让's 确保client1.key 具有正确的权限(-rw-------)。
同样,如果需要,可以使用以下命令重置权限:
chmod 600 /etc/openvpn/client1.key
联网
接下来是在 VPN 上联网的兴奋。 您可以通过路由或桥接来使用 OpenVPN。 如果您知道区别是什么,则不需要我的帮助选择。 对于本教程,我们将使用路由。 我们'还将使用OpenVPN'的默认网络范围,即10.8.0.0/24。 除非您已经在某处使用此网络范围,否则这将很好。 如果您确实需要不同的范围,请选择一个私有范围并确保相应地调整所有后续配置步骤。
液滴 1
在 OpenVPN 服务器上,我们还需要配置路由并设置防火墙。 我使用一个名为 firehol 的工具来配置 iptables,这使得设置复杂的防火墙变得非常简单。 因此,键入以下命令:
nano /etc/firehol/firehol.conf
虽然我们可以允许来自任何地址的传入 OpenVPN 连接,但我们会将这些连接限制为您要连接的计算机的 IP 地址。 立即列出您的 IP 地址。
注意:以下配置仅允许传入的 SSH 和 OpenVPN 连接。 如果您有其他服务需要接收传入连接,则需要修改防火墙以支持这些服务。
version 5 interface eth0 inet client all accept // allow all outgoing connections server ssh accept // allow all incoming SSH connections server openvpn accept src "1.2.3.4 2.3.4.5" // allow incoming OpenVPN connections // from these designated addresses // NOTE: EDIT THESE ADDRESSES interface tun0 vpn server all accept // allow all incoming connections on the VPN client all accept // allow all outgoing connections on the router inet2vpn inface eth0 outface tun0 route all accept // route freely to the VPN router vpn2inet inface tun0 outface eth0 masquerade // use NAT masquerading from the VPN route all accept // route freely to the VPN
然后,使用以下命令启动防火墙:
firehol start
如果您的防火墙有问题,您可以重新启动您的 VPS,防火墙配置将被清除。 要使防火墙永久化,请输入以下内容:
nano /etc/default/firehol
找到以下行:
START_FIREHOL=NO
现在,将 NO 更改为 YES。 使用 Control-O、Enter、Control-X 保存并退出。
OpenVPN 服务器配置文件
在液滴 1 上
下一步是将示例服务器配置复制到位并根据我们的需要对其进行编辑。
cd /etc/openvpn cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz . gunzip server.conf.gz nano /etc/openvpn/server.conf
OpenVPN 服务器将以 root 身份启动,但我们可以将其设置为启动后降低权限,这是一个很好的安全措施。 要进行配置,请找到以下行并通过删除分号取消注释:
;user nobody ;group nogroup
如果您有多个应该相互通信的服务器,请找到以下行并删除分号:
;client-to-client
如果您增加了 DH 密钥的密钥大小,请找到以下行:
dh dh1024.pem
并将 1024 更改为 2048(或您选择的任何数字)。
我们将从 OpenVPN 服务器分配不同的客户端静态 IP 地址,为此,请取消注释以下行:
;client-config-dir ccd
使用 Control-O、Enter、Control-X 保存。 接下来,制作客户端配置目录:
mkdir /etc/openvpn/ccd
我们将在这里为第一个客户端添加配置:
nano /etc/openvpn/ccd/client1
键入以下命令,将 client1 分配给 IP 地址 10.8.0.5:
ifconfig-push 10.8.0.5 10.8.0.6
使用 Control-O、Enter、Control-X 保存并退出。
出于需要深入了解网络知识才能理解的原因,请为其他客户端使用以下地址:
/etc/openvpn/ccd/client2 ifconfig-push 10.8.0.9 10.8.0.10
/etc/openvpn/ccd/client3: ifconfig-push 10.8.0.13 10.8.0.14
简单地说,为每个新集的每个 IP 添加 4 个。 附录 2 中提供了更技术性的解释。
现在我们可以使用以下命令启动 OpenVPN 服务器:
service openvpn start
稍等片刻,然后键入以下命令以确保 OpenVPN 正在运行:
ifconfig
在网络接口中,您应该看到接口 tun0 如下所示:
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:140 errors:0 dropped:0 overruns:0 frame:0 TX packets:149 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:13552 (13.5 KB) TX bytes:14668 (14.6 KB)
您还可以键入:
service openvpn status
如果 OpenVPN 正在运行,您将看到以下内容:
* VPN 'server' is running
如果这两个都正常,那么服务器已经启动并正在运行,接下来我们将配置客户端连接。
OpenVPN 客户端配置文件
在液滴 2
首先,让我们将示例客户端配置文件复制到适当的位置:
cd /etc/openvpn cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf .
它主要是配置的,但我们必须“告诉”我们的 OpenVPN 服务器 Droplet 1 的地址:
nano /etc/openvpn/client.conf
找到写着:
remote my-server-1 1194
并将 my-server-1 更改为 Droplet 1 的 IP 地址。 接下来,我们必须确保客户端密钥和证书与实际文件名匹配。 搜索以下行:
cert client.crt key client.key
并将它们调整为复制的键(例如 client1.crt 和 client1.key)。
使用 Control-O、Enter、Control-X 保存并退出。
接下来,让我们启动 VPN:
service openvpn start
同样,我们可以使用以下命令对其进行测试:
service openvpn status
ifconfig
现在 VPN 的两端都已启动,我们应该测试网络。 使用以下命令:
ping 10.8.0.1
如果成功,您应该会看到如下内容:
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data. 64 bytes from 10.8.0.1: icmp_req=1 ttl=64 time=0.102 ms 64 bytes from 10.8.0.1: icmp_req=2 ttl=64 time=0.056 ms
恭喜,你现在完成了!
任何不需要加密的流量,都可以通过面向公众的 IP 地址进行连接。 您想要加密的云服务器之间的任何流量,连接到 Internet 网络地址,例如 液滴 1 连接到 10.8.0.1。 液滴 2 是 10.8.0.5,液滴 3 是 10.8.0.9,依此类推。
加密的流量会比未加密的要慢,特别是如果您的云服务器位于不同的数据中心,但两种流量方法都可以同时使用,因此请相应地选择。
此外,现在是了解更多关于 OpenVPN 和一般加密的好时机。 OpenVPN 网站有一些很好的资源。
附录1
安全
这里使用了三个快捷方式,如果安全性至关重要,您不应该这样做。
- 首先,密钥都是在虚拟服务器上远程生成的,该服务器既位于 Internet 上,又不完全受个人控制。 执行此操作的最安全方法是在安全位置的独立(未连接 Internet)计算机上生成证书颁发机构密钥。
- 其次,密钥是传输的,而不是就地生成的。 SSH 提供了一种相当安全的文件传输方法,但有 各种 实例 SSH 并不完全安全。 如果您要在主机中生成,将 CSR 传输到您的离线 CA,在那里对其进行签名,然后将签名的请求传输回,这样会更安全。
- 第三,没有为密钥分配密码。 由于这些是服务器,可能需要在无人看管的情况下重新启动,因此做出了这种权衡。
此外,OpenVPN 支持大量其他强化功能,超出了本教程的范围。 应该在 openvpn.org 上阅读。
附录二
关于网络的说明
因此第一个客户端将使用 10.8.0.6 作为其 IP 地址,而 10.8.0.5 是 VPN 隧道端点。 第二个地址仅用于通过隧道路由流量。 这是因为每个客户端都使用 CIDR /30 网络,这意味着每台客户端计算机使用 4 个 IP 地址。
所以 VPN 服务器将使用 10.8.0.0/30 网络:
10.8.0.0 | 网络 |
10.8.0.1 | 服务器的IP地址 |
10.8.0.2 | 隧道端点 |
10.8.0.3 | 播送 |
第一个客户端 client1 将使用 10.8.0.4/30 网络:
10.8.0.4 | 网络 |
10.8.0.5 | 服务器的IP地址 |
10.8.0.6 | 隧道端点 |
10.8.0.7 | 播送 |
等等...