下一步 上一步 目录

2. 背景知识

2.1 什么是 VPN?

虚拟专用网络,或 “VPN”,是一种隧道,它将专用网络流量从一个端点系统传输到另一个端点系统,通过公共网络(如互联网),而流量不会意识到端点之间存在中间跃点,或者中间跃点意识到它们正在传输正在穿越隧道的网络数据包。隧道可以选择性地压缩和/或加密数据,从而提供增强的性能和一定程度的安全性。

“虚拟” 部分源于您正在公共网络上构建专用链路,而不是实际购买通过租用线路的直接硬连线链路。VPN 允许您假装您正在使用租用线路或直接电话呼叫在端点之间进行通信。

您可以在 http://kubarb.phsx.ukans.edu/~tbird/vpn/FAQ.html 找到 VPN 常见问题解答,内容丰富。

2.2 什么是 IPsec?

IPsec 是一组标准协议,用于实现计算机之间安全通信和加密密钥交换。它可用于实现 VPN。

IPsec VPN 通常由端点主机之间的两个通信通道组成:一个密钥交换通道,通过该通道传递身份验证和加密密钥信息;以及一个或多个数据通道,通过该通道传输专用网络流量。

密钥交换通道是与端口 500 进行的标准 UDP 连接。在客户端和服务器之间传输流量的数据通道使用 IP 协议号 50 (ESP)。

更多信息可在 F-Secure 的 IPsec 常见问题解答中找到:http://www.Europe.F-Secure.com/support/vpn+/faq/techfaq.html,以及 RFC2402(AH 协议,IP 协议号 51)、RFC2406(ESP 协议,IP 协议号 50)和 RFC2408(ISAKMP 密钥交换协议)。

IPsec 是一种对等协议。但是,由于大多数人将以仅发起 Windows 客户端的形式接触到它,该客户端用于访问中央网络安全网关,因此“客户端”将用于指用户坐在前面的端点主机,而“服务器”将用于指中央网络安全网关。

重要提示:如果您的 VPN 基于 AH 协议(包括 AH+ESP),则无法进行伪装。AH 协议指定了跨越 IP 报头部分(包括 IP 地址)的加密校验和。IP 伪装通过修改出站数据包的源 IP 地址和入站数据包的目标 IP 地址来实现。由于伪装网关无法参与加密密钥交换,因此它无法为修改后的 IP 报头生成正确的加密校验和。因此,修改后的 IP 数据包将被接收者丢弃,因为它们未能通过加密校验和测试。

2.3 什么是 PPTP?

PPTP 代表 议。它是 Microsoft 提出的用于实现 VPN 的协议。

PPTP VPN 协议由客户端和服务器之间的两个通信通道组成:一个控制通道,通过该通道传递链路管理信息;以及一个数据通道,通过该通道传输(可能已加密的)专用网络流量。

控制通道是与服务器上端口 1723 的标准 TCP 连接。传输专用网络流量的数据通道使用 IP 协议号 47 (GRE),这是一种通用封装协议,在 RFC1701 中进行了描述。数据通过数据通道的透明传输是通过在其上协商标准 PPP 连接来实现的,就像它是从客户端到服务器的直接拨号连接一样。通过 PPP 协商隧道上的选项控制数据是否被压缩和/或加密,因此 PPTP 本身与加密无关。

PPTP 协议的详细信息记录在 RFC2637 中。

Microsoft 的 PPTP 协议实现被认为不是很安全。如果您对详细信息感兴趣,这里有三个独立的分析

http://www.counterpane.com/pptp.html

http://www.geek-girl.com/bugtraq/1999_1/0664.html

http://oliver.efri.hr/~crv/security/bugs/NT/pptp2.html

2.4 什么是 FWZ?

FWZCheck Point 软件技术有限公司 开发的专有加密协议。它用于围绕其 Firewall-1 产品构建的 VPN 中。

基于 Checkpoint 的防火墙可以配置为多种模式。“FWZ 封装”模式不能被伪装。“IKE” 模式使用标准 IPsec 协议,可以通过 VPN 网关上的少量配置更改进行伪装。

2.5 为什么要伪装 VPN 客户端?

大多数当前的 VPN 客户端都假定您将客户端计算机直接连接到互联网。当您只有一个互联网连接时这样做会绕过您的 Linux 防火墙及其提供的安全性和访问共享功能。扩展 Linux 防火墙以同时伪装 VPN 流量,使您能够保留 Linux 防火墙提供的防火墙安全性,并允许本地网络上的其他系统访问互联网,而不管 VPN 网络连接是否处于活动状态。

如果您的防火墙正在公司环境中使用,您可能还希望要求您的 VPN 客户端用户通过该防火墙,以出于安全原因,而不是为他们提供调制解调器,以便他们在需要使用 VPN 时可以自行拨出。即使桌面没有注册的 IP 地址,VPN 伪装也允许您这样做。

2.6 本地网络上的多个客户端可以同时使用 IPsec 吗?

是的,尽管偶尔可能会出现小问题。

IPsec 协议定义了一种用于识别流量流的方法,称为安全参数索引(“SPI”)。不幸的是,出站流量使用的 SPI 与入站流量使用的 SPI 不同,并且没有其他未加密的识别信息可用,因此入站和出站数据流的关联很困难且不是完全可靠的。

IPsec 伪装尝试通过序列化新连接来关联入站和出站 ESP 流量。虽然这在测试中效果良好,但不能保证完全可靠,并且新流量的序列化可能会导致某些超时,如果链路饱和或许多本地 IPsec 主机尝试同时与同一远程 IPsec 主机启动通信或重新密钥。

还假定,如果此关联方案未能正确关联流量流,则 IPsec 主机本身将丢弃错误路由的流量,因为它将具有错误的 SPI 值。IPsec RFC 要求这样做。

如果有一种方法可以在任何 ESP 流量出现之前从 ISAKMP 密钥交换中嗅探新的 SPI 值,则可以消除这些问题,但不幸的是,密钥交换的该部分已加密。

为了最大限度地减少与此相关的问题,建议您在伪装的 IPsec 主机上打开一个命令窗口,并运行 “ping” 程序,ping 远程网络上的主机,只要您的隧道处于活动状态。

有关更多详细信息,请参阅文档末尾的 IPsec 技术注释。

2.7 本地网络上的多个客户端可以同时使用 PPTP 吗?

是的。

您必须在配置内核时启用 PPTP 呼叫 ID 伪装,以便区分来自同一服务器的多个数据流。启用呼叫 ID 伪装的 PPTP masq 将支持许多并发伪装会话,而对客户端可以呼叫哪个服务器没有限制。

PPTP RFC 在 3.1.3 节中规定,两个系统之间只能有一个控制通道连接。这应该意味着您一次只能伪装与给定远程服务器的一个 PPTP 会话,但实际上,MS 的 PPTP 实现并未强制执行此操作,至少在 NT 4.0 Service Pack 4 中是这样。如果您尝试连接的 PPTP 服务器一次只允许一个连接,则它正确地遵循了协议规则。请注意,这不会影响伪装服务器,只会影响尝试联系同一远程服务器的多个伪装客户端。

有关另一种选择,请参阅下一个问题...

2.8 我可以从整个本地网络访问远程网络吗?

是的。但是,您的 VPN 客户端必须能够转发 IP 流量。

这意味着您要么必须使用 Linux VPN 客户端,要么使用 MS NT VPN 客户端。W'95 和 W'98 中的 IP 堆栈不支持 IP 转发。NT Workstation 可以工作,如果您仅将其用于路由加密流量,则比 NT Server 便宜。

如果您无法安装基于 Linux 或 NT 的 VPN 客户端,那么如果您使用 PPTP,则必须启用 PPTP 呼叫 ID 伪装,并在您要为其提供访问权限的每个系统上安装 VPN 客户端软件。这是低效的、令人厌恶的、安全漏洞,如果 PPTP 服务器正确实现协议,则可能无法工作,但它比许可 NT 便宜。

这种网络到网络路由效果非常好。这就是我设置家庭网络进行远程办公的方式。它确实需要比简单地为每个人提供自己的 VPN 客户端更多的网络知识。

根据我的经验,纯 MS 环境中的网络到网络路由需要在隧道的两端都安装 RRAS。

2.9 为什么要伪装 VPN 服务器?

如果您的 VPN 服务器具有注册的 IP 地址,则无需伪装它,只需配置您的防火墙以正确路由 VPN 流量,如下所述。

如果您的 VPN 服务器具有专用网络 IP 地址,则您需要将入站流量重定向到它并伪装来自它的出站流量。伪装允许您使 VPN 服务器可用于互联网,即使您只有一个分配的 IP 地址。即使您的 IP 地址是动态分配的,这也应该有效:您将通过使用第三方动态 DNS 服务(例如 DDNS.ORGCJB.NET 提供的服务)公布客户端的 IP 地址,并将客户端配置为连接到名为 our-company.ddns.org 或类似名称的系统。请注意,这是一个安全风险,因为可能会由于时序问题、未能正确注册当前动态 IP 地址或第三方在系统名称下注册不同的 IP 地址而从动态 DNS 服务器检索到错误的 IP 地址。

2.10 为什么要修补 Linux 内核?

伪装 VPN 流量的最大问题是,标准的 Linux IP 伪装对 TCP、UDP 和 ICMP 以外的 IP 协议没有特殊的感知能力。

所有 IP 流量都可以通过 IP 地址转发和过滤,但伪装 TCP、UDP 和 ICMP 以外的 IP 协议需要修改内核。

PPTP 控制通道是纯 TCP,除了让它通过防火墙并伪装它之外,不需要任何特殊设置。

伪装 IPsec 和 PPTP 数据通道需要修改,以向伪装代码添加对 ESP 和 GRE 协议的支持,而伪装 ISAKMP 密钥交换协议需要修改,以防止伪装更改 UDP 源端口号,并添加 ISAKMP cookie 值而不是端口号的跟踪。

2.11 当前状态

2.0.x 内核补丁适用于内核 2.0.36,并已合并到标准 2.0.37 和更高版本的内核发行版中。它可能适用于更早的内核,但我没有对其进行测试,如果您正在运行较旧的内核,我建议您无论如何升级到内核 2.0.38 以出于安全原因。

2.2.x 内核补丁适用于从 2.2.5 到 2.2.17 的内核,并且可能适用于更早的内核,但这尚未经过测试。它已提交以包含在标准 2.2.18 版本中。

我没有资源来跟踪开发内核,因此目前尚未进行针对 2.3.x 或 2.4.x 的 VPN 伪装工作。如果您认识正在从事这项工作的人,请告诉我。

2.0.x 内核补丁已经过测试,可在 x86 和 Sparc 系统上运行,并且 2.2.x 内核补丁已经过测试,可在 x86 和 PowerPC 系统上运行,但移植到其他架构应该没有重大问题。我相信架构依赖性仅在于用于格式化调试日志消息的 GRE 报头定义中的字节序。如果有人将其移植到非 Intel 架构,我将不胜感激,以便我可以将任何更改合并到主副本中。

适用于 2.1.105+ 和早期 2.2.x 内核的仅 PPTP 内核补丁可在 http://bmrc.berkeley.edu/people/chaffee/linux_pptp.html 获取。

有关 VPN Masq 补丁的状态,请参阅 VPN 伪装主页 http://www.impsec.org/linux/masquerade/ip_masq_vpn.html,有关 2.1.105+/2.2.x 仅 PPTP Masq 补丁的状态,请参阅 http://bmrc.berkeley.edu/people/chaffee/linux_pptp.html


下一步 上一步 目录