在以前的 developerWorks 文章 “Secure remote data access for Domino®” 中,我们讨论了如何利用 Apache Web 服务器以节约预算的方式解决企业问题。(参见 参考资料 中的链接。)在本文中,我们继续讨论这个主题,解释在一台通过一块物理网卡连接到网络的服务器上,如何使用 Apache Web 服务器提供多个 Secure Sockets Layer(SSL)Web 站点。
为什么需要在一台服务器上安置多个 SSL 站点?确实有企业需要在一台服务器上托管多个 SSL 站点吗?我们将通过一个真实的场景来解释这些问题。有创新精神的用户肯定会为这种思想找到更新颖的用途。
在我们公司早期的一个项目中,人力资源(HR)部门希望为一个基于 Web 的福利应用程序提供外部互联网访问。用户大多是从公司网络内部访问这个 Web 应用程序的,但是偶尔也会通过外部互联网访问它。为了满足安全需求,我们决定将这个应用程序放在公司网络内部的一台服务器上,使用 Apache 的 HTTP 服务器构建一个反向代理服务器。反向代理服务器会终止 SSL 连接,再重新打开另外一个到托管 HR 应用程序的 Web 应用服务器的 SSL 连接。通过在 Apache Web 服务器中添加 mod_security 模块,即可将反向代理服务器改为应用网关,并为 Web 应用程序提供更高的安全性。HR 部门精心挑选了一个完全限定域名(FQDN),这个域名是用户友好的,易于记忆。随后,我们继续向前推进,获得了 SSL 证书,我们认为一切就这样圆满结束了。
一年的时间很快就过去了。另一个企业 Web 应用程序出现了,它的需求与 HR 应用程序极为相似。它也需要为外部用户提供访问能力。外部用户的数量非常少。大多数访问都是在公司网络中进行的。我们立刻想到使用反向代理服务器为这个新的 Web 应用程序提供外部访问。
但是,这个新的应用程序有点儿麻烦。首先,我们很关心数据中心的物理空间,竭力在一切应用程序的部署中寻求整合服务器的机会。其次,我们必须证明购买额外的反向代理服务器是值得的。这两个因素结合在一起,促使我们仔细研究如何使用现有的反向代理服务器满足新 Web 应用程序的需求。惟一的问题是,这个应用程序需要一个与现有 HR 应用程序不同的 FQDN。
我们研究了几种为新的 Web 应用程序使用现有反向代理服务器的方法。第一种想法是,将新旧两个应用程序的域名都改为某个通用域名,比如 rp.company.com,并用上下文路径区分这两个应用程序。但是,原来的反向代理服务器用户强烈反对改变域名。如果改变域名,他们必须将域名变更情况通知公司中的所有人,还要修改所有印刷资料,以反映新的 URL。改变域名的成本非常高,而且可能会影响客户支持部门,他们不可避免地会收到大量用户投诉。另外,两个应用程序组都希望保留自己的 FQDN,他们认为自己精心选择的 FQDN 比这种一般化的 URL 更醒目,而且也是宣传推广这些 Web 应用程序的有效手段。
另一个想法是:为什么不注册一个 DNS 入口,让它将新的域名指向现有的服务器?这个想法很快就被否决了。在 SSL 应用程序中,SSL 证书必须与用户请求的 URL 匹配,否则会弹出一个警告消息,指出所请求的 URL 与 SSL 证书的域名不匹配。由于弹出式广告和恶意软件日益猖獗,公司中每个训练有素的人都会取消产生弹出警告框的 Web 交互。根据公司架构标准的要求,生产性 Web 应用程序严禁生成弹出警告消息。
另一个建议是:使第二个 SSL 站点驻留在运行第一个站点的服务器的不同端口上。但是,我们觉得这会给用户带来过多的困扰,用户很难同时记住站点 URL 和端口号。如果用户只输入 URL 而没有输入端口号,他们就会被重定向到 HR 应用程序。这会导致很多问题。
|
最终敲定的解决方案是 IP 别名(IP aliasing)。在寻找这个解决方案时,最需要技巧的部分就是确定正确的术语。最初引入这个概念时,我们听到了虚拟接口(virtual interface) 和虚拟 IP(virtual IP) 等术语。我们艰难地寻找着关于这些概念的信息;但我们最终意识到,我们正在寻找的东西是通常被称为 IP 别名功能的概念,这帮助我们找到了关于该主题的更多文献。IP 别名有时候也称为网络接口别名(network interface aliasing) 或逻辑接口(logical interface)。
|
IP 别名背后的概念很简单:可以在一个网络接口上配置多个 IP 地址。这样就能够在使用单一接口的同一个服务器上运行多个 Web 服务器。设置 IP 别名也非常容易。只需配置系统上的网络接口,让它监听额外的 IP 地址。在 Linux™ 系统上,可以使用标准的网络配置工具(比如 ifconfig
和 route
命令)添加 IP 别名,也可以利用图形化网络管理工具。
在一般情况下,会为每块以太网卡配置一个物理单元号。要想在已经配置的以太网卡上添加额外的 IP 别名,应该为一个接口配置同样的物理单元号,但是要用一个逻辑单元号来限定它。例如,如果在物理单元号为 eth0 的以太网卡上已经配置了一个现有的 IP 地址,那么可以通过添加一个逻辑单元号 :1 来创建 IP 别名,如清单 1 所示。可以通过递增逻辑单元号来添加更多的 IP 地址。(注意,需要作为 root 用户登录。)
清单 1. 在现有的网络接口上添加额外的 IP 地址
ifconfig eth0:1 192.168.0.2 netmask 255.255.255.0 |
在您正在配置的系统上,Linux 内核必须支持 IP 别名,这样才能使用这种技术。如果内核没有提供这种支持,可能需要重新构建内核。要想了解您的内核是否支持 IP 别名,可检查 /proc/net/alias* 文件是否存在。
配置了新的 IP 地址之后,要为新的接口设置路由,如清单 2 所示。
清单 2. 为新的 IP 地址添加路由
route add -host 192.168.0.2 dev eth0:1 |
在创建新的 IP 地址之后,还需要在 /etc/hosts 文件中给这个新地址命名,如清单 3 所示。
清单 3. 为新的 IP 地址命名
192.168.0.1 primaryserver 192.168.0.2 secondaryserver |
要想在 Solaris™ 上设置 IP 别名,使用的命令稍有不同。网络接口的配置如清单 4 所示。需要作为 root 用户登录。
清单 4. 在 Solaris 上添加虚拟 IP
ifconfig eth0:1 plumb ifconfig eth0:1 192.168.0.2 netmask 255.255.255.0 ifconfig eth0:1 up |
为了让虚拟 IP 在重启之后仍然有效,可以将 /etc/hosts 中的 IP 地址或主机名添加到 /etc/hostname.eth0:1 文件中。
在 Linux 和 Solaris 系统上,可以在一块物理以太网卡上创建多个虚拟接口,让它们连接到不同子网上的 IP 地址。但是,通常应该避免这么做,因为这会成为两个子网之间的瓶颈,而且这两个子网上的所有网络设备的性能都会因此受损。
|
配置了第二个 IP 地址之后,可以按照 IP 地址将额外的 SSL 站点添加到 Apache Web 服务器的配置文件中,如清单 5 所示。
这样就行了!我们已经在同一台服务器、同一块物理网卡上构建了多个 SSL Web 站点。
清单 5. 两个 SSL Web 站点的配置
<IfModule mod_ssl.c> Listen 443 <VirtualHost 192.168.0.1:443> DocumentRoot "/Web site1/docs" ServerName Web site1.company.com:443 SSLEngine on SSLCertificateFile ssl/site1.crt SSLCertificateKeyFile ssl/site1.key </VirtualHost> <VirtualHost 192.168.0.2:443> DocumentRoot "/Web site2/docs" ServerName Web site2.company.com:443 SSLEngine on SSLCertificateFile ssl/site2.crt SSLCertificateKeyFile ssl/site2.key </VirtualHost> </IfModule> |
|
由于我们的 Apache Web 服务器上的通信流量很低,因此可以利用这个反向代理服务器为后端具有类似低流量需求的更多服务器服务。
更大、更强的服务器和网卡不断涌现,带宽容量也比以往更高,因此也可以用这种方法来托管多个虚拟 SSL 站点。如果客户具有提供小额零售业务的低流量站点,而且需要 SSL 安全性,那么您可以为其设置一个提供有限带宽 SSL 站点的 ISP。可以利用 IP 别名在一个 IP 地址上驻留一个 SSL Web 站点,在另一个地址上提供其他服务,比如 Web 服务。其他可能性还包括设置一个主生产系统和一个故障转移系统,从而形成备用的 QA 系统和/或 DR 系统。现在,您已经理解了 IP 别名背后的基本概念,那么在设计应用程序时,也就有了更广阔的可能性。
学习
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文 。
- “IBM HTTP Server (powered by Apache): An integrated solution for IBM eServer iSeries servers”:研读这个 redbook 可以帮助您计划、安装、配置、调试和理解在 IBM iSeries 服务器上运行的 Apache HTTP 服务器。
- “Beyond performance testing, Part 13: Testing and tuning load balancers and networks”(Scott Barber,developerWorks,2004 年 6 月):了解如何在客户端使用 IP 别名进行性能测试。
- “Secure remote data access for Domino”(John Liao,developerWorks,2003 年 7 月):学习如何让远程用户能够访问敏感数据。
- “A day in the life of #Apache”(Rich Bowen,ONLamp.com,2005 年 2 月):这篇文章讨论了在 Apache 中运行基于名称的 SSL 虚拟主机的相关问题。
- “Web security appliance with Apache and mod_security”(Ivan Ristic,Security Focus,2003 年 10 月):学习如何用反向代理保护 Web 应用程序。
- developerWorks Web 开发专区:通过专注于 Web 技术方面的文章和教程来扩展您的站点开发技能。
- developerWorks 技术活动和网络广播:随时关注这些技术活动,以此加快学习进度并改进软件项目的品质和结果。