第 14 章 使用反向代理服务器
本章介绍如何使用 Proxy Server 作为反向代理服务器。反向代理服务器是代理服务器改用于特定目的时的代名称。可以在防火墙外部用它来向外部客户机表示一个安全内容服务器,以防从公司外部直接、不受监视地访问服务器数据。还可以使用它来进行复制,也就是说,可以在高用量服务器前面附加多个代理服务器来进行负载平衡。本章将介绍 Proxy Server 在防火墙内部或外部的替代用法。
本章包括以下各节:
反向代理服务器的工作原理
有两个反向代理模型。一个模型利用 Proxy Server 的安全特性来处理事务,另一个利用其高速缓存特性在高用量服务器上提供负载平衡。这两个模型与代理服务器习惯用法的区别在于它们并不严格在防火墙上运行。
代理服务器充当服务器的替身
如果您的内容服务器具有必须保持安全的敏感信息,如信用卡号数据库,可在防火墙外部设置一个代理服务器作为内容服务器的替身。当外部客户机尝试访问内容服务器时,会将其送到代理服务器。实际内容位于内容服务器上,在防火墙内部受到安全保护。代理服务器位于防火墙外部,在客户机看来就像是内容服务器。
当客户机向站点提出请求时,请求将转到代理服务器。然后,代理服务器通过防火墙中的特定通路,将客户机的请求发送到内容服务器。内容服务器再通过该通道将结果回传给代理服务器。代理服务器将检索到的信息发送给客户机,好像代理服务器就是实际的内容服务器(参见图 14-1)。如果内容服务器返回错误消息,代理服务器会先行截取该消息并更改标头中列出的任何 URL,然后再将消息发送给客户机。如此可防止外部客户机获取内部内容服务器的重定向 URL。
这样,代理服务器就在安全数据库和可能的恶意攻击之间提供了又一道屏障。与有权访问整个数据库的情况相对比,就算是侥幸攻击成功,作恶者充其量也仅限于访问单个事务中所涉及的信息。未经授权的用户无法访问到真正的内容服务器,因为防火墙通路只允许代理服务器有权进行访问。
图 14-1 反向代理服务器就像是真正的内容服务器
可以配置防火墙路由器,使其只允许特定端口上的特定服务器(在本例中为其所分配端口上的代理服务器)有权通过防火墙进行访问,而不允许其他任何机器进出。
安全反向代理
当代理服务器与其他机器之间有一个或多个连接使用安全套接字层 (SSL) 协议加密数据时,即会进行安全反向代理。
安全反向代理有许多用途:
安全反向代理会造成各安全连接因加密数据所涉及的系统开销而变慢。但是,由于 SSL 提供了高速缓存机制,所以连接双方可以重复使用先前协商的安全参数,从而大大降低后续连接的系统开销。
配置安全反向代理服务器的方法有三种:
Secure client to proxy。如果未经授权的用户很少或根本没有机会访问代理服务器与内容服务器之间交换的信息,则此方案很有效(参见图 14-2)。
图 14-2 客户机安全连接到代理服务器
Secure proxy to content server。如果客户机在防火墙内部而内容服务器在防火墙外部,则此方案很有效。在此方案中,代理服务器可以充当站点之间的安全通道(参见图 14-3)
图 14-3 代理服务器安全连接到内容服务器
- Secure client to proxy and secure proxy to content server。如果需要保护服务器、代理服务器和客户机三者间所交换信息的安全,则此方案很有效。在此方案中,代理服务器既可起到站点间安全通道的作用,又可增加客户机验证的安全性(参见图 14-4)。
图 14-4 客户机安全连接到代理服务器并且代理服务器安全连接到内容服务器
有关如何设置上述每种配置的信息,参见设置反向代理服务器。
除了 SSL 之外,代理服务器还可以使用客户机验证,这种方法要求向代理服务器提出请求的计算机提供证书(或标识表单)以核实其身份。
负载平衡代理
可以在一个组织内使用多个代理服务器来平衡各 Web 服务器间的网络负载。在此模型中,可以利用代理服务器的高速缓存特性,创建一个用于负载平衡的服务器池。此时,代理服务器可以位于防火墙的任意一侧。如果 Web 服务器每天都会接收大量的请求,则可以使用代理服务器分担 Web 服务器的负载并提高网络访问效率。
对于客户机发往真正服务器的请求,代理服务器起着中间调停者的作用。代理服务器会将所请求的文档存入高速缓存。如果有不止一个代理服务器,DNS 可以采用“循环复用法”选择其 IP 地址,随机地为请求选择路由。客户机每次都使用同一个 URL,但请求所采取的路由每次都可能经过不同的代理服务器。
可以使用多个代理服务器来处理对一个高用量内容服务器的请求,这样做的好处是内容服务器可以处理更高的负载,并且比其独自工作时更有效率。在初始启动期间,代理服务器首次从内容服务器检索文档,此后,对内容服务器的请求数会大大下降。
只有 CGI 请求和偶发的新请求必须一路直达内容服务器。其余的请求可以由代理服务器进行处理。下面对此进行举例说明。假定对服务器的请求中有 90% 都不是 CGI 请求(这表示它们可以进行高速缓存),而且内容服务器每天都会被命中 2 百万次。在此情况下,如果连接三个反向代理服务器,且每个代理服务器每天处理 2 百万次命中,则每天将能够处理大约 6 百万次命中。请求中有 10% 达到内容服务器,合计约为每个代理服务器每天 200,000 次命中,即总数仅为 600,000,从而效率显著提高。命中次数可从大约 2 百万次增加到 6 百万次,而内容服务器的负载却相应地从 2 百万次减少到 600,000 次。实际结果依具体情况而定。
图 14-5 用于负载平衡的代理服务器
设置反向代理服务器
要设置反向代理服务器,需要两个映射:一个正则映射和一个反向映射。
假定您有一个称为 http://http.site.com/ 的 Web 服务器并且想要为它设置一个反向代理服务器。可以将反向代理服务器称为 http://proxy.site.com/。
需按如下步骤创建一个正则映射和一个反向映射:
- 访问 Server Manager,然后单击 "URLs" 选项卡。
- 单击 "Create Mapping" 链接。将显示 "Create Mapping" 页面。
- 在出现的页面中,输入单个映射的信息。例如:
- 单击 "OK"。返回到页面并创建第二个映射:
- 要进行更改,请单击 "OK"。
Regular mapping:
Source prefix: http://proxy.site.com
Source destination: http://http.site.com/
Reverse mapping:
Source prefix: http://http.site.com/
Source destination: http://proxy.site.com/
单击 "OK" 按钮后,代理服务器即会添加一个或多个附加映射。要查看映射,请单击称为 "View/Edit Mappings" 的链接。附加映射将具有以下格式:
from: /
to: http://http.site.com/
这些附加的自动映射针对的是以常规服务器形式连接到反向代理服务器的用户。第一个映射用于捕捉以常规代理服务器形式连接到反向代理服务器的用户。根据具体设置,通常只有第二个映射是必需的,但是这两个映射并存不会使代理服务器出现问题。
CGI 应用程序仍在原始服务器上运行,代理服务器从不亲自运行 CGI 应用程序。但是,如果 CGI 脚本指示结果可以进行高速缓存(通过发出 Last-modified 或 Expires 标头暗示存活时间非零),则代理服务器将会高速缓存结果。
|
|
注意 |
为 Web 服务器制作内容时,请牢记反向代理服务器也将为该内容提供服务,因此,指向 Web 服务器上文件的所有链接都应为相对链接。HTML 文件中决不能含有对主机名的引用,也就是说,所有链接都必须为页面链接: /abc/def 而不能是全限定主机名,例如: http://http.site.com/abc/def |
|
设置安全反向代理服务器
设置安全反向代理服务器需要具备数字证书、证书授权机构和验证方面的知识。
设置安全反向代理服务器大体上与设置非安全反向代理服务器相同。唯一的区别是需要指定 HTTPS 作为要加密文件的协议。
以下指导说明阐述了如何根据所选择的配置方案来设置安全反向代理服务器。为了演示如何设置映射,这些指导说明假定您有一个称为 http.site.com 的 Web 服务器,并且您想要设置一个称为 proxy.site.com 的安全反向代理服务器。按所述步骤进行操作时,请用您的 Web 服务器和代理服务器的名称替代指示说明中使用的示例名称。
Secure Client to Proxy
- 访问 Server Manager,然后单击 "URLs" 选项卡。
- 单击 "Create Mapping" 链接。将显示 "Create Mapping" 页面。
- 在出现的页面中,采用以下方式设置正则映射和反向映射:
- 保存并应用所做的更改。
Regular mapping:
Source prefix: https://proxy.mysite.com
Source destination: http://http.mysite.com/
Reverse mapping:
Source prefix: http://http.mysite.com/
Source destination: https://proxy.mysite.com/
要查看刚刚创建的映射,请单击称为 "View/Edit Mappings" 的链接。
Secure Proxy to Content Server
- 访问 Server Manager,然后单击 "URLs" 选项卡。
- 单击 "Create Mapping" 链接。将显示 "Create Mapping" 页面。
- 在出现的页面中,采用以下方式设置正则映射和反向映射:
- 保存并应用所做的更改。要查看刚刚创建的映射,请单击称为 "View/Edit Mappings" 的链接。
Regular mapping:
Source prefix: http://proxy.mysite.com
Source destination: https://http.mysite.com/
Reverse mapping:
Source prefix: https://http.mysite.com/
Source destination: http://proxy.mysite.com/
Secure Client to Proxy and Secure Proxy to Content Server
- 访问 Server Manager,然后单击 "URLs" 选项卡。
- 单击 "Create Mapping" 链接。将显示 "Create Mapping" 页面。
- 在出现的页面中,采用以下方式设置正则映射和反向映射:
Regular mapping:
Source prefix: https://proxy.mysite.com
Source destination: https://http.mysite.com/
Reverse mapping:
Source prefix: https://http.mysite.com/
Source destination: https://proxy.mysite.com/
反向代理服务器中的虚拟多重主机
利用虚拟多重主机特性,原始服务器(就本处而言,即为反向代理服务器)可以响应多个 DNS 别名,就好像其中的每个地址都安装了不同的服务器。例如,可有以下 DNS 主机名:
其中的每一个都可以映射到同一 IP 地址(反向代理服务器的 IP 地址)。然后,即可使反向代理服务器根据访问它时所用的 DNS 名做出不同的反应。
虚拟多重主机还允许您将单个反向代理服务器作为多个不同 *域* 的宿主服务器。例如:
请注意,可以将多个本地主机名以及多个域全都组合在单个代理服务器中:
本节包括以下主题:
虚拟多重主机功能详述
为使虚拟多重主机特性起作用,需要先指定 DNS 主机名和域名(或别名),然后给出应将发送给相应主机名的请求定向到的目标 URL 前缀。例如,可有以下两个映射:
映射不必非得是从根到根;可以在目标 URL 中指定附加的 URL 路径前缀:
这同样也适用于虚拟域映射。例如,可以使用:
系统将查看 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 前缀。如果主机名和域名符合上述规定,则会将请求定向至此。
- 如果使用模板,请从 "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,某些客户机软件亦可将其省略,因为服务器显然知道自己正在侦听哪个端口号):
虚拟多重主机重要说明
需要先禁用客户机自动配置特性,才能配置反向代理映射。这样做不会引起任何问题,因为客户机自动配置特性针对的是正向代理操作,而不是反向代理。
虚拟多重主机特性会建立自动反向映射。换言之,请不要为使用 "Virtual Multihosting" 页面输入的映射创建反向映射。
虚拟映射是用 obj.conf 中的 virt-map 函数指定的。
虚拟映射按 obj.conf 配置文件中指定的顺序进行匹配。如果虚拟映射前面有正则、反向、正则表达式或客户机自动配置映射,则会首先应用这些映射。同样,如果在虚拟映射中未找到匹配项,则会继续转换 obj.conf 中虚拟映射部分之后的下一个映射。
如果更改了代理服务器的端口号,则需要重新创建虚拟多重主机映射,因为它们现在的端口号不正确。