logologo

21 | 良心中间商:HTTP的代理服务

Nov 1 · 10min

归纳

  1. HTTP 代理就是客户端和服务器通信链路中的一个中间环节,为两端提供“代理服务”;
  2. 代理处于中间层,为 HTTP 处理增加了更多的灵活性,可以实现负载均衡、安全防护、数据过滤等功能;
  3. 代理服务器需要使用字段“Via”标记自己的身份,多个代理会形成一个列表;
  4. 如果想要知道客户端的真实 IP 地址,可以使用字段“X-Forwarded-For”和“X-Real-IP”;
  5. 专门的“代理协议”可以在不改动原始报文的情况下传递客户端的真实 IP。

代理服务器

所谓的“代理服务”就是指服务本身不生产内容,而是处于中间位置转发上下游的请求和响应,具有双重身份:面向下游的用户时,表现为服务器,代表源服务器响应客户端的请求;而面向上游的源服务器时,又表现为客户端,代表客户端发送请求。

代理的作用

由于代理处在 HTTP 通信过程的中间位置,相应地就对上屏蔽了真实客户端,对下屏蔽了真实服务器,简单的说就是“欺上瞒下”。在这个中间层的“小天地”里就可以做很多的事情,为 HTTP 协议增加更多的灵活性,实现客户端和服务器的“双赢”。

  1. 代理最基本的功能负载均衡
    • 健康检查:使用“心跳”等机制监控后端服务器,发现有故障就及时“踢出”集群,保证服务高可用;
    • 安全防护:保护被代理的后端服务器,限制 IP 地址或流量,抵御网络攻击和过载;
    • 加密卸载:对外网使用 SSL/TLS 加密通信认证,而在安全的内网不加密,消除加解密成本;
    • 数据过滤:拦截上下行的数据,任意指定策略修改请求或者响应;
    • 内容缓存:暂存、复用服务器响应。

代理相关头字段

  1. via:请求头和响应头中都可以出现,每当报文经过一个代理节点,代理服务器就会把自身的信息追加到字段的末尾,就像是经手人盖了一个章。
  2. X-Forwarded-For:而“X-Forwarded-For”追加的是请求方的 IP 地址。所以,在字段里最左边的 IP 地址就是客户端的地址。
  3. X-Real-IP:是另一种获取客户端真实 IP 的手段,它的作用很简单,就是记录客户端 IP 地址,没有中间的代理信息,相当于是“X-Forwarded-For”的简化版。如果客户端和源服务器之间只有一个代理,那么这两个字段的值就是相同的。
  4. X-Forwarded-Host:客户端请求的原始域名
  5. X-Forwarded-Proto:原始协议名

代理协议

因为x-Forwarded-For必须要修改请求头,影响性能,所以出现了一个专门的“代理协议”(The PROXY protocol),它由知名的代理软件 HAProxy 所定义,也是一个“事实标准”,被广泛采用(注意并不是 RFC)。

这一行文本其实非常简单,开头必须是“PROXY”五个大写字母,然后是“TCP4”或者“TCP6”,表示客户端的 IP 地址类型,再后面是请求方地址、应答方地址、请求方端口号、应答方端口号,最后用一个回车换行(\r\n)结束。

例如下面的这个例子,在 GET 请求行前多出了 PROXY 信息行,客户端的真实 IP 地址是“1.1.1.1”,端口号是 55555。


PROXY TCP4 1.1.1.1 2.2.2.2 55555 80\r\n
GET / HTTP/1.1\r\n
Host: www.xxx.com\r\n
\r\n

CC BY-NC-SA 4.0 2021 © Promise L