同一远程主机和端口上有多个SSH反向端口隧道

时间:2013-04-29 06:37:26

标签: linux ssh webserver

我遇到了一些反向端口隧道服务,比如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端口上运行?

1 个答案:

答案 0 :(得分:2)

我花了一些时间玩这个问题。我现在相信远程SSH隧道全部设置为与远程服务器上的同一端口一起工作的前提是错误的。

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

我假设SSH隧道都使用相同的端口,因为所有与子域网址的连接都可能发生在端口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服务器知道如何正确代理。我在工作中闻到一个周末项目。 :)