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

27

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

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

Function description7 查看大型功能说明

是否有任何开源或企业软件解决此问题?

不好的解决方案

F5 big ip这样的解决方案存在一个问题,就是我必须使用该软件创建连接配置。如果能够通过API进行操作,那么这将是一个很好的解决方案。但是我更愿意仅获取隧道组件,而不是购买整个网关软件。因为我需要从自己的软件创建隧道(1000ds),并且有必要限制隧道访问权限以允许用户(通过会话Cookie识别)。

好的解决方案

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

如果隧道客户端不是专用服务器,而是运行在客户端浏览器中的Java小程序或Flash,则它将完全符合我的需求。


1
请尝试使用 https://github.com/bokysan/socketace 或 https://github.com/jpillora/chisel。 - masterxilo
4个回答

34

有许多项目可以通过HTTP(S)隧道传输TCP。您需要花一些时间选择最适合您需要的项目(并可能稍微修改它)。

  • SuperTunnel(Java)。看起来不错,他们似乎考虑了如何处理不良代理。

  • JHttpTunnel(Java)。GNU httptunnel的端口,我认为使用相同的网络协议。

  • Netty HTTP 隧道(Java,Netty的一部分,非常好的网络库,示例代码)。我认为这需要客户端和服务器都使用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:换句话说,它允许你将使用Netty的TCP connect() 替换为TCP-over-HTTP connect(),但不会代理到其他服务器的任意连接(除非你编写自己的简单代理)。


谢谢您的回答,我已经用SuperTunnel做了一个第一次工作测试。现在很希望能让服务器部分在Apache Web服务器中运行。您是否也有关于这个问题的一些信息可以提供给我? - GreenRover
@GreenRover:你可以在Apache Tomcat中运行服务器部分。你很可能可以让它在服务器上运行,但是很容易监听一个单独的端口;再加点工作,也应该可以让HTTP请求通过Tomcat进行。 - Alex I
1
@GreenRover:另一个想法是,您可以将服务器部分作为独立进程运行,并通过普通的Apache代理请求(这将为您提供更多的可配置性,并且您可以使用与常规Web服务器相同的地址/端口)。 - Alex I
目前我还无法通过RDP测试,但是简单的TCP Telnet会话可以正常工作。感谢您的帮助。 - GreenRover

7
如果你使用的是Windows系统,我强烈建议你考虑使用Windows 2008/2008R2/2012 SSTP VPN服务。它使用443端口,并且可以与IIS(在443上)共存。它在Windows Vista / 7 / 8上运行得非常好。我听说过mac OSX的解决方案,但还没有尝试过。
然而,还有一个古老而好用的SSH解决方案。
如果是在Linux上,只需安装openssh-server即可。如果是在Windows上,则需要获取并安装OpenSSH服务器(例如来自itefix的copSSH https://www.itefix.no/)。将端口修改为443,而不是默认的22。

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

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

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

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

在浏览器上利用此隧道非常容易:只需告诉浏览器您在客户端(putty、kitty、myentunnel或其他任何工具)中刚刚配置的本地端口(例如localhost 8080)上有一个socks代理即可。


2

你能测试一下ScreenConnect.com吗?你知道那个概念是否与你的概念相同吗? - user285594
那看起来很棒,我能在浏览器上运行它吗?怎么做? - lucaswxp

1

如果你想要在WebSocket和浏览器上打开一个TCP隧道,例如在受限的环境中只能通过浏览器访问有限的网站,我认为我制作的这个隧道工具可以帮助你解决问题。

Cactus Tunnel: https://github.com/jeffreytse/cactus-tunnel

一个迷人的TCP隧道,可在WebSocket和浏览器上使用。

通过它,你可以快速在浏览器上打开一个隧道,并建立SSH隧道、sock5代理等服务。

为方便起见,以下是通过 cactus-tunnel 建立SSH socks5代理隧道的指令:

  1. 安装隧道工具
npm i -g cactus-tunnel
  • 运行隧道服务器

  • cactus-tunnel server
    
    1. 在浏览器桥接模式下运行隧道客户端
    cactus-tunnel client -b ws://<your-tunnel-server>:7800 <your-ssh-server>:22
    
    1. 在客户端创建socks5代理
    ssh -p 7700 -D 1337 -q -C -N <username>@localhost 
    
    • -p 7700:连接到特定的SSH端口7700
    • -D 1337:在本地端口1337上打开SOCKS代理
    • -q:安静模式,不在本地输出任何内容
    • -C:压缩隧道中的数据,节省带宽
    • -N:不执行远程命令,仅用于转发端口

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接