
嗨,habrozhiteli! 在本书中,大卫·克林顿(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并非易事,因此花一些时间来了解一下可能很值得。
10.1.1。 配置OpenVPN服务器
在您开始之前,我将为您提供有用的建议。 如果您打算自己做所有事情(我强烈建议您这样做),您可能会发现您正在使用在台式机上打开的几个终端窗口,每个终端窗口都连接到其计算机。 在某些时候,您可能会在窗口中输入错误的命令。 为避免这种情况,可以使用hostname命令将命令行上显示的计算机名称更改为可以清楚地告诉您所在位置的名称。 完成此操作后,您将需要退出服务器并再次登录以使新设置生效。 看起来是这样的:
遵循这种方法,并为使用的每台计算机分配相应的名称,您可以轻松地跟踪自己的位置。
使用主机名后,当您运行以下命令时,您可能会遇到烦人的无法解析主机OpenVPN服务器消息。 使用相应的新主机名更新/ etc / hosts文件应该可以解决此问题。
为服务器准备OpenVPN
在服务器上安装OpenVPN需要两个软件包:openvpn和easy-rsa(以控制生成加密密钥的过程)。 如有必要,CentOS用户必须首先像第2章中一样安装epel-release存储库。为了能够检查对服务器应用程序的访问,还可以安装Apache Web服务器(用于Ubuntu的apache2和CentOS上的httpd)。
设置服务器时,建议您激活一个防火墙,该防火墙会阻止除22(SSH)和1194(默认的OpenVPN端口)以外的所有端口。 此示例说明了ufw在Ubuntu上的工作方式,但是我敢肯定您仍然记得第9章中的防火墙CentOS程序:
# ufw enable # ufw allow 22 # ufw allow 1194
要允许服务器上网络接口之间的内部路由,您需要在/etc/sysctl.conf文件中取消注释一行(net.ipv4.ip_forward = 1)。 这样,您可以在远程客户端连接后根据需要重定向它们。 要使新参数起作用,请运行sysctl -p:
# nano /etc/sysctl.conf # sysctl -p
现在服务器环境已完全配置,但是在准备工作之前还有其他事情要做:您将必须完成以下步骤(我们将在下面更详细地介绍它们)。
- 在服务器上创建密钥集,以使用easy-rsa软件包随附的脚本对公共密钥基础结构(PKI)进行加密。 本质上,OpenVPN服务器还充当其自己的证书颁发机构(CA)。
- 为客户端准备适当的密钥
- 为服务器配置server.conf文件
- 配置您的OpenVPN客户端
- 检查您的VPN
加密密钥生成
为了不让您的生活变得复杂,您可以在运行OpenVPN服务器的同一台计算机上配置关键基础结构。 但是,安全建议通常建议使用单独的CA服务器在生产环境中进行部署。 生成和分配用于OpenVPN的加密密钥资源的过程如图1所示。 10.2。
当您安装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列出了用于创建密钥的工具。
这些操作需要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="info@bootstrap-it.com" export KEY_OU="IT"
运行vars文件将使您可以将其值传输到Shell环境中,这些值将从中包含在新键的内容中。 为什么单独使用sudo命令不起作用? 因为在第一阶段,我们编辑了称为vars的脚本,然后将其应用。 应用程序和意味着vars文件将其值传输到Shell环境中,这些值将从中包含在新密钥的内容中。
确保使用新的外壳程序重新运行文件以完成未完成的过程。 完成后,脚本将提示您运行另一个脚本,全部清除,以删除/ etc / openvpn / easy-rsa / keys /目录中的所有内容:
自然,下一步是运行清除所有脚本,然后运行build-ca,后者使用pkitool脚本创建根证书。 系统将要求您确认vars提供的身份验证设置:
# ./clean-all # ./build-ca Generating a 2048 bit RSA private key
接下来是build-key-server脚本。 由于它使用相同的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)生成的参数来协商新连接的身份验证。 此处创建的文件不应是机密文件,而必须使用build-dh脚本为当前处于活动状态的RSA密钥生成。 如果将来创建新的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加密使用成对的对应密钥:一个安装在服务器上,另一个安装在远程客户端上。 这意味着您将需要客户端密钥。 我们的老朋友pkitool正是您需要的。 在此示例中,通过在/ etc / openvpn / easy-rsa /目录中运行程序,我们将client参数传递给它,以生成名为client.crt和client.key的文件:
# ./pkitool client
现在,这两个客户端文件以及原始的ca.crt文件仍位于keys /目录中,现在应该安全地将其传输到客户端。 由于它们的从属关系和访问权,这可能并不容易。 最简单的方法是将源文件的内容(仅此内容)手动复制到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)。
让我们来看看其中的一些设置。
- 默认情况下,OpenVPN通过端口1194起作用。您可以更改此设置,例如,以隐藏更多操作或避免与其他活动隧道发生冲突。 由于1194需要与客户的最少协作,因此最好做到这一点。
- OpenVPN使用传输控制协议(TCP)或用户数据报协议(UDP)进行数据传输。 TCP可能会稍慢一些,但它更可靠,并且隧道两端运行的应用程序更容易理解。
- 您可以告诉dev tun何时要创建一个更简单,更有效的IP隧道,该隧道传输数据的内容,仅此而已。 另一方面,如果您需要通过创建以太网桥来连接多个网络接口(及其代表的网络),则必须选择dev tap。 如果您不了解所有这些含义,请使用tun参数。
- 接下来的四行传递服务器上三个身份验证文件的OpenVPN名称以及您先前创建的dh2048设置文件。
- 服务器行设置范围和子网掩码,该范围和子网掩码将用于在登录时为客户端分配IP地址。
- 可选的推入参数“ route 10.0.3.0 255.255.255.0”允许远程客户端访问服务器后面的专用子网。 要执行此工作,您还需要在服务器本身上配置网络,以使私有子网了解OpenVPN子网(10.8.0.0)。
- 端口共享localhost 80行允许您将通过端口1194的客户端流量重定向到侦听端口80的本地Web服务器。(如果打算使用Web服务器测试VPN,这将非常有用。)仅在以下情况下有效选择tcp协议时。
- 用户nobody和group 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。
尽管不需要使用easy-rsa,但由于您使用的密钥已经存在,因此需要将OpenVPN软件包安装在客户端计算机上,就像安装在服务器上一样。 您需要将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服务器(清单10.3)。
现在,您可以转到/ etc / openvpn /目录,并从服务器中提取认证密钥。 用您的值替换示例中的服务器IP地址或域名:
在客户端上运行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章)。
关于作者
David Clinton是系统管理员,老师和作家。 他负责管理,撰写有关内容,并为许多重要的技术学科创建了培训材料,包括Linux系统,云计算(尤其是AWS)和诸如Docker之类的容器技术。 他写了一本书《在一个月的午餐中学习Amazon Web Services》(Manning,2017年)。 他的许多视频教程都可以在Pluralsight.com上找到,并且可以在
bootstrap-it.com上找到他的其他书籍(有关Linux管理和服务器虚拟化)的链接。
»这本书的更多信息可以
在出版商的网站上找到»
目录»
摘录小贩优惠券可享受25%的折扣
-Linux支付纸质版本的书后,就会通过电子邮件发送电子书。