Skip to content

代理服务器

代理服务器是介于客户端和服务器之间的中间设备,它代表客户端向服务器发起请求,接收服务器响应后再返回给客户端。在网络架构中,代理扮演着流量中转、协议转换、访问控制等重要角色。

按网络层次分类

应用层代理

应用层代理工作在 OSI 模型的第七层,能够理解应用层协议的内容。最典型的应用层代理是 HTTP 代理,它解析 HTTP 请求和响应,可以根据请求内容进行缓存、过滤、修改等操作。

HTTP 代理分为正向代理和反向代理。正向代理代表客户端访问外部资源,常用于企业内网的上网行为管理和访问控制。反向代理代表服务器接收外部请求,常用于负载均衡、缓存加速、安全防护等场景。Nginx、HAProxy、Traefik 等都是常见的反向代理软件。

应用层代理的优势在于可以深度理解协议内容,实现精细化的流量控制。但也因为需要解析完整的应用层协议,性能相对较低,而且每种应用协议都需要专门的代理实现。

传输层代理

传输层代理工作在第四层,主要处理 TCP 和 UDP 流量。它不关心应用层协议的具体内容,只根据四层信息(源 IP、源端口、目的 IP、目的端口)来转发流量。

四层负载均衡器就是典型的传输层代理,如 Linux Virtual Server (LVS)。LVS 通过修改数据包的目标地址和端口,将流量分发到后端的真实服务器。这种转发方式性能极高,接近线速转发,但无法基于应用层内容做路由决策。

传输层代理的性能优势明显,适合高吞吐、低延迟要求的场景。但由于无法理解应用层协议,无法实现基于内容的路由、会话保持等高级功能。

内核态实现

传统的四层负载均衡器如 LVS (Linux Virtual Server) 直接工作在内核态,通过 Netfilter/IPTables 框架在内核空间处理数据包。LVS 的三种工作模式(NAT、DR、TUN)都在内核完成数据包的修改和转发,性能接近线速。

用户态实现

现代传输层代理如 HAProxy (TCP 模式)、Envoy、Nginx (stream 模块) 运行在用户态,通过系统调用处理网络流量。它们使用 epoll/kqueue 等多路复用技术实现高并发,虽然需要内核态与用户态的上下文切换,但灵活性和可扩展性更好。

混合方案

一些现代方案结合两者优势:

  • eBPF:在内核执行自定义逻辑,用户态程序通过 BPF syscall 加载和更新程序
  • DPDK:绕过内核协议栈,在用户态直接操作网卡,实现极高的吞吐性能

性能对比

  ┌──────────────────┬──────┬────────┬──────────┬────────────────┐
  │     实现方式     │ 性能 │ 灵活性 │ 开发难度 │    代表软件    │
  ├──────────────────┼──────┼────────┼──────────┼────────────────┤
  │ 内核态           │ 最高 │ 低     │ 高       │ LVS, iptables  │
  ├──────────────────┼──────┼────────┼──────────┼────────────────┤
  │ 用户态           │ 较高 │ 高     │ 中       │ HAProxy, Envoy │
  ├──────────────────┼──────┼────────┼──────────┼────────────────┤
  │ 混合 (eBPF/DPDK) │ 极高 │ 中     │ 高       │ Cilium, Katran │
  └──────────────────┴──────┴────────┴──────────┴────────────────┘

网络层代理

网络层代理工作在第三层,主要基于 IP 地址进行路由转发。路由器本质上就是网络层代理,它根据路由表决定数据包的下一跳地址。

在网络层做代理可以实现策略路由、流量工程等功能。Linux 的 iproute2 工具包可以基于源地址、目的地址、服务类型等标记来设置不同的路由策略。这种方式常用于多出口场景,根据业务重要性选择不同的网络链路。

网络层代理透明度最高,客户端完全感知不到代理的存在。但也因为工作层次太低,无法实现基于端口的访问控制,更不用说基于内容的过滤了。

链路层代理

链路层代理工作在第二层,基于 MAC 地址进行转发。二层交换机就是典型的链路层代理,它维护 MAC 地址表,将数据帧转发到正确的端口。

在虚拟化环境中,虚拟交换机(如 Linux Bridge、Open vSwitch)也是链路层代理,它们连接虚拟机和物理网络,实现虚拟机之间的通信。Open vSwitch 甚至支持流表规则,可以实现类似 SDN 的灵活转发控制。

链路层代理速度最快,因为只需要解析数据链路层头部。但作用范围局限在同一个网段内,跨网段通信需要借助三层设备。

透明代理与非透明代理

透明性的本质在于代理实现的层次是否低于通信双方工作的层次。如果代理工作在更低的层次,那么对上层的应用来说就是透明的;如果代理工作在相同或更高的层次,那么应用层就需要感知并配合代理的工作。

透明代理

透明代理工作在比应用层更低的层次,应用层软件完全感知不到代理的存在。例如传输层的 LVS 对应用层的 HTTP 来说是透明的,HTTP 客户端和服务器都不需要做任何修改,流量就能被 LVS 转发。

从实现原理来看,透明代理通过拦截或修改数据包来实现转发。以网络层的路由器为例,它工作在第三层,对传输层的 TCP 和应用层的 HTTP 都是透明的。同样的,传输层的四层负载均衡器对应用层协议也是透明的。

透明代理的优势在于零侵入性,现有系统无需改造就能接入。但缺点是应用层无法主动控制代理行为,比如无法选择特定的代理服务器,也无法实现基于应用层逻辑的智能路由。

非透明代理

非透明代理工作在应用层或需要应用层配合的层次,客户端或服务器必须感知代理的存在并编写相应的代理逻辑。

正向代理是非透明代理的典型代表,客户端需要配置代理服务器的地址,并按照代理协议发送请求。比如使用 HTTP 代理时,客户端需要在请求中包含完整的目标 URL,而不是相对路径。这种模式下,客户端的代码需要专门处理代理逻辑。

反向代理虽然对客户端透明,但对后端服务器来说是非透明的。后端服务器看到的源地址是反向代理的地址,而不是真实客户端的地址。如果需要获取真实客户端信息,需要通过 X-Forwarded-For 等 HTTP 头部或 Proxy Protocol 来传递。

正向代理与反向代理

正向代理和反向代理的划分基于代理代表哪一方,这与代理的透明性密切相关。从层次角度看,正向代理需要在客户端实现代理逻辑,反向代理需要在服务端实现代理逻辑。

正向代理

正向代理代表客户端向服务器发起请求,服务器只知道代理的地址,不知道真实客户端的地址。由于代理工作在应用层,客户端必须感知代理的存在并实现相应的代理逻辑。

以 HTTP 代理为例,客户端发送请求时需要使用完整 URL(包含协议和主机名),而不是相对路径。浏览器配置代理后,会自动将请求发送到代理服务器,代理再转发给目标服务器。这种模式下,客户端应用需要专门处理代理逻辑,是非透明的。

正向代理的主要用途包括访问控制、内容过滤、隐私保护等。在企业网络中,正向代理常用于控制员工上网行为,记录上网记录。在个人场景中,正向代理可以隐藏真实 IP 地址,突破地域限制。常见的正向代理协议包括 HTTP 代理和 SOCKS 代理。

反向代理

反向代理代表服务器接收客户端请求,客户端只知道代理的地址,不知道真实服务器的地址。反向代理工作在传输层或应用层,对客户端来说是透明的(如果是传输层),但对后端服务器来说是非透明的。

Nginx 是最常用的反向代理软件之一,它可以根据请求内容将流量分发到不同的后端服务器,实现负载均衡。同时,Nginx 可以缓存静态内容,减轻后端服务器压力,还可以作为 SSL 终结点,处理 HTTPS 加密解密。

反向代理是现代互联网架构的重要组成部分,几乎所有大型网站都在使用。通过反向代理,可以将流量均匀分发到多台服务器,提高系统的处理能力和可用性。与正向代理不同,反向代理对客户端透明,客户端不需要任何配置修改。

代理协议

SOCKS 协议

SOCKS (Socket Secure) 是一种通用的代理协议,支持 TCP 和 UDP 流量。SOCKS5 是当前广泛使用的版本,相比 SOCKS4 增加了认证、IPv6、UDP 支持等功能。

SOCKS5 的工作流程包括协商阶段、认证阶段、请求阶段。客户端首先与 SOCKS 服务器协商支持的版本和认证方式,然后进行认证,最后发送目标地址和端口,服务器建立连接后开始转发数据。

SOCKS 代理的优势在于协议简单、支持任意应用层协议。但由于工作在会话层,无法理解应用层内容,无法实现 HTTP 缓存、内容过滤等功能。常见的 SOCKS 代理软件包括 Shadowsocks、 Dante 等。

HTTP 代理协议

HTTP 代理协议是专门为 HTTP 设计的代理协议。客户端通过 CONNECT 方法建立与代理的连接,然后发送完整的 HTTP 请求,代理转发请求并返回响应。

HTTP 代理可以解析 HTTP 请求和响应的内容,实现缓存、过滤、修改等操作。例如,代理可以缓存静态资源,减少重复请求;可以过滤广告和恶意内容;可以添加或删除 HTTP 头部。

HTTPS 流量经过 HTTP 代理时,代理无法查看加密内容,只能转发加密数据。如果代理需要检查 HTTPS 内容,需要使用 SSL 中间人代理,这需要在客户端安装代理的证书,存在安全风险。

Proxy Protocol

Proxy Protocol 是 HAProxy 推出的一个协议,用于在代理和后端服务器之间传递客户端真实信息。在传统的七层代理场景中,后端服务器看到的源地址是代理的地址,而不是真实客户端的地址。

Proxy Protocol 在建立连接后,代理先发送一个包含客户端 IP、端口等信息的小头部,然后开始发送真实数据。后端服务器解析这个头部,就能获取真实的客户端信息。

这个协议简单高效,已被 Nginx、HAProxy、Envoy 等主流代理软件支持。在云原生环境中,当请求经过多层代理时,Proxy Protocol 可以保证真实客户端信息不丢失。

代理在工程实践中的应用

在微服务架构中,服务网格的控制平面和数据平面本质上是一种高级代理。数据平面的 sidecar 代理拦截所有进出流量,实现服务发现、负载均衡、熔断降级、灰度发布等功能。这种代理模式虽然增加了网络延迟,但大大提升了系统的可观测性和可控性。

在 CDN 场景中,边缘节点就是分布在全球的代理服务器。用户请求被路由到最近的边缘节点,边缘节点缓存热点内容,减少回源流量,提升访问速度。这种分布式代理架构是支撑全球互联网内容分发的基础设施。

在开发调试场景中,代理工具也是必不可少的。Charles、Fiddler、mitmproxy 等抓包工具本质上就是 HTTP/HTTPS 代理,它们拦截和显示请求内容,帮助开发者分析网络问题。ssh 的 ProxyCommand 也可以通过代理跳转,访问内网主机。