妄想企鹅 - 使用 OpenVPN 的 Linux VPN

作者:Mick Bauer

前几天,我陪同当地 IT 安全传奇人物和挚友 Bill Wurster 进行他退休前的最后一次正式“无线局域网巡视”,寻找我们公司市中心办公室中未经授权的无线接入点。当我们漫步和扫描时,我们聊天,除了回忆过去、赢得和输掉的战斗,以及一位非常有个性的前经理之外,自然而然地我们谈到了无线安全。

Bill 在过去十年中致力于无线网络安全领域的各种工作,他重申了我们安全领域的所有人多年来一直在说的一件事:当您使用别人的 WLAN 时,保护自己最好的方法之一是使用虚拟专用网络 (VPN) 连接,连接回其他更值得信任的网络。

您可能认为 VPN 连接的主要价值是加密敏感通信,这当然非常重要。但是,如果您将 VPN 连接设为默认路由,并使用您信任网络的 DNS 服务器、Web 代理和其他“基础设施”系统与互联网进行通信(例如,用于 Web 浏览),您将不必担心 DNS 欺骗、Web 会话劫持或您在不受信任的 LAN 上可能遭受的其他所有类别的本地攻击。

因此,我们的雇主要求我们在将公司笔记本电脑连接到任何 WLAN“热点”甚至个人/家庭 WLAN 时,都必须使用我们的公司 VLAN 软件。所以,Bill 问我,你为什么不写一篇关于使用 Linux 笔记本电脑进行 VLAN 连接的文章呢?

这不是 Bill 给我的第一个好主意(我希望也不是最后一个)。因此,本月我开始撰写关于 Linux VPN 的系列文章,特别关注 OpenVPN。我想将这个系列献给 Bill Wurster,他的技能、创造力、热情和正直不仅对我,而且对几代同事都是一种鼓舞。Bill,我们将非常怀念您的热情和智慧——祝您退休生活漫长、幸福和充满乐趣!

VPN 基础知识

令我颇感惊讶的是,我在 2005 年所做的关于 VPN 技术概述以及 Linux VPN 选择仍然非常 актуальный(请参阅“参考资源”部分,获取指向先前文章的链接)。如果您觉得我即将给出的概述过于简短,我建议您参考那篇文章。不过,这里是一个简要介绍。

创建“虚拟专用网络”是为了扩展一些专用网络——例如,您的家庭局域网 (LAN) 或您雇主广域网 (WAN)——通过将其连接到其他未与其物理连接的网络或系统,使用某种“虚拟”(非专用、非持久)网络连接,通过您未控制或管理的网络带宽。换句话说,VPN 使用公共网络(最常见的是互联网)将专用网络连接在一起。

因为根据定义,公共网络是您无法真正控制的网络,所以 VPN 必须允许两件事:不可靠性和缺乏安全性。前者主要由 VPN 软件的低级纠错功能处理。然而,安全性很棘手。

您必须首先选择使用良好安全技术的 VPN 产品或平台(世界上充斥着不安全的 VPN 技术),并且您还必须启用这些安全功能,并抵制为了提高 VPN 性能而削弱它们的诱惑(这最终是徒劳的,因为互联网带宽通常比其他远程网络技术(如专用电路)慢且不可靠)。

在这种情况下,我们关心三种类型的安全性

  1. 身份验证:尝试连接到受信任网络的计算机或网络设备是否是预期、授权的 VPN 端点?反过来,我,VPN 客户端,是否真的连接到我的受信任网络,还是我的连接请求被重定向到某个冒名顶替的站点?

  2. 数据完整性:我的连接是否真的只能由我和我的受信任网络使用,或者外部人员是否有可能向其中注入无关的流量或篡改合法的流量?

  3. 隐私:攻击者是否有可能读取我的 VPN 流量中包含的数据?

您可能不需要所有三种类型的安全性。例如,如果您使用 VPN 连接传输大量公共或其他非敏感信息,并且首先使用 VPN 只是为了隧道传输一些通常不可 IP 路由的协议,您可能会考虑“空加密”VPN 隧道。但即使在这种情况下,您也应该问问自己,如果攻击者在这些交易中插入或更改数据会发生什么?如果攻击者完全发起虚假连接会发生什么?

幸运的是,某些 VPN 协议(如 IPsec)允许您在解决不同安全控制的功能之间“混合和匹配”。例如,您可以使用强大的身份验证和所有数据的加密错误/完整性检查,而无需实际加密隧道。但是在大多数情况下,明智的做法是利用良好的身份验证、完整性和隐私(加密)控制。本系列的其余部分假设您需要所有这三种控制。

VPN 有两种常见的使用场景:“站点到站点”和“远程访问”。在站点到站点 VPN 中,两个网络通过加密的“隧道”连接,隧道的端点是充当各自网络网关的路由器或服务器。通常,这样的 VPN 隧道是“固定的”(或“持久的”)——一旦建立,它就被维护为两个网络之间始终可用的透明路由,最终用户甚至没有意识到,就像 WAN 电路(如 T1 或帧中继连接)一样。

相比之下,远程访问 VPN 解决方案中的每个隧道都将单个用户的系统连接到受信任的网络。通常,远程访问 VPN 隧道是根据需要动态建立和断开的。例如,当我在家工作时,我从我的公司笔记本电脑建立到公司 VPN 集中器的 VPN 隧道。一旦我的隧道建立,我可以访问与我在办公室时相同的网络资源;就计算而言,从那时起我可以像往常一样工作。然后在一天结束时,当该关闭我的机器时,我首先关闭我的 VPN 隧道。

对于站点到站点 VPN,端点通常是路由器。所有现代路由器平台都支持 VPN 协议,例如 IPsec。然而,建立和断开 VPN 隧道可能在计算上很昂贵——也就是说,消耗资源。

因此,如果您需要在单个端点上终止大量站点到站点隧道(例如,数据中心中的路由器连接到多个销售办事处),或者如果您需要支持许多远程访问 VPN 客户端,您通常需要专用的 VPN 集中器。这可以采用带有加密加速器电路板的路由器的形式,也可以是完全为此目的设计的设备(这很可能具有加密加速器硬件,形式为板载 ASIC)。

许多隧道协议用于互联网 VPN。IPsec 是一种开放标准,它向 IPv4 标准添加了安全标头(从技术上讲,它是 IPv6 安全功能到 IPv4 的反向移植),它允许您“就地”验证和完整性检查 IPv4 流(无需创建隧道本身)或将整个数据包封装在新 IPv4 流的有效负载中。这些分别称为身份验证标头 (AH) 模式和封装安全负载 (ESP) 模式。

Microsoft 的点对点隧道协议 (PPTP) 是另一种流行的 VPN 协议。与只能用于保护 IP 流量的 IPsec 不同,PPTP 可以封装非 IP 协议,例如 Microsoft NETBIOS。PPTP 有着悠久的安全漏洞历史。

这里还值得一提另外两个协议。SSL-VPN 与其说是一种协议,不如说是一类产品。它涉及将应用程序流量封装在标准 HTTPS 流量中,不同的供应商以不同的(专有)方式实现这一点。SSL-VPN 通常用于远程访问解决方案,它通常允许客户端使用普通的 Web 浏览器连接到 SSL-VPN 网关设备。一旦通过身份验证,用户将看到一个网页,其中包含指向家庭网络上特定服务器上特定服务的链接。

您可能会问,这与连接到配置为验证所有外部用户的“反向”Web 代理有什么不同?对于 Web 流量,大多数 SSL-VPN 产品实际上确实像标准 Web 代理一样工作。然而,神奇之处在于非基于 HTTP 的应用程序,例如 Outlook/Exchange、终端服务、安全外壳等。

对于非基于 HTTP 的应用程序,SSL-VPN 网关要么必须与专用客户端应用程序(“胖”客户端)交互,要么必须将某种小程序推送到用户的 Web 浏览器。一些 SSL-VPN 产品同时支持仅浏览器访问和胖客户端访问。其他产品仅支持其中一种。

与浏览器可访问的不同,仅胖客户端 SSL-VPN 可用于封装整个网络流,而不仅仅是单个应用程序的流量。但在通用语中,术语 SSL-VPN 通常表示浏览器客户端。

这引出了本月专栏的其余部分以及未来几个专栏的独家重点:其他基于 SSL 的 VPN。正如我刚才暗示的,可以将整个网络流加密到 SSL 会话中,原因与我们可以流式传输音频、视频、远程桌面会话以及我们现在使用浏览器进行的所有其他操作的原因相同。

OpenVPN 是一种免费的开源 VPN 解决方案,它使用自己的守护程序和客户端软件实现了这一目标。与 PPTP 一样,它不仅可以隧道传输 IP 流量,还可以隧道传输较低级别的、非基于 IP 的协议,例如 NETBIOS。与 IPsec 一样,它使用经过良好审查、值得信赖的标准、开放加密算法和协议的实现。我稍后将更详细地解释如何实现。但出于概述的目的,只需说 OpenVPN 代表一类封装 SSL/TLS 的 VPN 工具,并且是其中较好的示例之一。

一些 Linux VPN 选择

如今,Linux 有许多优秀的 VPN 解决方案。当然,一些商业产品发布了其专有 VPN 客户端软件的 Linux 版本(比我在 2000 年开始撰写此专栏时要多得多!)。

在 IPsec 领域,有 Openswan,它在 FreeS/WAN 项目结束后不久就从中分离出来;Strongswan,另一个 FreeS/WAN 分支;以及 NETKEY(源自 BSD 的 KAME),它是 Linux 2.6 内核的官方组成部分,并由 ipsec-tools 软件包提供的用户空间工具控制。所有这些都代表了 Linux 内核的 IPsec 实现。由于 IPsec 是 IPv4 协议的扩展,任何操作系统上的任何 IPsec 实现都必须集成到其内核中。

vpnc 是一个开源 Linux 客户端,用于连接到 Cisco VPN 服务器(形式为 Cisco 路由器、Cisco ASA 防火墙等)。它也适用于 Juniper/Netscreen VPN 服务器。

尽管我不推荐这两种协议,因为 PPTP 的安全设计存在缺陷,但 PPTP-linux 和 Poptop 分别为 Microsoft 的 PPTP 协议提供了客户端和服务器应用程序。您认为只有我这么认为吗?PPTP-linux 和 Poptop 的维护者都建议您不要使用 PPTP,除非您别无选择!(有关 PPTP-linux 和 Poptop 主页的链接,请参阅“参考资源”部分。)

当然,还有 OpenVPN,它为基于 SSL/TLS 的 VPN 隧道提供客户端和服务器支持,用于站点到站点和远程访问。

OpenVPN 简介

我刚才提到的所有非 PPTP Linux VPN 工具都是安全稳定的。但是,在本系列的其余部分中,我将重点关注 OpenVPN,原因有二。首先,我从未在这里深入介绍过 OpenVPN,但它日益增长的普及率以及在安全性和稳定性方面的声誉表明,现在是我介绍它的最佳时机。

其次,OpenVPN 比 IPsec 简单得多。IPsec,尤其是 Linux 上的 IPsec,无论是在客户端还是服务器上下文中,都可能非常复杂且令人困惑。相比之下,OpenVPN 更容易理解、工作和维护。

OpenVPN 更简单的原因之一是它不在内核级别运行,除了使用内核的 tun 和 tap 设备(这些设备已编译到大多数主流 Linux 发行版的默认内核中)。OpenVPN 本身,无论是作为 VPN 服务器还是客户端运行,都严格来说是一个用户空间程序。

实际上,OpenVPN 正好由一个用户空间程序组成,即 openvpn,它可以用作 VPN 客户端连接的服务器守护程序,也可以用作连接到其他 OpenVPN 服务器的客户端进程。与 stunnel(另一个使用 SSL/TLS 封装应用程序流量的工具)一样,openssl 守护程序使用 OpenSSL,如今 OpenSSL 默认安装在大多数 Linux 系统上,用于其加密功能。

顺便说一句,OpenVPN 并非严格来说是 Linux 工具。Windows、Solaris、FreeBSD、NetBSD、OpenBSD 和 Mac OS X 也提供了版本。

2009 年:SSL/TLS 的糟糕年份?

OpenVPN 依赖于 OpenSSL(SSL 和 TLS 协议的免费实现)来实现其加密功能。但是,SSL/TLS 在安全漏洞方面度过了糟糕的一年。首先,早在 2009 年 2 月,Moxie Marlinspike 和其他人就开始演示中间人攻击,这些攻击可用于通过从 HTTPS 会话中“剥离”SSL/TLS 加密来拦截 SSL/TLS 加密的 Web 会话。

这些主要是本地攻击——在实践中,攻击者通常需要与受害者在同一 LAN 上(或不太远的上游)——并且它们依赖于最终用户没有注意到他们的 HTTPS 会话已恢复为 HTTP。Marlinspike 和 Dan Kaminsky 随后(分别)在夏季演示的 NULL 前缀中间人攻击更令人担忧。它利用了 X.509 和 Firefox 中的问题,使攻击者基本上可以代理 HTTPS 会话,在中间破坏加密,从而允许攻击者以最终用户更难注意到或检测到的方式窃听(并干预)HTTPS 流量。

但是,这并不是 2009 年的全部(在我撰写本文时,2009 年甚至还没有结束)。11 月,安全研究人员发现 SSL/TLS 协议处理会话状态的方式存在问题。这些问题至少在理论上允许攻击者不仅窃听,而且还将数据注入 SSL/TLS 加密的数据流中。尽管此攻击的效果看起来与 NULL 前缀攻击的效果相似,但后者涉及客户端/浏览器端 X.509 证书处理功能,这些功能是浏览器/平台特定的,并且不涉及任何服务器端代码。

相比之下,11 月的披露涉及 SSL/TLS 协议本身的实际缺陷,无论是在 Web 浏览器、Web 服务器还是任何其他使用 SSL/TLS 的事物中实现。因此,应用程序或平台特定的补丁无济于事。SSL/TLS 规范本身以及它的所有实现(主要是以 OpenSSL 等库的形式)都必须更改。

这是坏消息。OpenVPN 依赖于最近受到强烈攻击的协议。好消息是,由于电子商务、在线银行和许多其他关键的互联网应用程序也这样做,因此在撰写本文时,IETF 已迅速做出响应,对 SSL/TLS 协议规范进行了必要的修订,主要的供应商和其他 SSL/TLS 实现者似乎已准备好相应地更新他们的 SSL/TLS 库。希望在您阅读本文时,该特定问题已得到解决。

显然,通过甚至发布这篇文章,我都在押注 SSL/TLS 以及因此 OpenVPN 的持续可行性。但是,如果我不坦率地谈论这些问题,那我就不像自己了!您可以在“参考资源”部分找到有关这些 SSL/TLS 问题的更多信息的链接。

获取 OpenVPN

OpenVPN 已经是许多 Linux 发行版的标准部分。例如,Ubuntu、Debian、SUSE 和 Fedora 都各自有自己的“openvpn”软件包。要在您选择的发行版上安装 OpenVPN,您很可能只需要运行发行版的软件包管理器即可。

但是,如果您的发行版缺少自己的 OpenVPN 软件包,您可以从 www.openvpn.net 下载最新的源代码软件包。此软件包包含从源代码编译和安装 OpenVPN 的说明。

结论

现在您已经了解了 VPN 的用途、可用于构建 VPN 隧道的不同协议、此领域中可用的不同 Linux 工具以及 OpenVPN 的一些优点,我们准备好卷起袖子,让 OpenVPN 在服务器和客户端配置中以“桥接”或“路由”模式运行起来。

但是,这必须等到下个月了——我现在没空间了。我希望我已经引起了您的兴趣。下次见,请注意安全!

参考资源

Mick Bauer 的“妄想企鹅”系列,2005 年 1 月,“Linux VPN 技术”:www.linuxjournal.com/article/7881

Wikipedia 的 IPsec 条目:en.wikipedia.org/wiki/IPsec

Openswan 主页,Linux 内核的 IPsec 实现:en.wikipedia.org/wiki/IPsec

Strongswan 主页,另一个 Linux IPsec 实现:www.strongswan.org

pptp-linux 主页(不推荐):pptpclient.sourceforge.net

Poptop,Linux 的 PPTP 服务器(不推荐):poptop.sourceforge.net/dox

与 Moxie Marlinspike 的 SSL 攻击(和其他攻击)相关的工具和论文:www.thoughtcrime.org/software.html

Kelly Jackson Higgins,“主要 SSL 漏洞发现促使协议更新”,DarkReading:www.darkreading.com/security/vulnerabilities/showArticle.jhtml?articleID=221600523

OpenVPN 官方主页:www.openvpn.net

Ubuntu 社区 OpenVPN 页面:https://help.ubuntu.com/community/OpenVPN

Charlie Hosner 的“SSL VPN 和 OpenVPN:许多谎言和一丝真相”:www.linux.com/archive/feature/48330

Mick Bauer (darth.elmo@wiremonkeys.org) 是美国最大的银行之一的网络安全架构师。他是 O'Reilly 图书 Linux 服务器安全 第二版(以前称为 使用 Linux 构建安全服务器)的作者,偶尔在信息安全会议上发表演讲,也是“网络工程波尔卡舞曲”的作曲家。

加载 Disqus 评论