书籍《Linux在行动》

书籍《Linux在行动》 哈布罗居民大家好! 在书中,David Clinton 描述了 12 个现实项目,包括自动化备份和恢复系统、设置 Dropbox 风格的个人文件云以及创建您自己的 MediaWiki 服务器。 您将通过有趣的案例研究探索虚拟化、灾难恢复、安全、备份、DevOps 和系统故障排除。 每章最后都回顾了最佳实践、新术语词汇表和练习。

摘录“10.1. 创建 OpenVPN 隧道”

我已经在本书中讨论了很多有关加密的内容。 SSH 和 SCP 可以保护通过远程连接传输的数据(第 3 章),文件加密可以保护存储在服务器上的数据(第 8 章),TLS/SSL 证书可以保护站点和客户端浏览器之间传输的数据(第 9 章) 。 但有时您的数据需要在更广泛的连接范围内受到保护。 例如,也许您的一些团队成员在路上工作,同时通过公共热点连接到 Wi-Fi。 您绝对不应该假设所有此类接入点都是安全的,但您的员工确实需要一种连接到公司资源的方法,而这正是 VPN 可以提供帮助的地方。

正确设计的 VPN 隧道可在远程客户端和服务器之间提供直接连接,并在数据通过不安全的网络传输时隐藏数据。 所以呢? 您已经见过许多可以通过加密来实现此目的的工具。 VPN 的真正价值在于,通过打开隧道,您可以连接远程网络,就像它们都是本地网络一样。 从某种意义上说,您正在使用旁路。

使用这个扩展网络,管理员可以在任何地方在他们的服务器上执行工作。 但更重要的是,资源分布在多个地点的公司可以让所有需要它们的团体无论身在何处都可以看到并访问这些资源(图 10.1)。

隧道本身并不能保证安全。 但其中一种加密标准可以包含在网络结构中,从而显着提高安全级别。 使用开源 OpenVPN 包创建的隧道使用您已经阅读过的相同 TLS/SSL 加密。 OpenVPN 并不是唯一可用的隧道选项,但它是最著名的选项之一。 它被认为比使用 IPsec 加密的替代第 2 层隧道协议稍快且更安全。

您是否希望团队中的每个人在路上或在不同建筑物中工作时都能安全地相互通信? 为此,您需要创建一个 OpenVPN 服务器以允许应用程序共享和访问服务器的本地网络环境。 为此,您所需要做的就是运行两个虚拟机或两个容器:一台充当服务器/主机,一台充当客户端。 构建 VPN 不是一个简单的过程,因此可能值得花几分钟来了解整体情况。

书籍《Linux在行动》

10.1.1。 OpenVPN 服务器配置

在开始之前,我会给你一些有用的建议。 如果您打算自己执行此操作(我强烈建议您这样做),您可能会发现自己在桌面上打开多个终端窗口,每个窗口都连接到不同的计算机。 有时您可能会在窗口中输入错误的命令。 为了避免这种情况,您可以使用 hostname 命令将命令行上显示的计算机名称更改为可以清楚地告诉您所在位置的名称。 执行此操作后,您将需要注销服务器并重新登录以使新设置生效。 它看起来是这样的:

书籍《Linux在行动》
通过遵循这种方法并为您使用的每台机器指定适当的名称,您可以轻松地跟踪您所在的位置。

使用主机名后,在执行后续命令时,您可能会遇到烦人的 Unable to Resolve Host OpenVPN-Server 消息。 使用适当的新主机名更新 /etc/hosts 文件应该可以解决该问题。

为 OpenVPN 准备服务器

要在服务器上安装 OpenVPN,您需要两个软件包:openvpn 和 easy-rsa(用于管理加密密钥生成过程)。 如果需要,CentOS 用户应该首先安装 epel-release 存储库,就像您在第 2 章中所做的那样。为了能够测试对服务器应用程序的访问,您还可以安装 Apache Web 服务器(Ubuntu 上的 apache2 和 CentOS 上的 httpd)。

当您设置服务器时,我建议您激活防火墙,阻止除 22 (SSH) 和 1194(OpenVPN 的默认端口)之外的所有端口。 这个例子说明了 ufw 如何在 Ubuntu 上工作,但我相信你还记得第 9 章中的 CentOS Firewalld 程序:

# ufw enable
# ufw allow 22
# ufw allow 1194

要启用服务器上网络接口之间的内部路由,您需要取消注释 /etc/sysctl.conf 文件中的一行 (net.ipv4.ip_forward = 1)。 这将允许远程客户端在连接后根据需要进行重定向。 要使新选项起作用,请运行 sysctl -p:

# nano /etc/sysctl.conf
# sysctl -p

您的服务器环境现已完全配置,但在准备好之前还需要做一件事:您需要完成以下步骤(我们将在接下来详细介绍它们)。

  1. 使用 easy-rsa 包提供的脚本在服务器上创建一组公钥基础设施 (PKI) 加密密钥。 本质上,OpenVPN 服务器还充当其自己的证书颁发机构 (CA)。
  2. 为客户端准备适当的密钥
  3. 为服务器配置server.conf文件
  4. 设置您的 OpenVPN 客户端
  5. 检查您的 VPN

生成加密密钥

为了简单起见,您可以在运行 OpenVPN 服务器的同一台计算机上设置关键基础设施。 但是,安全最佳实践通常建议使用单独的 CA 服务器进行生产部署。 OpenVPN 中使用的加密密钥资源的生成和分发过程如图 10.2 所示。 XNUMX.

书籍《Linux在行动》
当您安装 OpenVPN 时,会自动创建 /etc/openvpn/ 目录,但其中还没有任何内容。 openvpn 和 easy-rsa 软件包附带示例模板文件,您可以将其用作配置的基础。 要开始认证过程,请将 easy-rsa 模板目录从 /usr/share/ 复制到 /etc/openvpn 并更改为 easy-rsa/ 目录:

# cp -r /usr/share/easy-rsa/ /etc/openvpn
$ cd /etc/openvpn/easy-rsa

easy-rsa 目录现在将包含相当多的脚本。 表中10.1 列出了将用于创建密钥的工具。

书籍《Linux在行动》

以上操作需要root权限,因此需要通过sudo su成为root。

您将使用的第一个文件称为 vars,包含 easy-rsa 在生成密钥时使用的环境变量。 您需要编辑该文件以使用您自己的值而不是已有的默认值。 这就是我的文件的样子(清单 10.1)。

清单 10.1。 文件 /etc/openvpn/easy-rsa/vars 的主要片段

export KEY_COUNTRY="CA"
export KEY_PROVINCE="ON"
export KEY_CITY="Toronto"
export KEY_ORG="Bootstrap IT"
export KEY_EMAIL="[email protected]"
export KEY_OU="IT"

运行 vars 文件会将其值传递到 shell 环境,它们将包含在新密钥的内容中。 为什么 sudo 命令本身不起作用? 因为在第一步中我们编辑了名为 vars 的脚本,然后应用它。 应用 and 意味着 vars 文件将其值传递到 shell 环境,它们将包含在新键的内容中。

请务必使用新的 shell 重新运行该文件以完成未完成的过程。 完成后,脚本将提示您运行另一个脚本 clean-all,以删除 /etc/openvpn/easy-rsa/keys/ 目录中的所有内容:

书籍《Linux在行动》
当然,下一步是运行 clean-all 脚本,然后运行 ​​build-ca,它使用 pkitool 脚本创建根证书。 系统会要求您确认 vars 提供的身份设置:

# ./clean-all
# ./build-ca
Generating a 2048 bit RSA private key

接下来是构建密钥服务器脚本。 由于它使用相同的 pkitool 脚本以及新的根证书,因此您将看到相同的问题来确认密钥对的创建。 这些密钥将根据您传递的参数进行命名,除非您在此计算机上运行多个 VPN,否则这些密钥通常是服务器,如示例所示:

# ./build-key-server server
[...]
Certificate is to be certified until Aug 15 23:52:34 2027 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

OpenVPN 使用 Diffie-Hellman 算法(使用 build-dh)生成的参数来协商新连接的身份验证。 此处创建的文件不需要保密,但必须使用当前活动的 RSA 密钥的 build-dh 脚本生成。 如果您将来创建新的 RSA 密钥,您还需要更新 Diffie-Hellman 文件:

# ./build-dh

您的服务器端密钥现在将位于 /etc/openvpn/easy-rsa/keys/ 目录中,但 OpenVPN 不知道这一点。 默认情况下,OpenVPN 将在 /etc/openvpn/ 中查找密钥,因此请复制它们:

# cp /etc/openvpn/easy-rsa/keys/server* /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/dh2048.pem /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpn

准备客户端加密密钥

正如您已经看到的,TLS 加密使用一对匹配的密钥:一个安装在服务器上,一个安装在远程客户端上。 这意味着您将需要客户端密钥。 我们的老朋友 pkittool 正是您所需要的。 在此示例中,当我们在 /etc/openvpn/easy-rsa/ 目录中运行程序时,我们将 client 参数传递给它以生成名为 client.crt 和 client.key 的文件:

# ./pkitool client

这两个客户端文件以及仍在keys/目录中的原始ca.crt文件现在应该安全地传输到您的客户端。 由于他们的所有权和访问权,这可能并不那么容易。 最简单的方法是手动将源文件的内容(除了该内容之外什么都没有)复制到 PC 桌面上运行的终端中(选择文本,右键单击它并从菜单中选择“复制”)。 然后将其粘贴到与您在连接到客户端的第二个终端中创建的名称相同的新文件中。

但任何人都可以剪切和粘贴。 相反,请像管理员一样思考,因为您并不总是能够访问可以进行剪切/粘贴操作的 GUI。 将文件复制到用户的主目录(以便远程 scp 操作可以访问它们),然后使用 chown 将文件的所有权从 root 更改为常规非 root 用户,以便可以执行远程 scp 操作。 确保所有文件当前均已安装且可访问。 稍后您将把它们移至客户端:

# cp /etc/openvpn/easy-rsa/keys/client.key /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/ca.crt /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/client.crt /home/ubuntu/
# chown ubuntu:ubuntu /home/ubuntu/client.key
# chown ubuntu:ubuntu /home/ubuntu/client.crt
# chown ubuntu:ubuntu /home/ubuntu/ca.crt

准备好全套加密密钥后,您需要告诉服务器您要如何创建 VPN。 这是使用 server.conf 文件完成的。

减少击键次数

是不是打字太多了? 用括号扩展将有助于将这六个命令减少到两个。 我相信您可以研究这两个示例并了解发生了什么。 更重要的是,您将能够了解如何将这些原则应用于涉及数十甚至数百个元素的操作:

# cp /etc/openvpn/easy-rsa/keys/{ca.crt,client.{key,crt}} /home/ubuntu/
# chown ubuntu:ubuntu /home/ubuntu/{ca.crt,client.{key,crt}}

设置 server.conf 文件

您如何知道 server.conf 文件应该是什么样子? 还记得您从 /usr/share/ 复制的 easy-rsa 目录模板吗? 安装 OpenVPN 时,您会得到一个压缩的配置模板文件,您可以将其复制到 /etc/openvpn/。 我将基于模板已存档的事实向您介绍一个有用的工具:zcat。

您已经了解如何使用 cat 命令将文件的文本内容打印到屏幕上,但是如果文件是使用 gzip 压缩的呢? 您始终可以解压缩该文件,然后 cat 会很高兴地输出它,但这比必要的多了一两个步骤。 相反,正如您可能已经猜到的那样,您可以发出 zcat 命令,一步将解压的文本加载到内存中。 在以下示例中,您不会将文本打印到屏幕,而是将其重定向到名为 server.conf 的新文件:

# zcat 
  /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz 
  > /etc/openvpn/server.conf
$ cd /etc/openvpn

让我们先把文件附带的大量有用的文档放在一边,看看编辑完成后它会是什么样子。 请注意,分号 (;) 告诉 OpenVPN 不要读取或执行下一行(清单 10.2)。

书籍《Linux在行动》
让我们看一下其中一些设置。

  • 默认情况下,OpenVPN 在端口 1194 上运行。您可以更改此设置,例如,以进一步隐藏您的活动或避免与其他活动隧道发生冲突。 由于 1194 需要与客户进行最少的协调,因此最好采用这种方式。
  • OpenVPN 使用传输控制协议 (TCP) 或用户数据报协议 (UDP) 来传输数据。 TCP 可能会慢一些,但它更可靠,并且更容易被隧道两端运行的应用程序理解。
  • 当您想要创建一个更简单、更高效的仅承载数据内容而不承载任何其他内容的 IP 隧道时,可以指定 dev tun。 另一方面,如果您需要连接多个网络接口(以及它们代表的网络),创建以太网桥,则必须选择 dev tap。 如果您不明白这一切意味着什么,请使用 tun 参数。
  • 接下来的四行为 OpenVPN 提供了服务器上三个身份验证文件的名称以及您之前创建的 dh2048 选项文件。
  • 服务器行设置范围和子网掩码,用于在登录时向客户端分配 IP 地址。
  • 可选的推送参数“route 10.0.3.0 255.255.255.0”允许远程客户端访问服务器后面的私有子网。 要实现此功能,还需要在服务器本身上设置网络,以便私有子网了解 OpenVPN 子网 (10.8.0.0)。
  • port-share localhost 80 行允许您将端口 1194 上的客户端流量重定向到侦听端口 80 的本地 Web 服务器。(如果您要使用 Web 服务器来测试您的 VPN,这将很有用。)这只适用然后当选择tcp协议时。
  • 必须通过删除分号 (;) 来启用用户 nobody 和组 nogroup 行。 强制远程客户端以 nobody 和 nogroup 身份运行可确保服务器上的会话不受特权。
  • log 指定每次 OpenVPN 启动时当前日志条目将覆盖旧条目,而 log-append 将新条目附加到现有日志文件中。 openvpn.log 文件本身写入 /etc/openvpn/ 目录。

此外,客户端到客户端的值也经常添加到配置文件中,以便多个客户端除了 OpenVPN 服务器之外还可以互相看到。 如果您对配置感到满意,则可以启动 OpenVPN 服务器:

# systemctl start openvpn

由于 OpenVPN 和 systemd 之间关系的性质不断变化,有时可能需要以下语法来启动服务:systemctl start openvpn@server。

运行 ip addr 列出服务器的网络接口现在应该输出一个指向名为 tun0 的新接口的链接。 OpenVPN 将创建它来为传入的客户端提供服务:

$ ip addr
[...]
4: tun0: mtu 1500 qdisc [...]
      link/none
      inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
          valid_lft forever preferred_lft forever

在一切开始正常工作之前,您可能需要重新启动服务器。 下一站是客户端计算机。

10.1.2. 配置 OpenVPN 客户端

传统上,隧道至少有两个出口(否则我们将其称为洞穴)。 服务器上正确配置的 OpenVPN 会在一侧引导流量进出隧道。 但您还需要一些在客户端(即隧道的另一端)运行的软件。

在本节中,我将重点关注手动设置某种类型的 Linux 计算机以充当 OpenVPN 客户端。 但这并不是获得这一机会的唯一方式。 OpenVPN 支持可在运行 Windows 或 macOS 的台式机和笔记本电脑以及 Android 和 iOS 智能手机和平板电脑上安装和使用的客户端应用程序。 有关详细信息,请参阅 openvpn.net。

OpenVPN 软件包需要像安装在服务器上一样安装在客户端计算机上,但这里不需要 easy-rsa,因为您使用的密钥已经存在。 您需要将 client.conf 模板文件复制到刚刚创建的 /etc/openvpn/ 目录。 这次文件将不会被压缩,因此常规 cp 命令可以很好地完成这项工作:

# apt install openvpn
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf 
  /etc/openvpn/

client.conf 文件中的大多数设置都是不言自明的:它们应该与服务器上的值匹配。 从下面的示例文件中可以看到,唯一的参数是remote 192.168.1.23 1194,它告诉客户端服务器的IP地址。 再次确保这是您的服务器地址。 您还应该强制客户端计算机验证服务器证书的真实性,以防止可能的中间人攻击。 一种方法是添加remote-cert-tls server 行(清单10.3)。

书籍《Linux在行动》
您现在可以转到 /etc/openvpn/ 目录并从服务器中提取认证密钥。 将示例中的服务器 IP 地址或域名替换为您的值:

书籍《Linux在行动》
在客户端上运行 OpenVPN 之前,不会发生任何令人兴奋的事情。 由于您需要传递几个参数,因此您将从命令行执行此操作。 --tls-client 参数告诉 OpenVPN 您将充当客户端并通过 TLS 加密进行连接,--config 指向您的配置文件:

# openvpn --tls-client --config /etc/openvpn/client.conf

仔细阅读命令输出以确保连接正确。 如果第一次出现问题,可能是由于服务器和客户端配置文件之间的设置不匹配或网络连接/防火墙问题。 以下是一些故障排除提示。

  • 仔细阅读客户端上 OpenVPN 操作的输出。 它通常包含关于哪些事情不能做以及为什么不能做的宝贵建议。
  • 检查服务器/etc/openvpn/目录下的openvpn.log和openvpn-status.log文件中的错误消息。
  • 检查服务器和客户端上的系统日志中是否有与 OpenVPN 相关的定时消息。 (journalctl -ce 将显示最新条目。)
  • 确保服务器和客户端之间有活动的网络连接(更多内容请参见第 14 章)。

关于作者

大卫·克林顿 - 系统管理员、教师和作家。 他管理、撰写和创建了许多重要技术学科的教育材料,包括 Linux 系统、云计算(特别是 AWS)和 Docker 等容器技术。 他撰写了《在一个月的午餐中学习 Amazon Web Services》一书(Manning,2017 年)。 他的许多视频培训课程都可以在 Pluralsight.com 上找到,他的其他书籍(关于 Linux 管理和服务器虚拟化)的链接也可以在以下网址找到: bootstrap-it.com.

» 有关本书的更多详细信息,请访问 出版商的网站
» 目录
» 摘抄

对于 Khabrozhiteley 使用优惠券可享受 25% 折扣 - Linux
支付纸质版书籍的费用后,将通过电子邮件发送电子书。

来源: habr.com

添加评论