Atitit.HTTP代理原理及实现正向代理与反向代理attilax总结
1.普通代理1
1.1.1.普通代理2
2.隧道代理3
3.反向代理 4
4.正向代理也可以使用apache实现4
5.参考5
HTTP代理原理及实现(一)
文章目录
1.普通代理
Web代理是一种存在于网络中间的实体,提供各式各样的功能。现代网络系统中,Web代理无处不在。我之前有关HTTP的博文中,多次提到了代理对HTTP请求及响应的影响。今天这篇文章,我打算谈谈HTTP代理本身的一些原理,以及如何用Node.js快速实现代理。
HTTP代理存在两种形式,分别简单介绍如下:
第一种是RFC7230-HTTP/1.1:MessageSyntaxandRouting(即修订后的RFC2616,HTTP/1.1协议的第一部分)描述的普通代理。这种代理扮演的是「中间人」角色,对于连接到它的客户端来说,它是服务端;对于要连接的服务端来说,它是客户端。它就负责在两端之间来回传送HTTP报文。
第二种是TunnelingTCPbasedprotocolsthroughWebproxyservers(通过Web代理服务器用隧道方式传输基于TCP的协议)描述的隧道代理。它通过HTTP协议正文部分(Body)完成通讯,以HTTP的方式实现任意基于TCP的应用层协议代理。这种代理使用HTTP的CONNECT方法建立连接,但CONNECT最开始并不是RFC2616-HTTP/1.1的一部分,直到发布的HTTP/1.1修订版中,才增加了对CONNECT及隧道代理的描述,详见RFC7231-HTTP/1.1:SemanticsandContent。实际上这种代理早就被广泛实现。
本文描述的第一种代理,对应《HTTP权威指南》一书中第六章「代理」;第二种代理,对应第八章「集成点:网关、隧道及中继」中的8.5小节「隧道」。
.作者::绰号:老哇的爪子(全名::AttilaxAkbarAlRapanui阿提拉克斯阿克巴阿尔拉帕努伊)汉字名:艾龙,EMAIL:1466519819@
转载请注明来源:/attilax
1.1.1.普通代理
第一种Web代理原理特别简单:
HTTP客户端向代理发送请求报文,代理服务器需要正确地处理请求和连接(例如正确处理Connection:keep-alive),同时向服务器发送请求,并将收到的响应转发给客户端。
当然代理也可以修改HTTP请求头部,通过X-Forwarded-IP这样的自定义头部告诉服务端真正的客户端IP。但服务器无法验证这个自定义头部真的是由代理添加,还是客户端修改了请求头,所以从HTTP头部字段获取IP时,需要格外小心。
2.隧道代理
可以看到,浏览器与代理进行TCP握手之后,发起了CONNECT请求,报文起始行如下:
:443HTTP/1.1
对于CONNECT请求来说,只是用来让代理创建TCP连接,所以只需要提供服务器域名及端口即可,并不需要具体的资源路径。代理收到这样的请求后,需要与服务端建立TCP连接,并响应给浏览器这样一个HTTP报文:
HTTP/1.1200ConnectionEstablished
浏览器收到了这个响应报文,就可以认为到服务端的TCP连接已经打通,后续直接往这个TCP连接写协议数据即可。通过Wireshark的FollowTCPSteam功能,可以清楚地看到浏览器和代理之间的数据传递:
可以看到,浏览器建立到服务端TCP连接产生的HTTP往返,完全是明文,这也是为什么CONNECT请求只需要提供域名和端口:如果发送了完整URL、Cookie等信息,会被中间人一览无余,降低了HTTPS的安全性。HTTP代理承载的HTTPS流量,应用数据要等到TLS握手成功之后通过ApplicationData协议传输,中间节点无法得知用于流量加密的master-secret,无法解密数据。而CONNECT暴露的域名和端口,对于普通的HTTPS请求来说,中间人一样可以拿到(IP和端口很容易拿到,请求的域名可以通过DNSQuery或者TLSClientHello中的ServerNameIndication拿到),所以这种方式并没有增加不安全性
3.反向代理
还有一种情况是访问A网站时,实际上访问的是代理,代理收到请求报文后,再向真正提供服务的服务器发起请求,并将响应转发给浏览器。这种情况一般被称之为反向代理,它可以用来隐藏服务器IP及端口。一般使用反向代理后,需要通过修改DNS让域名解析到代理服务器IP,这时浏览器无法察觉到真正服务器的存在,当然也就不需要修改配置了。反向代理是Web系统最为常见的一种部署方式,例如本博客就是使用Nginx的proxy_pass功能将浏览器请求转发到背后的Node.js服务。
通常是由apache实现
4.正向代理也可以使用apache实现
#正向代理设置
ProxyRequestsOn
ProxyViaOn
<Proxy*>
Orderdeny,allow
Denyfromall
Allowfrom127.0.0.1
</Proxy></VirtualHost>
现在看正向代理设置那一段
·ProxyRequestsOn:开启Apache正向代理
·ProxyViaOn:控制位于代理服务器链中的代理请求的流向
引用Apache2.2官方文档中对ProxyVia的解释如下:
00001.
a.如果设置为默认值Off,将不会采取特殊的处理。如果一个请求或应答包含"Via:"头,将不进行任何修改而直接通过。
b.如果设置为On每个请求和应答都会对应当前主机得到一个"Via:"头。
c.如果设置为Full,每个产生的"Via:"头中都会额外加入Apache服务器的版本,以"Via:"注释域出现。
d.如果设置为Block,每个代理请求中的所有"Via:"头行都将被删除。且不会产生新的"Via:"头。
5.参考
HTTP代理原理及实现(一)JerryQu的小站.htm
Apache配置正向代理与反向代理-Alexis_Liu-博客园.htm