什么是HTTP隧道,怎么理解HTTP隧道呢?

简介: 什么是HTTP隧道,怎么理解HTTP隧道呢?

总述:

HTTP 1.1引入了HTTP tunnel,提供了支持任意流量的TCP隧道的能力。

HTTP proxy是一个中间人,是客户端去请求代理,代理修改请求再去请求网站,proxy不能代理HTTPS请求,因为代理不可能获得网站的私钥。

HTTP tunnel 不需要改写请求包,将C S之间的流量直接转发,所以可以传输代理TLS加密的HTTPS流量。

HTTP tunnel

HTTP tunnel使用CONNECT方法进行建立隧道连接通信


HTTP tunnel是HTTP/1.1中引入的一个功能,主要为了解决明文的HTTP proxy无法代理跑在TLS中的流量(也就是https)的问题,同时提供了作为任意流量的TCP通道的能力。

HTTP tunnel 不需要改写请求包,将C S之间的流量直接转发,所以可以传输代理TLS加密的HTTPS流量。


HTTP tunnel的工作流程是什么样的?


CONNECT报文没有后面的负载部分,只有Request-Line和header后面以两个\r\n断开,Request-Line和header均是由代理服务器使用,不会发送到远程服务器。请求的header部分一旦结束(连续的两组CRLF),后面所有的数据都被视为应该发给远端服务器(网站)的数据,代理需要把它们直接转发,而且不限长度,直到从客户端的TCP读通道关闭


响应同理:对于CONNECT报文的返回值,代理服务器在和远端服务器成功建立连接后,可以(标准说的是可以,但是一般都会)向客户端(浏览器)返回任意一个2xx状态码,

此时表示含义是和远端服务器建立连接成功,这个2xx返回报文的header部分一旦结束(连续的两组CRLF),后面所有的数据均为远端服务器返回的数据,同理代理会直接转发远端服务器的返回数据给客户端,直到从远端服务器的TCP读通道关闭。


HTTP proxy ,如何工作


HTTP tunnel出来之前,HTTP proxy工作在中间人模式,即在一次请求中,客户端(浏览器)铭文的请求去请求代理服务器。代理服务器明文去请求远端的服务器(网站)。整个过程的请求响应内容(密码cookie等)代理服务器都是可见的。且使用HTTP proxy模式要求代理服务器对请求报文进行适当修改,RFC2616 5.1.2中要求请求代理的报文中Request-URL使用绝对路径,即以http开头:


使用了代理后,发送的报文将变为:

GET http://stackoverflow.com/ HTTP/1.1\r\n
Host: stackoverflow.com\r\n
Proxy-Connection: keep-alive\r\n
\r\n


代理从请求的第一行中得知要请求的目标是stackoverflow.com,端口为默认端口(80),将第一行改写后,向网站服务器发送请求:

GET / HTTP/1.1\r\n
Host: stackoverflow.com\r\n
Connection: keep-alive\r\n
\r\n


因为:如果代理HTTPS流量,那么就会变成浏览器和代理握手跑TLS,代理拿到明文的请求报文,代理和网站握手跑TLS。但是代理没有,也不可能有网站的私钥证书,所以这么做会导致浏览器和代理之间的TLS无法建立,证书校验根本通不过。但是HTTP tunnel的出现解决了这个问题,代理服务器不再作为中间人,不在用改写请求。


HTTP隧道和SOCKS隧道的区别


其中相同的地方:


  • 都能在请求中指明要请求的目标和端口。
  • 都会建立能传输任何流量的TCP通道,代理服务器对流量内容不关心。
  • 都是在报文前部的描述信息结束后,将后续所有数据视为转发的客户端和服务端数据,直到通道关闭。

  • 都可以进行客户端的身份验证,而且有多重身份验证协议可选。


不同的地方:


  • SOCKS5的报文无论请求还是返回,内容均是固定的。而CONNECT报文作为HTTP/1.1的报文之一,当然也包括了HTTP/1.1可以传输任何自定义header的功能,虽然一般代理不会响应CONNECT报文上的非标准header,但是自己实现一个客户端和服务器通过header传输一些其它数据也是符合标准的。

  • SOCKS5 request报文中的address,根据address type(ATYP)字节的值,可以显式声明为IPv4地址、IPv6地址、域名(domain)。而CONNECT报文中的Request-URI根据RFC要求必须为authority形式(即没有http://前缀,只包含host,以及可选的port,其中host和port要用":"分隔),也就是说CONNECT报文不会显式的区分IP地址和域名,均作为host传输。

  • 由于CONNECT报文还是http,所以也可以跑在TLS里,也就是说客户端和代理跑一层TLS,这一层里面客户端和远端服务器再跑一层TLS。这样当代理服务器需要用户名密码验证,而验证方式又是Basic时,可以通过TLS来保护代理请求报文中的明文用户名密码。


参考来源:https://www.zhihu.com/question/21955083/answer/142736329


相关文章
|
7月前
|
安全 Linux 网络安全
Linux使用HTTP隧道代理代码示例模版
Linux使用HTTP隧道代理代码示例模版
97 0
有HTTP代理池子,要怎么快速搭建隧道代理?| 纯技术分享
实际工作中我们基本都是直接用有隧道代理服务提供商的产品的。
|
7月前
|
数据安全/隐私保护
隧道代理比普通HTTP代理方便的原因是什么?
随着科技的进步和互联网的发展,越来越多的企业在业务上都需要用到代理,那么隧道代理比普通HTTP代理方便的原因是什么?那么小编接下来就跟大家介绍一下
78 1
隧道代理比普通HTTP代理方便的原因是什么?
|
7月前
|
数据采集 数据安全/隐私保护 Python
深度解析Python爬虫中的隧道HTTP技术
深度解析Python爬虫中的隧道HTTP技术
|
网络协议 安全 Java
ABPTTS通过Http隧道上线
实战中经常会遇到目标主机不出网的情况,如果目标机器开放了web服务,可以通过构造正向http隧道进行上线,如果机器处于内网环境,可通过一台可出网的跳板机将其带出去,这只是个人的小想法...
137 0
|
网络安全
如何批量检测隧道HTTP代理的可用性?
本质上来说,检测隧道HTTP代理的可用性就是检测HTTP代理的可用性
|
SQL Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
在运行一个group by的sql时,抛出以下错误信息: Task with the most failures(4):  -----Task ID:  task_201411191723_723592_m_000004URL:  http://DDS0204.
977 0
|
Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
总结和计划总是让人喜悦或镇痛,一方面以前一段时间没有荒废,能给现在的行动以信心,另一方面看到一年的时间并不能完成很多事情,需要抓紧时间。
620 0
|
Web App开发 监控 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
系统的升级涉及各个架构组件,细节很多。常年累月的修修补补使老系统积累了很多问题。 系统升级则意味着需要repair之前埋下的雷,那为何还要升级,可以考虑以下几个方面 成熟老系统常见问题: 1. 缺乏文档(这应该是大小公司都存在的问题。
625 0