1. 介绍
在许多企业环境中,为了更好地控制互联网流量,通常会使用代理服务器。一些代理服务器甚至可以缓存互联网资源,从而减少带宽消耗。
在本教程中,我们将介绍 Web 代理的基本概念、工作原理及其主要类型。
2. 什么是代理服务器?
在深入配置客户端代理之前,我们先回顾一些关键概念。代理服务器是一种软件解决方案,它作为客户端与其他服务端之间的中介。 客户端不再直接访问目标服务器,而是先连接到代理服务器,并由代理将请求转发给目标服务器。
代理服务器的出现可以追溯到现代互联网的早期阶段。当时,网络管理员逐渐意识到信息的自由流动可能带来滥用风险,因此开始尝试对进出特定路由的互联网流量进行过滤。这些方式就是我们今天所熟知的防火墙。
一般来说,防火墙可以通过包过滤(如 iptables)或通过代理服务器实现。两者之间的主要区别在于它们所执行的操作类型。
2.1. 包过滤
包过滤旨在快速、轻量,并通常在内核级别运行。 因此,它在规则应用方面存在一定的限制。
最初的包过滤仅处理网络层和传输层的数据,这意味着只能通过访问控制列表(ACL)来控制 IP 地址和 TCP/UDP 端口。如今,包过滤技术已经可以扩展到 OSI 模型的应用层,从而实现更细粒度的控制。
2.2. 代理
代理则是在用户空间实现的,能够应用非常复杂的规则。 例如,它可以完全识别用户、应用程序、协议操作、内容过滤等。代理甚至可以建立企业级缓存,以减少带宽使用。此外,它还可以进行查询,判断某个目标服务的访问是否被策略允许,以及在什么条件下允许访问。
例如,我们可以设定:在午休时间允许特定用户组访问游戏服务器,并限制带宽上限。
2.3. 代理的工作方式
下图展示了普通互联网访问代理服务器的示意图,对比了非代理连接与代理连接的区别:
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. 总结
通过本教程我们了解到,代理服务器是企业网络安全的重要工具,广泛用于降低网络风险。 它们不仅能提升安全性,还能优化性能。
理解代理的工作原理及其不同种类,有助于我们选择最适合的部署方式,并在代理出现故障时快速定位问题。