1. 介绍

在许多企业环境中,为了更好地控制互联网流量,通常会使用代理服务器。一些代理服务器甚至可以缓存互联网资源,从而减少带宽消耗。

在本教程中,我们将介绍 Web 代理的基本概念、工作原理及其主要类型。

2. 什么是代理服务器?

在深入配置客户端代理之前,我们先回顾一些关键概念。代理服务器是一种软件解决方案,它作为客户端与其他服务端之间的中介。 客户端不再直接访问目标服务器,而是先连接到代理服务器,并由代理将请求转发给目标服务器。

代理服务器的出现可以追溯到现代互联网的早期阶段。当时,网络管理员逐渐意识到信息的自由流动可能带来滥用风险,因此开始尝试对进出特定路由的互联网流量进行过滤。这些方式就是我们今天所熟知的防火墙。

一般来说,防火墙可以通过包过滤(如 iptables)或通过代理服务器实现。两者之间的主要区别在于它们所执行的操作类型。

2.1. 包过滤

包过滤旨在快速、轻量,并通常在内核级别运行。 因此,它在规则应用方面存在一定的限制。

最初的包过滤仅处理网络层和传输层的数据,这意味着只能通过访问控制列表(ACL)来控制 IP 地址和 TCP/UDP 端口。如今,包过滤技术已经可以扩展到 OSI 模型的应用层,从而实现更细粒度的控制。

2.2. 代理

代理则是在用户空间实现的,能够应用非常复杂的规则。 例如,它可以完全识别用户、应用程序、协议操作、内容过滤等。代理甚至可以建立企业级缓存,以减少带宽使用。此外,它还可以进行查询,判断某个目标服务的访问是否被策略允许,以及在什么条件下允许访问。

例如,我们可以设定:在午休时间允许特定用户组访问游戏服务器,并限制带宽上限。

2.3. 代理的工作方式

下图展示了普通互联网访问代理服务器的示意图,对比了非代理连接与代理连接的区别:

Image showing direct connection in contrast with proxied connections

3. 代理类型

和任何复杂软件一样,代理也有多种分类方式。下面我们介绍几种主要的类型。

3.1. 按数据流向分类

根据数据流向,代理服务器可分为:

  • 正向代理(Forward/Outbound Proxy):用于过滤或控制组织内部发起的、指向外部服务器的流量。本文主要关注客户端如何配置此类代理。常见的软件包括 Squid、Privoxy、Tinyproxy,甚至可以是 Apache 的 mod_proxy 模块或 Nginx。一些匿名工具如 Tor 也是通过代理实现的。SSH 也有自己的代理模式。
  • 反向代理(Reverse/Inbound Proxy):用于保护内部服务免受外部流量攻击,可以分担实际服务器的任务。常见用途包括静态内容托管、数据流压缩、加密/解密(如 TLS/SSL)、会话认证、负载均衡等。常见软件包括 HAProxy、Apache、Nginx 和 Kubernetes Ingress。

3.2. 按支持的协议分类

根据所支持的协议,代理服务器可分为:

  • 单协议代理(Single Protocol):专为特定协议或服务设计
  • 多协议代理(Multi-Protocol):可以连接多个目标系统

3.3. 按部署方式分类

根据部署方式,代理服务器可分为:

  • 透明代理(Transparent Proxy):网络默认网关拦截出站数据包,并强制通过代理服务器
  • 自动发现代理(Auto-Discoverable Proxy):通过 Web Proxy Auto-Discovery(WPAD)协议实现。网络管理员创建一个 Proxy Auto Configuration 文件(PAC,类似 JavaScript 的脚本),用于告诉兼容客户端如何找到代理服务器。此配置可能使用 DHCP 或 DNS 查询来提供 PAC 文件的 URL
  • 自动部署代理(Auto-deployed Proxy):通过企业级管理工具(如 Microsoft 组策略)部署
  • 手动配置代理(Manually Configured Proxy):用户需手动提供代理设置

此外,代理也可以要求用户认证或不认证。认证方式通常与 Web 服务器所支持的相同。

大多数操作系统(如 Windows、Linux、Mac OS)都有自己的代理配置方式。但应用程序层面也应具备代理支持功能,否则需要额外的辅助工具。

4. 代理 URI

与任何互联网资源一样,代理服务器也通过统一资源定位符(URL)来描述。 常见的代理 URL 格式如下:

<Schema>://[<user>[:<password>]@]<Host|IP地址>[.<域名>]:<端口号>/

其中,Schema 表示访问代理所使用的协议,常见类型包括:

  • HTTP 或 HTTPS
  • SOCKS

SOCKS 协议还可以根据代理服务器版本(如 4、4a、5)加上后缀。例如,socks5h 表示代理服务器负责进行 DNS 解析。

5. HTTPS 流量

我们可能会疑惑:在代理连接中,客户端与目标服务器之间没有端到端的直接连接,HTTPS 是如何通过代理工作的?

如我们在 HTTPS 教程 中所述,SSL/TLS 加密连接的协商发生在客户端和服务器之间。因此,一旦数据流被加密,中间节点(包括代理)就无法解密其内容。

为了解决这个问题,标准做法是:客户端连接到代理后发送 CONNECT 命令,代理随后与目标服务器建立连接,并在两个连接之间转发数据包。 一旦 SSL/TLS 握手完成,代理就无法获取通信内容。这意味着代理的许多功能(如缓存、压缩、内容过滤)无法在 HTTPS 流量中生效。

一种替代方案是将代理配置为中间人(MITM)模式,也称为 SSL bumping。在这种模式下,代理使用临时生成的证书伪装成目标服务器。此时,实际上是建立了两条 SSL 连接:客户端到代理,代理到服务器。要使该模式正常工作,客户端必须信任代理所使用的 CA。

⚠️ 虽然 SSL bumping 可以让代理获得完整功能,但它也意味着代理可以读取用户的全部内容,包括密码、信用卡号、个人信息等。

因此,除非有特殊需求,否则不建议启用此模式,因为其安全风险远大于收益。

6. Web 代理自动发现(PAC 文件与 WPAD)

很多组织希望使用易于配置和部署的代理系统。透明代理虽然在客户端配置上较为简单,但在网络层配置复杂,对边界路由器或防火墙造成额外负担,也增加了代理服务器本身的复杂性。

这就引入了 Web Proxy Auto-Discovery(WPAD)机制,它包含两个核心组件:

  • Proxy Auto Configuration(PAC)文件:用于定义代理选择规则
  • Web Proxy Auto-Discovery Protocol(WPAD):用于通知客户端如何获取 PAC 文件

6.1. PAC 文件

PAC 文件 是一种类似 JavaScript 的脚本,它通过实现 FindProxyForURL(url, host) 函数来决定使用哪个代理或是否直接连接。

PAC 文件可以使用函数获取客户端的元数据(如 IP 地址、网络)、进行 DNS 查询、获取当前时间等。这使得规则可以非常精细。

⚠️ 但 PAC 文件是在运行时解释执行的,因此每次请求都会带来一定的延迟。此外,PAC 文件中的错误可能导致难以排查的问题。部分浏览器提供了专门的调试模式来辅助调试。

6.2. WPAD 协议

WPAD 用于广播客户端应从何处获取 PAC 文件。广播方式可以是 DHCP 或 DNS。

在 Windows 桌面中,该功能默认启用,且可以通过组策略轻松部署。Linux 系统目前主要在图形界面中支持 WPAD。

7. 总结

通过本教程我们了解到,代理服务器是企业网络安全的重要工具,广泛用于降低网络风险。 它们不仅能提升安全性,还能优化性能。

理解代理的工作原理及其不同种类,有助于我们选择最适合的部署方式,并在代理出现故障时快速定位问题。


原始标题:Introduction to Web Proxies