HTTP 隧道

2023-11-07

本文摘自书籍《HTTP 权威指南》
此系列文章对应 github地址

隧道

可以通过 HTTP 应用程序访问使用非 HTTP 协议的应用程序。Web 隧道允许用户通过 HTTP 连接发送非 HTTP 流量,这样就可以在 HTTP 上捎带其他协议数据了。使用 Web 隧道最常见的原因就是要在 HTTP 连接中嵌入非 HTTP 流量,这样,这类流量就可以穿过只允许 Web 流量通过的防火墙了。

用CONNECT建立HTTP隧道

Web 隧道是用 HTTP 的 CONNECT 方法建立起来的。CONNECT 方法并不是 HTTP/1.1 核心规范的一部分,但却是一种得到广泛应用的扩展。CONNECT 方法请求隧道网关创建一条到达任意目的服务器和端口的 TCP 连接,并对客户端和服务器之间的后继数据进行盲转发。

img

  • a 中,客户端发送了一条 CONNECT 请求给隧道网关。客户端的 CONNECT 方法请求隧道网关打开一条 TCP 连接。
  • 一旦建立了 TCP 连接,网关就会发送一条 HTTP 200 Connection Established 响应来通知客户端。
  • 此时,隧道就建立起来了。客户端通过 HTTP 隧道发送的所有数据都会被直接转发给输出 TCP 连接,服务器发送的所有数据都会通过 HTTP 隧道转发给客户端。

CONNECT请求

除了起始行之外,CONNECT 的语法与其他 HTTP 方法类似。一个后面跟着冒号和端口号的主机名取代了请求 URI。主机和端口都必须指定:

CONNECT home.netscape.com:443 HTTP/1.0

和其他 HTTP 报文一样,起始行之后,有零个或多个 HTTP 请求首部字段。这些行照例以 CRLF 结尾,首部列表以一个仅有 CRLF 的空行结束。

CONNECT响应

发送了请求之后,客户端会等待来自网关的响应。和普通 HTTP 报文一样,响应码 200 表示成功。按照惯例,响应中的原因短语通常被设置为“Connection Established”:

HTTP/1.0 200 Connection Established

与普通 HTTP 响应不同,这个响应并不需要包含 Content-Type 首部。此时连接只是对原始字节进行转接,不再是报文的承载者,所以不需要使用内容类型了。

数据隧道、定时及连接管理

管道化数据对网关是不透明的,所以网关不能对分组的顺序和分组流作任何假设。一旦隧道建立起来了,数据就可以在任意时间流向任意方向了。(隧道的两端(客户端和网关)必须做好在任意时刻接收来自连接任一端分组的准备,而且必须将数据立即转发出去。由于隧道化协议中可能包含了数据的依赖关系,所以隧道的任一端都不能忽略输入数据。隧道一端对数据的消耗不足可能会将隧道另一端的数据生产者挂起,造成死锁。)

作为一种性能优化方法,允许客户端在发送了 CONNECT 请求之后,接收响应之前,发送隧道数据。这样可以更快地将数据发送给服务器,但这就意味着网关必须能够正确处理跟在请求之后的数据。尤其是,网关不能假设网络 I/O 请求只会返回首部数据,网关必须确保在连接准备就绪时,将与首部一同读进来的数据发送给服务器。在请求之后以管道方式发送数据的客户端,如果发现回送的响应是认证请求,或者其他非 200 但不致命的错误状态,就必须做好重发请求数据的准备。传送的数据不要超过请求 TCP 分组的剩余容量。如果在收到所有管道化传输的 TCP 分组之前,网关关闭了连接,那么,管道化传输的多余数据就会使客户端 TCP 重置。TCP 重置会使客户端丢失收到的网关响应,这样客户端就无法分辨错误是由于网络错误、访问控制,还是认证请求造成的了。

SSL隧道

最初开发 Web 隧道是为了通过防火墙来传输加密的 SSL 流量。很多组织都会将所有流量通过分组过滤路由器和代理服务器以隧道方式传输,以提升安全性。但有些协议,比如加密 SSL,其信息是加密的,无法通过传统的代理服务器转发。隧道会通过一条 HTTP 连接来传输 SSL 流量,以穿过端口 80 的 HTTP 防火墙。

img

为了让 SSL 流量经现存的代理防火墙进行传输,HTTP 中添加了一项隧道特性,在此特性中,可以将原始的加密数据放在 HTTP 报文中,通过普通的 HTTP 信道传送。直接的 SSL 连接与隧道化 SSL 连接的对比:

img

a 中,SSL 流量被直接发送给了一个(SSL 端口 443 上的)安全 Web 服务器。b 中,SSL 流量被封装到一条 HTTP 报文中,并通过 HTTP 端口 80 上的连接发送,最后被解封装为普通的 SSL 连接。

通常会用隧道将非 HTTP 流量传过端口过滤防火墙。这一点可以得到很好的利用,比如,通过防火墙传输安全 SSL 流量。但是,这项特性可能会被滥用,使得恶意协议通过 HTTP 隧道流入某个组织内部。

SSL隧道与HTTP/HTTPS网关的对比

可以像其他协议一样,对 HTTPS 协议(SSL 上的 HTTP)进行网关操作:由网关(而不是客户端)初始化与远端 HTTPS 服务器的 SSL 会话,然后代表客户端执行 HTTPS 事务。响应会由代理接收并解密,然后通过(不安全的)HTTP 传送给客户端。这种方式有几个缺点:

  • 客户端到网关之间的连接是普通的非安全 HTTP
  • 尽管代理是已认证主体,但客户端无法对远端服务器执行 SSL 客户端认证(基于 X509 证书的认证)
  • 网关要支持完整的 SSL 实现

对于 SSL 隧道机制来说,无需在代理中实现 SSL。SSL 会话是建立在产生请求的客户端和目的(安全的)Web 服务器之间的,中间的代理服务器只是将加密数据经过隧道传输,并不会在安全事务中扮演其他的角色。

隧道认证

在适当的情况下,也可以将 HTTP 的其他特性与隧道配合使用。尤其是,可以将代理的认证支持与隧道配合使用,对客户端使用隧道的权利进行认证:

img

隧道的安全性考虑

总的来说,隧道网关无法验证目前使用的协议是否就是它原本打算经过隧道传输的协议。因此,比如说,一些喜欢捣乱的用户可能会通过本打算用于 SSL 的隧道,越过公司防火墙传递因特网游戏流量,而恶意用户可能会用隧道打开 Telnet 会话,或用隧道绕过公司的 E-mail 扫描器来发送 E-mail。为了降低对隧道的滥用,网关应该只为特定的知名端口,比如 HTTPS 的端口 443,打开隧道。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTP 隧道 的相关文章

  • IFormFile 未由 dropzone uploadMultiple 请求填充

    我遇到的问题是 IFormFile 列表没有填充给定的文件 但是当我调用 HttpContext Request Form Files 时然后我就可以访问这些文件了 我更喜欢使用 IFormFile 因为它似乎是新的 Dotnet core
  • CXF 增加连接池大小而不更改 http.maxConnections

    最近我被要求将 CXF 配置为与我们旧的 XFire 服务相同的参数 这些参数之一是Keep Alive timeout 60 max 20 然而 我做了一些研究 看来 CXF 使用 JVMHttpURLConnection引擎盖下的对象
  • 志愿者匹配 API Objective C

    我正在使用 AFNetworking 对 VolunteerMatch API 执行 Web 请求 当我执行请求时 我收到 200 代码 但没有收到响应 典型的 VolunteerMatch 请求如下所示 GET api call acti
  • python中的编码检测库[重复]

    这个问题在这里已经有答案了 这在某种程度上与我的问题有关here https stackoverflow com questions 2305997 unicodedecodeerror problem with mechanize 我处理
  • 在 Go 中读取请求负载?

    我正在使用文件上传器 需要请求负载中的详细信息来裁剪它 func Upload w http ResponseWriter r http Request reader err r MultipartReader if err nil htt
  • 如何在 Rails 中重定向到 404?

    我想在 Rails 中 伪造 404 页面 在 PHP 中 我只发送一个带有错误代码的标头 如下所示 header HTTP 1 0 404 Not Found Rails 是如何做到这一点的 不要自己渲染 404 没有理由这样做 Rail
  • 使用哪个 HTTP 状态代码来拒绝由于乐观锁定失败而导致的 PUT

    假设我想实现某种乐观锁定并使用 ETag 来指示最新的资源状态 这意味着 客户将使用If Match标题时PUT等待更新 根据HTTP规范 http www w3 org Protocols rfc2616 rfc2616 sec14 ht
  • 通用开源 REST 客户端? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用传输编码分块的 HTTP 响应中的最大块大小是多少?

    The w3 org RFC2616 http www w3 org Protocols rfc2616 rfc2616 sec3 html sec3 6 1似乎没有定义块的最大大小 但是如果没有最大块大小 则没有空间用于块扩展 必须有一个
  • $http.get 和 method:'GET' 之间的区别

    我正在使用 Spring Data REST 并有一个 MySQL DB 来管理我的数据 我使用 AngularJS 编写了第一页 并希望从数据库中获取数据 为了获取我的数据 我知道有两种不同的方式 http get http myURL
  • 我首次设置 AWS EB 时创建的默认安全组是什么?

    我对几个组所扮演的角色感到困惑 这些组似乎已自动添加到我的 AWS 安全组列表中 并以我收集的默认配置进行连接 并且想知道它们是如何工作的 以及它们的安全性如何 改变 具体来说 有三个神秘之处 launch wizard 1其中有一条入站规
  • 在Java中解析包含multipart/form-data请求体的字符串

    问题陈述 我认为标题说明了一切 我正在寻找解析 a 的方法String包含 multipart form data HTTP 请求的正文部分 IE 字符串的内容看起来像这样 xyzseparator blah Content Disposi
  • HTTP请求压缩

    一般用例 想象一下一个正在上传大量 JSON 的客户端 内容类型应保留application json因为这描述了实际数据 Accept Encoding 和 Transfer Encoding 似乎是为了告诉服务器应该如何格式化响应 看起
  • 通过 http 的私有 git 存储库

    你能推荐任何简单的解决方案来设置可通过http s cleutus建议的 访问的git存储库吗 我有自己的 http 服务器 我想用它来托管一些小型私人项目 在家里我可以通过 ssh 连接 但在工作中防火墙阻止我这样做 有没有免费的方法来设
  • 是否有管理 __utma、__utmz 等 cookie 的标准?

    无论我登录 Facebook 还是 Twitter 我都会受到以下名称的 cookie 轰炸 utma utmb utmc utmv 它们的功能是什么 是否有一个标准来管理这些在服务器端的使用方式 这些 cookie 通常与谷歌分析 htt
  • 在 Heroku 上获取客户端的真实 IP 地址

    在任何 Heroku 堆栈上 我想获取客户端的 IP 我的第一次尝试可能是 request headers REMOTE ADDR 当然 这是行不通的 因为所有请求都是通过代理传递的 所以替代方法是使用 request headers X
  • Perl:LWP::UserAgent 对于重定向 URL 始终返回代码 200

    我有一个简单的 url 它执行 302 临时错误 移至另一页 我尝试在 URL 返回代码 200 表示 OK 时检索它 并在返回 200 以外的其他内容时停止 My code my ua LWP UserAgent gt new env p
  • 在golang中获取TTFB(第一个字节的时间)值

    我正在尝试获取 TTFB 值和 Connect 值 c exec Command curl w Connect time connect TTFB time starttransfer Total time time total o dev
  • 返回重定向作为对 Ajax(fetch、XHR 等)请求的响应

    如果浏览器收到对 ajax 请求的重定向响应 会发生什么 如果浏览器收到对 ajax 请求的重定向响应 会发生什么 如果服务器发送重定向 又名 302 响应加上 Location 标头 浏览器将自动遵循重定向 对此的回应second请求 假
  • 多个客户端如何同时连接到服务器上的一个端口(例如 80)? [复制]

    这个问题在这里已经有答案了 我了解端口工作原理的基础知识 但是 我不明白的是多个客户端如何同时连接到端口 80 我知道每个客户端都有一个唯一的 对于他们的机器 端口 服务器是否从可用端口回复客户端 并简单地声明回复来自 80 这是如何运作的

随机推荐

  • 持续集成(CI)持续部署(CD) 简介

    定义 一天中多次的将所有工作者的工作合并到一个共享的主线的协作方式 具体来说是开发人员提交新代码后立即进行构建 测试 根据测试结果我们可以确定新代码和原代码是否能正确的集成到一起 CI CD的意义和价值 敏捷开发思想的体现 频繁 自动化 可
  • Winform 当Panel等容器类控件 失去焦点再获得焦点后,滚动条复位的解决方式

    public class MyPanel Panel
  • 苹果cms微信对接php,苹果cmsV10微信公众号对接插件安装教程

    常见问题解决办法 1 无法对接微信公众号 提示 参数错误 解决办法 找一个未被腾讯拦截的域名 不需要备案 推荐用 cn com net后缀的 解析到你网站上 做对接域名用就可以了 2 token验证失败 解决办法 如果确定token没有错
  • DVWA-Command Injection

    大约 命令注入攻击的目的是在易受攻击的应用程序中注入和执行攻击者指定的命令 在这种情况下 执行不需要的系统命令的应用程序就像一个伪系统外壳 攻击者可能会使用它 作为任何授权的系统用户 但是 命令的执行权限和环境与 Web 服务具有的权限和环
  • java判断一个数字是否为偶数的几种方式

    java判断一个数字是否为偶数的几种方式 第一种 取余 function isOdd n if n 2 0 console log n 是偶数 else if n 2 1 console log n 是奇数 else console log
  • Pytorch训练时显存分配过程探究

    对于显存不充足的炼丹研究者来说 弄清楚Pytorch显存的分配机制是很有必要的 下面直接通过实验来推出Pytorch显存的分配过程 实验实验代码如下 import torch from torch import cuda x torch z
  • 【BIOS】Bios设置通电即自动开机。

    问题需求 设置电脑 服务器接通电源后 自动开机 解决方案 不同主板的bios设置不一样 但方向都差不多 在此整理一些不同准版bios的设置方法 通用主板Bios 开机后连续按del键 进入Bios 切换到 Advanced 菜单下 找到 A
  • 使用SOLIDWORKS方程式绘制渐开线齿轮

    在SOLIDWORKS中 有时需要在参数之间建立关联 但这种关联却无法通过使用几何关系或常规的建模技术来实现 这时我们就可以使用方程式来建立模型中尺寸之间的数学关系 在方程式驱动的曲线中最经典的就是渐开线了 这也是绘制齿轮时不可或缺的线条类
  • Qt 编译错误 提示TypeError: Property 'asciify' of object Core::Internal::UtilsJsExtension(0x27a9278) is not

    编译Qt 时提示错误 TypeError Property asciify of object Core Internal UtilsJsExtension 0x27a9278 is not a functio 说明 出现这个错误的表层原因
  • LeetCode-679.24 点游戏、深度优先搜索算法DFS

    来源 力扣 LeetCode 题目分析 括号运算符仅仅表达了一个运算顺序 可以不用考虑 实际的运算类型就 4 种 一共只有 4 个数 因此所有组合的可能性是有限的 DFS 算法就是对当前的所有可能的操作进行枚举 当前的操作即从可选的数字中挑
  • 国内获取Docker镜像缓慢

    国内获取Docker镜像时 访问 https hub docker com 速度缓慢 只有几十K左右 这种情况可以使用国内的一些docker镜像 例如 网易蜂巢 阿里巴巴 LUG USTC等 此处介绍使用中国科学技术大学 LUG USTC
  • 【分享】免费的AI绘画网站(5个)

    哈喽 大家好 我是木易巷 随着人工智能技术的不断发展 越来越多的AI绘画软件开始涌现 如果你想要免费享受AI绘画的乐趣 那你可要好好看下面的内容 Vega AI创作平台 入口 https rightbrain art 一款专业的人工智能创作
  • AI 工具合辑盘点(八)持续更新 之 AI 面部生成工具和AI 角色生成工具

    一 AI 面部生成工具 需要一张真实人物的肖像画来用于你的营销材料 正在寻找具有特定面部特征的模特 但你的预算有限 正在创建你的买家人物 但不想从互联网上窃取图片 如果是这样 也许AI面部生成器可以作为解决方案 它们利用先进的图像处理技术
  • springboot 项目 docker 启动镜像 读不到application配置

    Dockerfile FROM openjdk 17 RUN cd RUN mkdir p config 删除旧jar包 RUN rm rf springboot3 jar 重新复制jar包 ARG JAR FILE ADD target
  • Maven问题:To see the full stack trace of the errors, re-run Maven with the -e switch.

    报错如下 ERROR gt Help 1 ERROR ERROR To see the full stack trace of the errors re run Maven with the e switch ERROR Re run M
  • C语言之详解静态变量static

    在C语言中static是用来修饰变量和函数的 这篇文章详细介绍了static主要作用 文章中有详细的代码实例 需要的朋友可以参考阅读 在C语言中 static是用来修饰变量和函数的 static主要作用为 1 修饰局部变量 静态局部变量 2
  • 在idea中快速构建方法的说明注释,带有参数信息

    在方法上面输入 然后按Ctrl enter即可 下面都是自动生成的内容 param request param response param handler return throws Exception Override public b
  • git命令超实用总结(23条超实用命令)

    本文总结了常见的23个git使用场景的处理方法 足够应对日常学习工作中对git的使用 文章目录 1 添加SSH验证免登陆 2 将本地项目上传GitHub 2 1 如果是新项目 本地还没有代码 2 2 如果想直接使用远程的代码 2 3 如果是
  • Android studio 3.5 debug 包不能安装

    debug模式下编译出的apk无法安装 可在根目录gradle properties中配置 android injected testOnly false
  • HTTP 隧道

    本文摘自书籍 HTTP 权威指南 此系列文章对应 github地址 隧道 可以通过 HTTP 应用程序访问使用非 HTTP 协议的应用程序 Web 隧道允许用户通过 HTTP 连接发送非 HTTP 流量 这样就可以在 HTTP 上捎带其他协