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 也可以通过代理跳转,访问内网主机。