【HTTP协议系列5】httpproxy原理
【HTTP协议系列5】httpproxy原理
Web 代理是⼀种存在于⽹络中间的实体,提供各式各样的功能。现代⽹络系统中,Web 代理⽆处不在。
代理的作⽤
⼀、提⾼访问速度。因为客户要求的数据存于代理服务器的硬盘中,因此下次这个客户或其它客户再要求相同⽬的站点的数据时,就会直接从代理服务器的硬盘中读取,代理服务器起到了缓存的作⽤,对热门站点有很多客户访问时,代理服务器的优势更为明显。
怎样设置代理服务器  ⼆、Proxy可以起到防⽕墙的作⽤。因为所有使⽤代理服务器的⽤户都必须通过代理服务器访问远程站点,因此在代理服务器上就可以设置相应的限制,以过滤或屏蔽掉某些信息。这是局域⽹⽹管对局域⽹⽤户访问范围限制最常⽤的办法,也是局域⽹⽤户为什么不能浏览某些⽹站的原因。拨号⽤户如果使⽤代理服务器,同样必须服从代理服务器的访问限制,除⾮你不使⽤这个代理服务器。
  三、通过代理服务器访问⼀些不能直接访问的⽹站。互联⽹上有许多开放的代理服务器,客户在访问权限受到限制时,⽽这些代理服务器的访问权限是不受限制的,刚好代理服务器在客户的访问范围之内,那么客户通过代理服务器访问⽬标⽹站就成为可能。国内的⾼校多使⽤教育⽹,不能出国,但通过代理服务器,就能实现访问因特⽹,这就是⾼校内代理服务器热的原因所在。
  四、安全性得到提⾼。⽆论是上聊天室还是浏览⽹站,⽬的⽹站只能知道你来⾃于代理服务器,⽽你的真实IP就⽆法测知,这就使得使⽤者的安全性得以提⾼。
代理服务器⼯作流程
1. 当客户端A对web服务器请求时,此端提出请求时,此请求会⾸先发送到代理服务器.
2. 代理服务器接收到客户端请求后,会检查缓存中是否存有客户端所需要的数据.
3. 如果代理服务器没有客户端A所请求的数据,它将会向WEB器提交请求.
4. WEB服务器响应请求的数据.
5. 代理服务器向客户端A转发Web服务器的数据.
6. 客户端B访问web服务器,向代理服务器发出请求.
7. 代理服务器查缓存记录,确认已经存在WEB服务器的相关数据.
8. 代理服务器直接回应查询的信息,⽽不需要再去服务器进⾏查询,从⽽达到节约⽹络流量和提⾼访问的速度⽬的.
Http协议中的代理形式
HTTP 代理存在两种形式,分别如下:
第⼀种是RFC 7230 - HTTP/1.1:Message Syntax and Routing(即修订后的 RFC 2616,HTTP/1.1 协议的第⼀部分)描述的普通代理。这种代理扮演的是「中间⼈」⾓⾊,对于连接到它的客户端来说,它是服务端;对于要连接的服务端来说,它是客户端。它就负责在两端之间来回传送 HTTP 报⽂。
第⼆种是Tunneling TCP basedprotocols through Web proxy servers(通过Web代理服务器⽤隧道⽅式传输基于TCP的协议)描述的隧道代理。它通过HTTP协议正⽂部分(Body)完成通讯,以HTTP的⽅式实现任意基于TCP的应⽤层协议代理。这种代理使⽤ HTTP 的CONNECT ⽅法建⽴连接,但 CONNECT 最开始并不是 RFC 2616 - HTTP/1.1 的⼀部分,直到 2014 年发布的 HTTP/1.1 修订版中,才增加了对 CONNECT 及隧道代理的描述,详见 RFC 7231 - HTTP/1.1: Semantics andContent。实际上这种代理早就被⼴泛实现。
事实上,第⼀种代理,对应《HTTP 权威指南》⼀书中第六章「代理」;第⼆种代理,对应第⼋章「集成点:⽹关、隧道及中继」中的 8.5⼩节「隧道」。
普通代理
原理:HTTP 客户端向代理服务器发送请求报⽂,代理服务器需要正确地处理请求和连接(例如正确处理 Connection:keep-alive),同时向⽬标服务器发送请求,并将收到的响应转发给客户端。
假如我通过代理访问 A ⽹站,对于 A 来说,它会把代理当做客户端,完全察觉不到真正客户端的存在,这实现了隐藏客户端 IP 的⽬的。当然代理也可以修改 HTTP 请求头部,通过 X-Forwarded-IP 这样的⾃定义头部告诉服务端真正的客户端 IP。但服务器⽆法验证这个⾃定义头部真的是由代理添加,还是客户端修改了请求头,所以从 HTTP 头部字段获取 IP 时,需要格外⼩⼼。
给浏览器显式的指定代理,需要⼿动修改浏览器或操作系统相关设置,或者指定 PAC(Proxy Auto-Configuration,⾃动配置代理)⽂件⾃动设置,还有些浏览器⽀持 WPAD(Web ProxyAutodiscovery Protocol,Web 代理⾃动发现协议)。显式指定浏览器代理这种⽅式⼀般称之为正向代理,浏览器启⽤正向代理后,会对 HTTP 请求报⽂做⼀些修改,来规避⽼旧代理服务器的⼀些问题。
还有⼀种情况是访问 A ⽹站时,实际上访问的是代理,代理收到请求报⽂后,再向真正提供服务的服务器发起请求,并将响应转发给浏览器。这种情况⼀般被称之为反向代理,它可以⽤来隐藏服务器 IP 及端⼝。⼀般使⽤反向代理后,需要通过修改 DNS 让域名解析到代理服务器 IP,这时浏览器⽆法察觉到真正服务器的存在,当然也就不需要修改配置了。反向代理是 Web 系统最为常见的⼀种部署⽅式。
隧道代理
原理:HTTP 客户端通过HTTP的CONNECT⽅法请求隧道代理,创建⼀条到达任意⽬的服务器和端⼝的TCP连接,并对客户端和服务器之间的后继数据进⾏盲转发。
下⾯这张图⽚来⾃于《HTTP 权威指南》,直观地展⽰了上述⾏为:
假如我通过代理访问 A ⽹站,浏览器⾸先通过 CONNECT 请求,让代理创建⼀条到 A ⽹站的 TCP 连接;⼀旦 TCP 连接建好,代理⽆脑转发后续流量即可。所以这种代理,理论上适⽤于任意基于 TCP 的应⽤层协议,HTTPS ⽹站使⽤的 TLS 协议当然也可以。这也是这种代理为什么被称为隧道的原因。对于 HTTPS 来说,客户端透过代理直接跟服务端进⾏ TLS 握⼿协商密钥,所以依然是安全的。下图中的抓包信息显⽰了这种场景:
可以看到,浏览器与代理进⾏ TCP 握⼿之后,发起了 CONNECT 请求,报⽂起始⾏如下:
CONNECT imququ:443 HTTP/1.1
对于 CONNECT 请求来说,只是⽤来让代理创建 TCP 连接,所以只需要提供服务器域名及端⼝即可,并不需要具体的资源路径。代理收到这样的请求后,需要与服务端建⽴ TCP 连接,并响应给浏览器这样⼀个 HTTP 报⽂:
HTTP/1.1 200 Connection Established
浏览器收到了这个响应报⽂,就可以认为到服务端的 TCP 连接已经打通,后续直接往这个 TCP 连接写协议数据即可。
然⽽,并⾮所有的http隧道⽀持connect⽅法,Http隧道分为两种:
1  不使⽤CONNECT的隧道
不使⽤CONNECT的隧道,实现了数据包的重组和转发。在Proxy收到来⾃客户端的Http请求之后,会重新创建Request请求,并发送到⽬标服务器。当⽬标服务器返回Response给Proxy之后,Proxy会对Response进⾏解析,然后重新组装Response,发送给客户端。所以,在不使⽤CONNECT⽅式建⽴的隧道,Proxy有机会对客户端与⽬标服务器之间的通信数据进⾏窥探,⽽且有机会对数据进⾏串改。
2  使⽤CONNECT的隧道
⽽对于使⽤CONNECT的隧道则不同。当客户端向Proxy发起Http CONNECT Method的时候,就是告诉Proxy,先在Proxy和⽬标服务器之间先建⽴起连接,在这个连接建⽴起来之后,⽬标服务器会返回⼀个回复给Proxy,Proxy将这个回复转发给客户端,这个Response 是Proxy跟⽬标服务器连接建⽴的状态回复,⽽不是请求数据的Response。在此之后,客户端跟⽬标服务器的所有通信都将使⽤之前建⽴起来的建⽴。这种情况下的Http隧道,Proxy仅仅实现转发,⽽不会关⼼转发的数据。这也是为什么在使⽤Proxy的时候,Https请求必须⾸先使⽤Http CONNECT建⽴隧道。因为Https的数据都是经过加密的,Proxy是⽆法对Https的数据进⾏解密的,所以只能使⽤CONNECT,仅仅对通信数据进⾏转发。
与proxy有关的字段
X-Forwarded-For(XFF)是⽤来识别通过HTTP代理或负载均衡⽅式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字
段; Squid 缓存代理服务器的开发⼈员最早引⼊了这⼀HTTP头字段,如果没有XFF或者另外⼀种相似的技术,所有通过代理服务器的连接只会显⽰代理服务器的IP地址(⽽⾮连接发起的原始IP地址),这样的代理服务器实际上充当了匿名服务提供者的⾓⾊,如果连接的原始IP地址不可得,恶意访问的检测
与预防的难度将⼤⼤增加。
X-Forwarded-Host和X-Forwarded-Proto分别记录客户端最原始的主机和协议。
Proxy-Authorization:连接到proxy的⾝份验证信息
Proxy-connection:它不是标准协议的⼀部分,标准协议中已经存在⼀种机制可以完成此协议头的功能,这就是Connection头域,与Proxy-Connection头相⽐,Connection协议头⼏乎提供了相同的功能,除了错误部分。⽽且,Connection协议头可⽤于任意连接之间,包括HTTP服务器,代理,客户端,⽽不是像Proxy-Connection⼀样,只能⽤于代理服务器和客户端之间。
参考
《HTTP 代理原理及实现(⼀)》
《HTTP 代理原理及实现(⼆)》

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。