设置 VPN 网关

作者:Duncan Napier

虚拟专用网络 (VPN) 是一种工具,可以在不受信任的网络(如 Internet)上安全地传输数据。VPN 通常用于将局域网 (LAN) 连接到使用 Internet 的广域网 (WAN)。也许您需要在两个办公室之间构建 VPN,但不确定与企业级 VPN 解决方案相关的大型基础设施成本是否合理。旨在通过 LAN 使用的应用程序(例如,使用网络文件共享的应用程序)的性能可能会在 WAN 连接上严重降低。同样,WAN 连接中较低的带宽和更长的延迟可能会对群件和瘦客户端应用程序的可靠性和性能产生不利影响。也许您有一个家庭办公室,并且希望使用您的高速互联网接入,通过支持 IPSec 的路由器无缝且安全地连接到您的办公室 LAN。或者,也许您只是对 VPN 和 IPSec 一般感到好奇并想进行实验。

本文讨论的 VPN 防火墙几乎可以在任何配备 16MB 或更多主内存和两张 Linux 兼容以太网网卡的 486 或更高配置的 PC 上运行。其理念是从一个独立的软件包开始,让您能够创建稳健、安全、可扩展且高度可配置的 VPN,这些 VPN 也可与许多常见的商业 VPN 实施方案互操作。如果您希望在低维护的防火墙-VPN 网关上进行实验,那么本文讨论的软件包可能非常适合您。

本文向您展示了如何以最低的成本设置一个使用 IETF(互联网工程任务组)的 IPSec(互联网协议安全)规范的工作 VPN 网关。IPSec 是一种开放标准,几乎所有主要的防火墙软件和硬件供应商都支持它,例如 Lucent、Cisco、Nortel 和 Check Point。此软件包将为您提供广泛互操作的 IPSec,它使用事实上的标准 3DES 加密、MD5 身份验证的站点到站点或点到站点 VPN。您应该能够在不求助于完整的 Linux 发行版或使用内核 IPSec 模块重新编译标准 Linux 内核的情况下完成此操作。

我们在此处检查的 VPN 系统基于 FreeS/WAN (www.freeswan.org),它是 IPSec 规范的可移植、开源实现。FreeS/WAN 已被证明可以与思科 IOS 12.0 及更高版本的路由器、Nortel Contivity 交换机、OpenBSD、Raptor 防火墙、Check Point FW-1、SSH Sentinel VPN 1.1、F-Secure VPN、Xedia 接入点、PGP 6.5/PGPnet 及更高版本、IRE SafeNet/SoftPK、Freegate 1.3、Borderware 6.0、TimeStep PERMIT/Gate 2520、Intel Shiva LanRover、Sun Solaris 和 Windows 2000 在不同程度上互操作。FreeS/WAN 官方网站有一个定期更新的兼容性列表,其中包含其在线文档的最新版本。此软件包中包含 FreeS/WAN 1.5 版。

我创建了一个单磁盘发行版,它安装了基于 Linux Router Project (LRP, www.linuxrouter.org) 的 VPN 防火墙的基本配置,LRP 是一个紧凑的 Linux 发行版,可以安装在单个可引导的软盘上。此处的发行版本质上是 Charles Steinkuehler 的 Eiger 磁盘映像,带有 Steinkuehler 的支持 IPSec 的内核和 LRP IPSec 软件包。防火墙功能通过 Linux ipchains 执行。此特定版本基于 Linux 的 2.2.16 内核。此发行版称为 DUCLING(基于软盘的超紧凑型 Linux IPSec 网络网关)。紧凑型 Linux 发行版有着曲折的历史。LRP 在技术上指的是 Dave Cinege 的紧凑型发行版。周围有很多变体,包括 Charles Steinkuehler 的 Matthew Grant 废弃的 Eiger 版本 ( lrp1.steinkuehler.net) 的发行版 (EigerStein)。另一个这样的发行版是 David Douthitt 的 Oxygen (leaf.sourceforge.net/content.php?menu=900&page_id=1)。此外,还有 LEAF(Linux 嵌入式设备防火墙),这是一个开发人员的保护伞,试图协调发布和文档,有点像紧凑型 Linux 发行版的一站式商店 (leaf.sourceforge.net)。我使用术语 LRP 来指代此处介绍的紧凑型 Linux 发行版,即使有些人可能认为这种术语不正确。

如果您运行的是 MS Windows 9x,则该发行版会自解压并安装到标准的 3.5 英寸高密度软盘上。如果您有运行 Linux 的系统,也可以将映像写入引导软盘。提取完成后,您将需要从您创建的软盘启动,复制您的网卡的网络驱动程序,并编辑相应的配置文件。就是这样——无需创建和格式化磁盘分区或处理硬盘驱动器上的启动管理器。如果您对该发行版不满意,只需弹出软盘,将其丢弃(或重新格式化)并重新启动您的 PC。查看 leaf.sourceforge.net/devel/thc 上的链接,了解有关这些选项的更多信息。

防火墙和 VPN 的背景知识

此 LRP 发行版使用基于标准 ipchains 的防火墙。 ipchains (在 2.4 系列内核中被 iptables 取代——参见 David A. Bandel 的“驯服野性的 Netfilter”,《LJ》,2001 年 9 月)是 Linux 的免费分发数据包过滤器。如果您不熟悉此防火墙工具,那么通读 ipchains HOWTO 非常有启发意义。可以在 www.linuxdoc.org/HOWTO/IPCHAINS-HOWTO.html 找到它。

VPN 由 FreeS/WAN 的 IPSec 实现提供。FreeS/WAN 的 IPSec 实现符合 IETF 的 IPSec 规范。IPSec 是互联网协议 (IP) 的扩展,它提供身份验证和加密。三个协议用于处理加密和身份验证,即 ESP(封装安全有效载荷)、AH(身份验证标头)和 IKE(互联网密钥交换)。所有这些组件都包含在 FreeS/WAN 的 IPSec 实现中,并且通常对最终用户是透明的。ESP 和 AH 处理加密和身份验证,而 IKE 协商连接参数,包括加密密钥的初始化、处理和续订。FreeS/WAN 当前唯一支持的加密方案是 3DES(三重 DES 或数据加密标准——当前 IPSec 加密的事实标准)。身份验证使用所谓的共享密钥(共享密钥)的 MD5 摘要进行。共享密钥可以是相互约定的字符串、RSA 密码密钥对或 X.509 证书。FreeS/WAN 的 KLIPS(内核 IPSec)组件(已编译到 Linux 内核中)实现了 AH、ESP 和数据包处理。IKE 进程处理密钥协商,而续订在 FreeS/WAN 的独立 pluto 守护程序中实现。

要求和安装

首先,您需要一台带有软盘驱动器(我只测试过 3.5 英寸软盘驱动器)和两张网卡的 PC。LRP(发行版)的要求很低,不需要功能强大的 PC。任何 Intel 486 级或更高配置且具有 8MB 以上 RAM 的机器都可以。您还需要两张软盘。可靠的高密度 3.5 英寸软盘应该可以,例如 AOL 的促销软盘。我从未使用通用软盘驱动器遇到任何问题,但我发现使用 Imation USB U2 SuperDisk 驱动器将发行版写入软盘时遇到了一些问题。

您需要从 ftp.cinemage.com/pub 下载相应的 DUCLING.tgz/zip 发行版,并提取存档文件的内容。如果您有静态 IP 地址,则下载静态版本,如果您被分配了动态 IP 地址,则需要带有 DHCP 客户端的发行版。如果您运行的是 Windows 9x,请下载 ducling-stat-W9x-1-0.zip 或 ducling-dyn-W9x-1-0.zip。使用 Winzip (www.winzip.com) 提取 .tgz 文件将生成一个文件 ducling-dyn-1-0.exe 或 ducling-stat-1-0.exe 和目录模块。.exe 文件是一个自解压映像,它格式化软盘并将映像写入该磁盘。运行 ducling-stat-1-0.exe 或 ducling-dyn-1-0.exe 文件,并将软盘放入软盘驱动器。请注意,磁盘上的任何数据都将被覆盖。

如果您使用的是 MS-DOS 或 Windows 3.1,如果您希望读取和写入 1,722KB 格式的磁盘,则必须首先在 DOS 级别加载 TSR 实用程序 FDREAD.EXE。FDREAD.EXE 是 Christoph H. Hochstätter 的免费软件程序。

如果您运行的是 Linux,请下载 ducling-dyn-1-0.tgz 或 ducling-stat-1-0.tgz,解压映像(此处的示例适用于启用 DHCP 的动态 IP 地址发行版)

tar xvfz ducling-dyn-1-0.tgz

并将映像文件 ducling-1-0.img 使用 Linux fdformat 和 dd 命令写入格式化的软盘

fdformat /dev/fd0u1722
dd if=ducling-dyn-1-0.ima of=/dev/fd0u1722
如上所述创建软盘映像后,您将获得一张可引导的 Linux 软盘。

名为模块的 zip 文件/目录包含所需的网络驱动程序模块以及用于防火墙伪装的可选模块。将模块 zip 文件或目录的内容复制到单独的第二张 MS-DOS 格式的软盘上,用于本文档的配置部分(如下)。在 Linux 中,通过运行以下命令格式化第二张软盘

fdformat /dev/fd0

然后

mkdosfs /dev/fd0
并挂载软盘驱动器并将模块复制过去。阅读 README 文件中包含的文档,其中将为您提供有关配置防火墙/路由器的详细信息。

如果您无法将所有想要的软件包和模块安装到单张软盘上,则需要检查使用双软盘(请参阅 DUCLING 发行版中包含的 README 文件)、可引导 CD-ROM 甚至小型硬盘驱动器的替代设置。有关更多信息,请参阅 LRP 文档的在线资源。

LRP 启动软盘——令人惊讶的真相

您可能会惊讶地发现 LRP 使用 DOS 格式的软盘。您甚至可能会更惊讶地发现 DUCLING 发行版以 1,722KB 可引导磁盘映像的形式安装自身。3.5 英寸高密度软盘在技术上是 2MB 格式的介质,您可能会看到这些软盘的额定容量为 2MB “原始”或“未格式化”容量。1,440KB 格式化容量仅仅是传统格式的结果,该格式在磁介质上写入 80 条磁道,每条磁道 18 个扇区。使用适当的工具,您可以创建每扇区有 80 个扇区和 24 条磁道的软盘,每张软盘提供 1,920KB。具有 1,680KB(每扇区 80/21 扇区/磁道)的软盘经常用于 LRP 发行版,并且似乎具有可靠的记录;1,722KB (82/21)、1,743KB (83/21) 和 1,760KB (80/22) 据报道也在使用中。我发现 1,722KB 格式的软盘对于测试来说足够可靠,到目前为止没有任何问题报告。

我创建并使用了高达 1,920KB 的大格式软盘。超大格式软盘往往不可引导,显然是由于 PC BIOS 与软盘上非标准扇区大小之间存在冲突的结果。据报道,大于 1,680KB 的大格式软盘可能会遇到软盘硬件可靠性问题。据报道,Windows NT 和 Windows 2000 在写入大于 1,680KB 的大格式软盘时存在可靠性问题。

MS Windows 9x 操作系统通常无需配置更改即可读取标准格式和大格式软盘。在 Linux 系统中,通常需要指定正确的格式来挂载软盘,即 /dev/fd0u1722,其中 fd0u1722 指定软盘设备 0 (fd0),而 u1722 指定 1,722KB 格式。Linux 中的标准软盘驱动器 /dev/fd0 默认为 /dev/fd0u1440,即 1,440KB 格式。

有关创建和操作大格式软盘的信息,请查阅 Paul Batozech 的 LRP 启动盘 HOWTO。您可以在 leaf.sourceforge.net/devel/thc 列出的资源中找到此内容和其他有用的文章。对于 MS Windows,我发现 Gilles Vollant 的 WinImage (www.winimage.com) 特别有用且用户友好。但是,在某些方面,它比 Linux 工具(如 fdformat、mkdosfs 和更新的 superformat 应用程序)更受限制。此处讨论的用于 MS Windows 的自解压 1,722KBps 映像是使用 WinImage 创建的。

LRP 发行版如何加载

在您开始使用 LRP 之前,了解发行版的工作原理很有用。如果您检查可引导的软盘,您将看到一系列文件,包括 ldlinux.sys、linux、syslinux.cfg、root.lrp、etc.lrp、modules.lrp 和 local.lrp。

文件 ldlinux.sys 是引导程序加载器,它将内核(名为 linux 的文件)和初始 root.lrp 软件包加载到内存中。内核启动并创建一个 RAM 磁盘,并提取 root.lrp 软件包。RAM 磁盘是分配为分区的内存部分。换句话说,内核在内存中创建一个空间,并将其视为读/写磁盘。然后,内核挂载 syslinux.cfg 中指定的引导设备。引导磁盘上剩余的 .lrp 软件包按照 syslinux.cfg 中的指定提取并加载到 RAM 磁盘。 .lrp 软件包只是标准的 UNIX tarball(tar-gzip 存档)。一旦 .lrp 软件包安装在 RAM 磁盘上的目录树中,系统就会基于标准 Linux rc 文件引导层次结构开始引导。

LRP 只是一个精简的标准 Linux 内核,带有可加载模块和包含在 .lrp 软件包集中的其他软件。LRP 确实是 Linux;通常,任何可以在通用 Linux 发行版上运行的东西都应该可以从 LRP 软盘上运行。通常,扩展 LRP 的应用程序和功能的障碍是单张软盘的空间限制。如果您需要额外的功能,例如通过 ssh 进行远程管理、DNS 服务器等等,您将需要查看可用的 LRP 多磁盘、CD-ROM 甚至全磁盘驱动器发行版。

路由器/防火墙 VPN 的启动和配置

创建可引导的软盘后,请确保将软盘放入您希望运行防火墙/VPN 的计算机的软盘驱动器中。确保 BIOS 配置为从软盘启动。启动防火墙/VPN 后,您将看到 LRP 启动画面、来自 Linux 加载程序的各种消息,然后是登录提示符。

如果您已走到这一步,恭喜您!您已成功安装 LRP 发行版。现在您可以开始配置 LRP 的防火墙属性,如捆绑文档中所述。

一旦完成任何防火墙调整,就需要配置 VPN。捆绑的 DUCLING 文档讨论了配置子网到子网设置的详细信息。这涉及配置 IPSec 的身份验证模式 (/etc/ipsec.secrets)、IPSec 网络配置 (/etc/ipsec.conf) 以及允许访问端口 500 (UDP)、50 和 51 (TCP) 的防火墙规则。

请注意,您不一定需要静态 IP 地址才能运行 VPN 链接。下一节中描述了一种“路战士”配置,其中一个 VPN 客户端具有不确定的静态 IP 地址。我已经在具有动态分配 IP 地址的节点对之间运行了 VPN。如果两个 IP 地址分配都频繁更改,则具有 DHCP 分配 IP 地址的 VPN 节点的管理将变得棘手。以下部分讨论了使用 DUCLING 和基于 Microsoft 的 IPSec 客户端的路战士配置。

互操作性示例

此示例显示了使用 SSH Communications Security Sentinel 1.1 (Public Beta 3) 的 MS Windows 9x/2000 客户端点到站点连接。FreeS/WAN 可与各种 IPSec 实施方案互操作。实施的简易性和可计算性将因产品而异。许多通过 IKE 支持 3DES/MD5 加密的 IPSec 产品都可以与 FreeS/WAN 互操作。但是,我发现合法获取支持强加密的完全功能的 IPSec 实施方案可能很困难,特别是如果您居住在美国境外。

许多供应商仅在其免费提供的 IPSec 实施方案中提供有限的功能。例如,产品可能仅支持弱加密 (DES) 或可能将 VPN 功能限制为仅传输模式。区分 IPSec 提供的两种 VPN 模式非常重要:传输模式和隧道模式。传输模式加密和验证两个固定端点之间的流量。隧道模式对于连接子网更有用,并允许隧道通过防火墙和路由器参数进入不同的子网。基本上,传输模式将流量限制为点对点通信。隧道模式还允许点对站点(点对子网)或站点对站点通信。至少有一家供应商似乎不允许其 IPSec 实施方案通过使用静态 IP 地址的连接运行。

SSH Communications Security Sentinel 产品 (www.ipsec.com) 似乎没有这些问题,可能是因为该公司位于美国境外。我下载并测试了 Sentinel 1.1 的 30 天试用版 Beta 3 版本,发现它在 Windows 98 桌面 PC 上非常容易配置。Sentinel 文档提供了与 FreeS/WAN VPN 网关互连的配置示例。

以下是路战士配置的摘要,该配置允许具有动态分配 IP 地址的远程用户透明地连接到防火墙后面的 LAN。您将需要打开端口 50、51 (TCP) 和端口 500 (UDP) 到动态 IP 地址或 ISP 的 DHCP 地址范围。图 1 显示了基本设置。您将需要在 DUCLING FreeS/WAN 防火墙上编辑 /etc/network.conf(进入 lrcfg,选择 1),然后选择 1) 并设置

eth0_IP_SPOOF=NO

以禁用隧道数据包的阻止。捆绑的文档包含有关如何执行这些任务的详细说明。

Setting up a VPN Gateway

图 1. 路战士到站点配置

FreeS/WAN ipsec.conf 文件的内容在清单 1 中给出。相应的 ipsec.secrets 文件包含条目

1.2.3.4 0.0.0.0: PSK "Put your roadwarrior secret
string here"

其中引号中的短语是共享密钥字符串。IP 地址 0.0.0.0 表示任何 IP 地址,因此请记住选择安全的共享密钥字符串。rightsubnet 和 rightnexthop 参数留空,这意味着连接是点到子网连接。

清单 1. 图 1 中所示设置的 FreeS/WAN 连接列表。

要设置 Sentinel IPSec 服务

  1. www.ipsec.com 下载 SSH Sentinel 并按照说明进行安装。

  2. 进入 Sentinel 策略管理器(图 2)。

    Setting up a VPN Gateway

    图 2. Sentinel 策略管理器

  3. 选择“密钥管理”选项卡,“身份验证密钥”,然后选择“添加”(图 3)。

    Setting up a VPN Gateway

    图 3. 添加新密钥

  4. 选择“创建新的预共享密钥”,然后单击“下一步”(图 4)。

    Setting up a VPN Gateway

    图 4. 配置预共享密钥

  5. 键入您的预共享密钥。它必须与您在 /etc/ipsec.conf 中插入的共享密钥字符串相同(不带引号)。(请参见图 5。)

    Setting up a VPN Gateway

    图 5. 键入共享密钥

  6. 按“完成”。

  7. 在 SSH Sentinel 策略管理器的主控制台上,在“安全策略”窗格中,选择“VPN 连接®添加”。

  8. 输入远程 VPN 网关的 IP/主机名;对于我们的示例,它是 1.2.3.4,并选择您在步骤 5 中创建的预共享密钥作为身份验证密钥(图 6)。

    Setting up a VPN Gateway

    图 6. 输入密钥和 UP 信息

  9. 分别选择 3DES 加密,“主模式”和“MODP 1024”作为 IKE 模式和 IKE 组。“高级”窗格通常可以保留默认值。

  10. 将 IKE SA 生存期(即,重新密钥之间的间隔)设置为与 ipsec.conf 文件中相同的值,通常为 480 分钟(八小时)。

保存所有设置并尝试 ping 防火墙后面的内部节点(尝试内部接口 192.168.x.254)。您应该已连接。尝试运行 Sentinel 的诊断程序以确保您已连接。我发现 Sentinel 的诊断模式有时会挂起 FreeS/WAN-Windows 连接。如果发生这种情况,请转到 FreeS/WAN 网关并重新启动 IPSec,然后启动各种连接。

Setting up a VPN Gateway

图 7. VPN 连接属性选项卡

再次,如果您需要重新启动连接,请登录到 LRP 框并键入

#/etc/initd.d/ipsec restart

以重新启动 IPSec 组件。

我还发现在 Windows 2000 Professional(但不是 Windows 98)中,我必须从 DOS 控制台手动添加共享子网 192.168.0.0/24 的路由

route ADD 192.168.0.0 MASK 255.255.255.0 1.2.3.4

(请参阅 Microsoft route 命令的文档)。

结论

本文概述了从单张 3.5 英寸软盘实现防火墙 VPN 网关的方法。使用单张软盘,您应该能够使用 Internet 安全地连接各种拓扑结构的主机和网络。DUCLING 发行版是一个精简的发行版。一旦您确信 FreeS/WAN VPN 可以满足您的需求,您就可以考虑使用功能更全面的 LRP 发行版,甚至功能齐全的 Linux 系统,实施诸如远程访问(例如,通过安全外壳 ssh)或 DNS 服务器之类的功能。

故障排除资源

Setting up a VPN Gateway
电子邮件:napier@napiersys.com

Duncan Napier 运营 Napier Systems Research,这是一家位于加拿大不列颠哥伦比亚省北温哥华的网络和 IT 咨询公司。可以通过 napier@computer.org 与他联系。

加载 Disqus 评论