通过 HTTP/s 隧道传输任何类型的 TCP 流量

Posted

技术标签:

【中文标题】通过 HTTP/s 隧道传输任何类型的 TCP 流量【英文标题】:Tunnel any kind of TCP traffic through HTTP/s 【发布时间】:2012-12-14 09:18:37 【问题描述】:

我正在寻找一种通过 HTTPS 隧道传输 RDP 或其他二进制 TCP 流量的软件。因为很多客户端只允许 HTTP/S(防火墙中只开放了 80 和 443 端口)。

但是需要将 RDP(和其他协议)从 DMZ 中的机器转发到客户端。

7 View large function description

是否有任何类型的开源或企业软件可以解决这个问题?

糟糕的解决方案

F5 big ip 之类的解决方案存在我必须使用此软件创建连接配置的问题。如果可以通过使用 api 来做到这一点,那将是一个很好的解决方案。但我宁愿只获得隧道组件而不使用整个网关软件。因为我需要用我自己的软件创建隧道(1000ds),并且需要将隧道访问限制为允许的用户(由会话 cookie 标识)

好的解决方案

http://http-tunnel.sourceforge.net/

如果隧道客户端可能不是专用服务器,而是在客户端浏览器中运行的 java 闪存小程序,那么它将 100% 满足我的需求。

【问题讨论】:

【参考方案1】:

有大量项目通过 HTTP(S) 建立 TCP 隧道。您将不得不做一些工作来选择最适合您需要的那个(并且可能会稍微修改一下)。

SuperTunnel (Java)。看起来不错,他们似乎已经考虑过如何处理行为不端的代理。

JHttpTunnel (Java)。 gnu httptunnel的一个端口,我觉得用的是同一个网络协议。

Netty HTTP 隧道(Java,Netty 的一部分,一个非常好的网络库;sample code)。我认为这需要客户端和服务器都使用 Netty,但除此之外,它是 Netty 中常规套接字的直接替代品。

ProxyChains(C,Unix,非常流行)

GNU httptunnel(C,不支持HTTPS,这可能是所有http隧道的鼻祖)

node-http-tunnel (Node.js), Net::HTTPTunnel (Perl), nRedir (Python), Corkscrew, htunnel, ...

我认为 SuperTunnel 和 JHttpTunnel 都可以包含在您自己的客户端小程序或 Java 应用程序中,它们不需要作为独立代理运行。

Netty 也会这样做,但是(我认为)它要求您的服务器也使用 Netty:换句话说,它允许您将常规 TCP connect() 替换为使用带有 TCP-over-HTTP @987654331 的 Netty 的服务器@,但不代理与其他服务器的任意连接(除非您编写自己的简单代理)。

【讨论】:

感谢 antswer,我们对 SuperTunnel 进行了第一次工作测试。现在让服务器部分在 apache 网络服务器中运行会很好。您是否也有针对此问题的一些信息给我? @GreenRover:您可以只在 Apache Tomcat 中运行服务器部分。您可能可以让它在服务器中运行,但很容易在单独的端口上监听;多做一些工作,应该可以让 HTTP 请求也通过 Tomcat。 @GreenRover:另一个想法:您还可以将服务器部分作为独立进程运行,并使用普通 Apache 通过它代理请求(这将为您提供更多可配置性,并且您可以使用相同的地址/端口作为您的常规 Web 服务器)。 如果 jet 无法使用 RDP 对其进行测试,但是一个简单的 tcp telnet 会话就像 sharm 一样工作。感谢您的帮助。【参考方案2】:

如果您在 Windows 世界,我强烈建议您查看 Windows 2008/2008R2/2012 SSTP *** 服务。它使用 443 端口,并且可以与 IIS 共同托管(在 443 上)。它在 Windows Vista / 7 / 8 上就像一个魅力。我听说过 mac OSX 解决方案,但还没有。

但是,SSH 有一个很好的旧解决方案。

如果在 linux 上,只需安装一个 openssh-server。如果在 Windows 上,获取并安装 OpenSSH 服务器(例如,来自 itefix https://www.itefix.no/ 的 copSSH)。将端口修改为使用 443 而不是默认的 22。

然后在客户端可以使用 Windows 上的 Putty (http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html) 或 kitty (http://kitty.9bis.net/) 或任何操作系统中的任何类型的 SSH 客户端通过端口 443(您的 SSH 服务器正在侦听的端口)连接到您的服务器)。

例如,关于通过 putty 进行隧道的说明可以在多个站点上找到:

http://oldsite.precedence.co.uk/nc/putty.html http://www.damtp.cam.ac.uk/user/jp107/xp-remote/web-tunnel/

始终记住,您必须指向本地主机才能执行此操作。

在 Windows 上还有 MyEnTunnel (http://nemesis2.qx.net/pages/MyEnTunnel) 来简化隧道配置和维护的过程。

在浏览器上利用此隧道非常简单:只需告诉您的浏览器在您刚刚在客户端(putty、kitty、myentunnel 或其他任何东西)中配置的本地端口(eh localhost 8080)上有一个 socks 代理。

【讨论】:

【参考方案3】:

我写了一个叫 sshh。 http://sourceforge.net/projects/sshh/

我有点发疯了,它实际上可以让你通过它向后建立连接。

【讨论】:

你能测试 ScreenConnect.com。你知道那个概念和你的概念一样吗? 看起来很棒,我可以在浏览器上运行它吗?怎么样?

以上是关于通过 HTTP/s 隧道传输任何类型的 TCP 流量的主要内容,如果未能解决你的问题,请参考以下文章

RTSP 隧道 HTTP、FFMPEG

隧道传输子命令时套接字竞争的安全隐患

如何使用vlc通过tcp协议强制流RTP视频?

Http隧道通过C#(TCP)中的防火墙

关于 RTSP over HTTP 隧道的困惑

SSH隧道tunneling端口转发