1. 简介

HTTP 隧道(HTTP Tunnel) 是一种连接两个被防火墙等访问控制隔离的计算机的技术。通常通过在防火墙后设置一个代理服务器(Proxy Server)来建立这种隧道。代理服务器的作用是 使用 HTTP 代理协议转发请求,且不进行加密

Traceroute 是一种用于追踪网络请求路径的工具,常用于查看数据包从一台计算机到另一台计算机之间经过了哪些路由节点。然而,Traceroute 通常基于 ICMP 或 UDP 协议,而 HTTP 代理无法对这类协议进行隧道封装。

为了解决这个问题,我们可以使用 HTTP CONNECT 方法 建立立 HTTP 隧道,从而在防火墙和代理的限制下实现 Traceroute 的功能。

在本文中,我们将演示 如何通过 HTTP 隧道在带防火墙的代理环境中执行 Traceroute


2. HTTP 隧道

HTTP 隧道,也称为端口转发(Port Forwarding),其核心作用是将私有网络的请求通过公共网络进行传输

通常,HTTP 隧道由位于 DMZ(非军事区)中的代理服务器创建。DMZ 是企业网络中一个特殊区域,既可被外部网络访问,也可被内部网络访问。我们通常将需要对外提供服务的网络资源部署在 DMZ 中:

DMZ 网络结构示意图

当建立 HTTP 隧道时,私有网络与公共网络之间的通信通过 HTTP 协议进行封装。HTTP 隧道可以通过以下两种方式建立:

  • 使用 HTTP CONNECT 方法
  • 使用常见的 HTTP 方法(如 GET、POST、PUT、DELETE)

2.1. HTTP 代理服务器

代理服务器在客户端与服务端之间起到中介作用,其用途包括:

✅ 隐藏客户端真实 IP 地址,防止被黑客追踪
✅ 用户身份认证(Authentication)
✅ 缓存网页内容,提高访问效率
✅ 根据本地策略对内部服务器请求的数据包头和负载进行监控

例如,当你访问 www.baeldung.com 时,你的浏览器会先将请求发送到组织的代理服务器,代理服务器再向 baeldung.com 的权威服务器发起请求,并将结果返回给浏览器:

浏览器通过代理服务器通信示意图

2.2. HTTP CONNECT 方法

HTTP CONNECT 是一种常用的隧道建立方法。它允许客户端(如浏览器)向代理服务器发起请求,要求代理服务器为其与目标服务器之间建立一条 TCP 连接。

在隧道建立阶段使用的是 HTTP 协议,一旦连接建立成功,后续的通信就变成了原始的 TCP 流量,代理服务器只是负责转发,不再解析内容。


3. Traceroute 原理简介

当你通过互联网连接到另一台计算机时,数据包通常会经过多个中间路由节点。为了查看数据包的具体路径,我们可以使用 traceroute(Unix/Linux/Mac)tracert(Windows) 命令。

该命令的输出结果会因用户地理位置、路由器状态和网络负载情况而有所不同。

3.1. tracert 命令示例

下面是一个在 Windows 上使用 tracert 命令追踪访问 baeldung.com 路径的示例:

C:\>tracert baeldung.com

输出结果如下:

Tracing route to baeldung.com [2606:4700:3108::ac42:2b08]
over a maximum of 30 hops:

  1     1 ms     1 ms     1 ms  2001:8f8:1b27:4401:ea1b:69ff:fe06:7880
  2     *        *        *     Request timed out.
  3     4 ms     3 ms     4 ms  2001:8f8:3:d106::1
  4     8 ms     5 ms     6 ms  2001:8f8:0:10:0:23:208:5
  5     6 ms     5 ms     6 ms  2001:8f8:0:10:0:20:23:1
  6     6 ms     6 ms    45 ms  2001:8f8:0:20:cd::2
  7     6 ms    10 ms     6 ms  2606:4700:3108::ac42:2b08

Trace complete.

输出解释

输出项 说明
最大跳数 30 数据包最多经过 30 个节点
7 行数据 表示数据包经过了 7 个路由器
每行的毫秒值 表示该跳点的往返时间
IP 地址 每行最右侧为当前路由器的 IP 地址

4. 使用 HTTP 隧道执行 Traceroute

由于 Traceroute 使用的是 ICMP 或 UDP 等底层网络协议,而 HTTP 隧道工作在应用层,因此 无法直接通过 HTTP 隧道执行 Traceroute 命令

解决方案:使用 SSH 隧道

一种可行的替代方案是借助 SSH 隧道(SSH Tunnel),通过 SSH 客户端将 Traceroute 请求通过代理服务器转发出去,并接收返回结果。

其核心步骤如下:

✅ 确保可以访问目标网站的 443(HTTPS)或 80(HTTP)端口
✅ 需要拥有代理服务器的登录凭证
✅ 隧道建立后,再运行 tracert 命令

下图展示了 SSH 客户端与代理服务器之间的隧道连接:

SSH 隧道示意图


5. 总结

本文介绍了 HTTP 隧道的基本原理 及其与 HTTP 代理服务器 的关系,并展示了如何通过 tracert 命令获取网络路径信息。

我们还讨论了 在代理和防火墙限制下无法直接使用 Traceroute 的问题,并提出了一种解决方案:使用 SSH 隧道实现 Traceroute 请求的转发

通过这种方式,即使在受限网络环境中,也可以完成网络路径的追踪,对网络故障排查和性能优化具有重要意义。


原始标题:Using HTTP Tunnel to Traceroute Through a Proxy With Firewall