7

我遇到过一些反向端口隧道服务,例如http://progrium.com/localtunnel。我知道他们允许我轻松设置反向 SSH 端口隧道,这让我可以在线显示我的本地 Web 服务器(例如,我在端口 3000 上本地运行 Rails 应用程序,并使用 localtunnel 的服务,我可以通过 URL 在线与某人共享它像 xhd3s.localtunnel.com。)

不过,我对它的工作原理有点困惑。设置远程隧道时,您必须指定要接管的远程端口,这意味着远程服务器上的每个端口一个隧道。但是,使用这些端口隧道服务,每个人都指定相同的远程端口。唯一的区别是标记化的子域。

他们如何获取标记化的子域并将其转换为使用相同端口的唯一隧道?我怀疑有一些网络服务器魔法在起作用,但我不太确定这将如何工作。

编辑:

换句话说,我希望能够从两台不同的计算机发出这些命令:

# first computer
ssh -R 9000:localhost:3000 jim@xcvs.myserver.com

# second computer
ssh -R 9000:localhost:3000 john@csde.myserver.com

我应该在 myserver.com 上做什么以允许这两个反向端口隧道在端口 9000 上运行?

4

1 回答 1

2

我花了一些时间来解决这个问题。我现在认为远程 SSH 隧道都设置为使用远程服务器上的相同端口的前提是错误的。

但是在尝试了一些概念证明之后,我想我隐约知道他们在做什么。

我假设 SSH 隧道都使用相同的端口,因为到子域的 URL 的所有连接都可能发生在端口 80 上。但是,如果您设置代理在您的网络服务器中传递,您可以将流量转发到不同的端口服务器。

这是 Nginx 代理传递的一些概念证明:

server {
    listen 80;
    server_name xcvs.myserver.com;

    location / {
        proxy_pass http://127.0.0.1:5222;
    }
}


server {
    listen 80;
    server_name csde.myserver.com;

    location / {
        proxy_pass http://127.0.0.1:5223;
    }
}

因此,端口 80 上这两个不同子域的流量被代理到不同的端口,然后您可以使用这些端口设置 SSH 隧道。

不过,设置中仍然存在一些谜团。当您使用诸如 localtunnel 之类的服务设置隧道时,您发出如下命令:

$ localtunnel 3000

我认为这是在访问服务器,取回一个新的端口号和子域对,然后为您发出带有这些值的远程 SSH 隧道命令。

但是,我有点不清楚如何自动创建子域并将其映射到端口,以便 Web 服务器知道如何适当地代理。我闻到了一个周末项目在进行中。:)

于 2013-05-03T23:24:09.323 回答