本章介绍如何将 Proxy Server 用作反向代理。可以在防火墙外部使用反向代理来向外部客户机提供一个安全内容服务器,以防从公司外直接、不受监视地访问服务器数据。此外,还可以使用反向代理进行复制;也就是说,可以在高用量服务器前面附加多个代理服务器来进行负载平衡。本章将介绍 Proxy Server 在防火墙内部或外部的替代用法。
本章包含以下各节:
您可以使用两种不同方法进行反向代理。一种方法利用 Proxy Server 的安全性功能来处理事务。另一种方法使用高速缓存在高用量服务器上提供负载平衡。这两种方法均有别于惯用的代理用法,因为它们并不严格在防火墙上运行。
如果您的内容服务器具有必须保持安全的敏感信息(如信用卡号数据库),可在防火墙外部设置一个代理作为内容服务器的替身。当外部客户机试图访问内容服务器时,会将其送到代理服务器。实际内容位于内容服务器上,在防火墙内部受到安全保护。代理服务器位于防火墙外部,在客户机看来就像是内容服务器。
当客户机向站点提出请求时,请求将转到代理服务器。然后,代理服务器通过防火墙中的特定通路,将客户机的请求发送到内容服务器。内容服务器再通过该通路将结果回传给代理。代理将检索到的信息发送给客户机,就像代理是实际的内容服务器一样,如图 14–1 中所示。如果内容服务器返回错误消息,代理服务器可截取该消息并更改标头中列出的任何 URL,然后再将消息发送给客户机。这种措施可防止外部客户机获取内部内容服务器的重定向 URL。
通过这种方式,代理就在安全数据库和可能存在的恶意攻击之间提供了另一道屏障。如果侥幸攻击成功,作恶者充其量也仅限于访问单个事务中所涉及的信息,而不至于获得整个数据库的访问权。未经授权的用户无法到达真正的内容服务器,因为防火墙通路仅允许代理服务器有权进行访问。
您可以配置防火墙路由器,使其只允许特定端口上的特定服务器(在本例中为其所分配端口上的代理)有权通过防火墙进行访问,而不允许任何其他计算机进出。
当代理服务器与其他计算机之间的一个或多个连接使用安全套接字层 (Secure Sockets Layer, SSL) 协议加密数据时,将会进行安全反向代理。
安全反向代理具有许多用途:
提供从防火墙外部的代理服务器到防火墙内部的安全内容服务器的加密连接
允许客户机安全地连接到代理服务器,协助信息(如信用卡号)的安全传输
由于加密数据时占用开销,因此安全反向代理将会降低各安全连接的速度。但是,因为 SSL 提供了高速缓存机制,所以连接双方可以重复使用先前协商的安全性参数,从而大大降低了后续连接的开销。
客户机安全连接到代理。如果未经授权的用户很少或根本没有机会访问代理与内容服务器之间交换的信息,则此方案很有效,如下图所示。
代理安全连接到内容服务器。如果客户机在防火墙内部而内容服务器在防火墙外部,则此方案很有效。在此方案中,代理服务器可以充当站点之间的安全通道,如下图所示。
客户机安全连接到代理并且代理安全连接到内容服务器。如果需要保护服务器、代理和客户机之间交换的信息的安全,则此方案很有效。在此方案中,代理服务器既可充当站点间的安全通道,又可增加客户机验证的安全性,如下图所示。
有关如何设置上述每种配置的信息,请参见设置反向代理。
除了 SSL 之外,代理还可以使用客户机验证,这种方法要求向代理提出请求的计算机提供证书或其他形式的标识以验证其身份。
您可以在组织中使用多个代理服务器来平衡 Web 服务器之间的网络负载。此模型将利用代理服务器的高速缓存功能创建一个用于负载平衡的服务器池。在这种情况下,代理服务器可以位于防火墙的任意一侧。如果 Web 服务器每天都会收到大量请求,则可以使用代理服务器分担 Web 服务器的负载并提高网络访问效率。
代理服务器充当发往真正服务器的客户机请求的媒介。代理服务器会高速缓存所请求的文档。如果有多个代理服务器,DNS 可以采用“循环复用法”选择其 IP 地址,随机地为请求选择路由。客户机每次都使用同一个 URL,但请求所采取的路由每次都可能经过不同的代理。
使用多个代理来处理对某个高用量内容服务器的请求的优点在于,该服务器可以处理更繁重的负载,并且比其独自处理时的效率更高。在初始启动期间,代理首次从内容服务器检索文档,此后,对内容服务器的请求数会大大下降。
只有 CGI 请求和偶发的新请求必须一路直达内容服务器。其余的请求可以由代理进行处理。例如,假定对服务器的请求中有 90% 都不是 CGI 请求(这表示它们可以进行高速缓存),而且内容服务器每天都会被命中 2 百万次。在此情况下,如果连接三个反向代理,并且每个代理每天处理 2 百万次命中,则每天将能够处理大约 6 百万次命中。请求中有 10% 到达内容服务器,合计约为每个代理每天 200,000 次命中,即总数仅为 600,000 次,从而大大提高效率。命中次数可从约 2 百万次增加到 6 百万次,而内容服务器的负载可相应地从 2 百万次减少到 600,000 次。实际结果依具体情况而定。
要设置反向代理,需要两个映射:正则映射和反向映射。
正则映射用于将请求重定向到内容服务器。当客户机从代理服务器请求文档时,代理服务器需要通过正则映射来获知应从何处获取实际文档。
请不要将反向代理与提供自动配置文件的代理一起使用,因为该代理可能会返回错误的结果。
反向映射用于指示代理服务器为来自内容服务器的重定向设置陷阱。代理将截取重定向,然后更改重定向的 URL 以映射到代理服务器。例如,如果客户机所请求的文档已移动或未找到,内容服务器将向客户机返回一条消息,说明它无法在请求的 URL 处找到该文档。在该返回消息中,内容服务器会添加一个 HTTP 标头,其中列出了用于获取已移动文件的 URL。为了保持内部内容服务器的保密性,代理服务器可以使用反向映射重定向该 URL。
假定您有一个称为 http://http.site.com/ 的 Web 服务器,并且要为其设置反向代理服务器。可以将该反向代理称为 http://proxy.site.com/。
访问 Server Manager 并单击 "URLs" 选项卡。
单击 "Create Mapping" 链接。
此时将显示 "Create Mapping" 页面。
在显示的页面中,为正则映射提供源前缀和源目标。
例如,
源前缀:http://proxy.site.com
源目标:http://http.site.com/
单击 "OK"。
返回该页面并创建反向映射,例如,
反向映射:
源前缀:http://http.site.com/
源目标:http://proxy.site.com/
要进行更改,请单击 "OK"。
单击 "OK" 按钮后,代理服务器即会添加一个或多个附加映射。要查看映射,请单击 "View/Edit Mappings" 链接。附加映射将具有以下格式:
from: /
to: http://http.site.com/
这些附加的自动映射针对的是以常规服务器形式连接到反向代理的用户。第一个映射用于捕捉以常规代理形式连接到反向代理的用户。仅当用户不更改管理 GUI 自动提供的 "Map Source Prefix" 文本框的内容时,才会添加 "/" 映射。根据具体设置,通常只有第二个映射是必需的,但是附加映射不会导致代理出现问题。
如果 Web 服务器具有多个 DNS 别名,每个别名都应有一个对应的正则映射。如果 Web 服务器使用自身的多个 DNS 别名生成重定向,则其中每个别名都应有一个对应的反向映射。
CGI 应用程序仍在原始服务器上运行。代理服务器从不自行运行 CGI 应用程序。但是,如果 CGI 脚本指示结果可以进行高速缓存(通过发出上次修改或到期标头暗示生存时间非零),代理将会高速缓存结果。
为 Web 服务器制作内容时,请牢记反向代理也将为该内容提供服务,因此,指向 Web 服务器上的文件的所有链接都应为相对链接。请不要在 HTML 文件中引用主机名。所有链接都只能由页面组成:
/abc/def
而不能是全限定主机名,例如:
http://http.site.com/abc/def
您可以为反向代理模式下发生的错误提供自定义错误页面。这些错误页面将替代由代理生成的错误。这样可防止客户机了解到已经配置了代理服务器。
设置安全反向代理之前,应熟悉数字证书、证书授权机构和验证。
设置安全反向代理与设置非安全反向代理几乎相同。唯一的区别在于需要将 HTTPS 指定为要加密文件的协议。
此过程说明如何根据所选配置方案设置安全反向代理。为了演示如何设置映射,以下说明假定您有一个称为 http.site.com 的 Web 服务器,并且要设置一个称为 proxy.site.com 的安全反向代理服务器。按所述步骤进行操作时,请使用您的 Web 服务器名称和代理名称替代指示中使用的示例名称。
访问 Server Manager 并单击 "URLs" 选项卡。
单击 "Create Mapping" 链接。
此时将显示 "Create Mapping" 页面。
在显示的页面中,采用以下方式设置正则映射和反向映射:
正则映射:
源前缀:https://proxy.mysite.com
源目标:http://http.mysite.com/
反向映射:
源前缀:http://http.mysite.com/
源目标:https://proxy.mysite.com/
保存并应用所做的更改。
要查看刚创建的映射,请单击 "View/Edit Mappings" 链接。
此配置仅在代理服务器以安全模式运行时才有效。换言之,必须启用加密并且必须从命令行重新启动代理。要从命令行重新启动代理,请转到代理目录,然后键入 ./start。
访问 Server Manager 并单击 "URLs" 选项卡。
单击 "Create Mapping" 链接。
此时将显示 "Create Mapping" 页面。
在显示的页面中,采用以下方式设置正则映射和反向映射:
正则映射:
源前缀:http://proxy.mysite.com
源目标:https://http.mysite.com/
反向映射:
源前缀:https://http.mysite.com/
源目标:http://proxy.mysite.com/
保存并应用所做的更改。
要查看刚创建的映射,请单击称为 "View/Edit Mappings" 的链接。
此配置仅在内容服务器以安全模式运行时才有效。
访问 Server Manager 并单击 "URLs" 选项卡。
单击 "Create Mapping" 链接。
此时将显示 "Create Mapping" 页面。
在显示的页面中,采用以下方式设置正则映射和反向映射:
正则映射:
源前缀:https://proxy.mysite.com
源目标:https://http.mysite.com/
反向映射:
源前缀:https://http.mysite.com/
源目标:https://proxy.mysite.com/
保存并应用所做的更改。
要查看刚创建的映射,请单击称为 "View/Edit Mappings" 的链接。
此配置仅在代理服务器和内容服务器以安全模式运行时有效。换言之,对于代理,必须启用加密并且必须从命令行重新启动代理。要从命令行重新启动代理,请转到代理目录,然后键入 ./restart。
如果将某个代理服务器实例配置为反向代理服务器,该代理服务器实例在默认情况下不会停止其正向代理服务器的功能。此类服务器实例会接受并处理反向代理请求和正向代理请求。要禁用正向代理功能,需要执行进一步配置。可设置一个 ACL 配置,用于拒绝 URI 与正向代理格式相匹配的那些请求。为此,可使用 Client 指令:
<Client uri="http://.*"> PathCheck fn="check-acl" acl="http://.*" <Client> . . . The "http://.*" ACL can be a deny all ACL as follows: . . acl "http://.*"; deny (all) user="anyone";
利用虚拟多重主机功能,原始服务器(如反向代理服务器)可以响应多个 DNS 别名,就好像其中的每个地址都安装了不同的服务器。例如,假定您有以下 DNS 主机名:
www
specs
phones
其中每个主机名都可以映射到同一 IP 地址(反向代理的 IP 地址)。然后,反向代理可以根据访问它时使用的 DNS 名称执行不同操作。
虚拟多重主机还允许您将单个反向代理服务器作为多个不同 *域* 的宿主服务器。例如:
www.domain-1.com
www.domain-2.com
www.domain-3.com
可以将多个本地主机名以及多个域全部组合在单个代理服务器中:
www
specs
phones
www.domain-1.com
www.domain-2.com
www.domain-3.com
为运行虚拟多重主机功能,需要先指定 DNS 主机名和域名(或别名),然后指定应将发送给该主机名的请求定向到的目标 URL 前缀。例如,假定您有以下两个映射:
engr.domain.com -> http://int-engr.domain.com
mktg.domain.com -> http://int-mktg.domain.com
映射不必从根到根。可以在目标 URL 中指定附加的 URL 路径前缀:
engr.domain.com -> http://internal.domain.com/engr
mktg.domain.com -> http://internal.domain.com/mktg
该方法同样适用于虚拟域映射。例如,可以使用:
www.domain-1.com -> http://int-engr.domain.com
www.domain-2.com -> http://int-mktg.domain.com
系统将查看 HTTP "Host:" 标头,并根据该标头选择匹配的虚拟多重主机映射。如果没有匹配的多重主机映射,服务器将按映射在配置文件中的出现顺序继续查看其他映射。如果仍未找到任何匹配项,服务器将不执行映射。找不到任何匹配项时,代理通常会发出 "Proxy denies fulfilling the request" 响应。
访问 Server Manager 并单击 "URLs" 选项卡。
单击 "Configure Virtual Multihosting" 链接。
此时将显示 "Configure Virtual Multihosting" 页面。
在 "Source Hostname (alias)" 字段中,指定此映射将应用到的本地主机名(或 DNS 别名)。
在 "Source Domain Name" 字段中,键入此映射将应用到的本地域名。
通常,此名称为您自己网络的域名,除非您要对多个不同的 DNS 域使用多重主机。
在 "Destination URL Prefix" 字段中,键入目标 URL 前缀。如果主机名和域名符合上述规范,则会将请求定向到此 URL。
如果使用模板,请从 "Use This Template" 下拉式列表中选择模板名称;如果不想应用模板,请将该值保留为 "NONE"。
单击 "OK"。
单击 "Restart required"。
将会显示 "Apply Changes" 页面。
单击 "Restart Proxy Server" 按钮以应用更改。
对要建立的每个虚拟多重主机映射重复上述步骤。
所有虚拟多重主机映射都将显示在 "Configure Virtual Multihosting" 页面的底部。"Source Hostname (alias)" 和 "Source Domain Name" 字段连同代理的端口号被合并成单个正则表达式,用于匹配 "Host:" 标头,
例如,如果主机名为 www、域为 example.com 且端口号为 8080,则会显示以下正则表达式:
www(|.example.com)(|:8080)
此正则表达式可以保证与用户可能键入或客户机可能发送的以下所有可能组合匹配。即使端口号不是 80,某些客户机软件也可能将其省略,因为服务器正在侦听该端口。
www
www:8080
www.example.com
www.example.com:8080
配置反向代理映射之前,需要禁用客户机自动配置功能。客户机自动配置功能用于正向代理操作,而不是反向代理。
虚拟多重主机功能会建立自动反向映射。请不要为使用 "Virtual Multihosting" 页面提供的映射创建反向映射。
虚拟映射是使用 obj.conf 文件中的 virt-map 函数指定的。
虚拟映射按 obj.conf 配置文件中指定的顺序进行匹配。如果虚拟映射前面有正则映射、反向映射、正则表达式映射或客户机自动配置映射,则会首先应用这些映射。同样,如果在虚拟映射中未找到任何匹配项,则会继续转换 obj.conf 中虚拟映射部分之后的下一个映射。
按照规范顺序,反向映射位于其他映射之前。
如果更改了代理服务器的端口号,则需要根据新端口号重新创建虚拟多重主机映射。