具有多个动态端口转发的 SSH 隧道

具有多个动态端口转发的 SSH 隧道

我正在尝试通过 ssh 隧道监控在不同服务器上运行的多个 JVM。

感谢这里的一位 UNIX 专家,我成功地通过以下方式在单个服务器上运行它:

  1. jstatd在目标服务器上运行
  2. 设置 Visual VM 使用 9696 作为其袜子代理端口。
  3. 在我的本地 PC 上,运行:

    ssh -L 2222:server1:22 bastion-host
    
  4. 在我的本地 PC 上,运行:

    ssh -o port=2222 -D 9696 -L 1099:localhost:1099 localhost
    

这可以解决问题。现在,当我尝试通过隧道连接到第二台服务器时,我尝试:

  1. 在我的本地 PC 上,运行:

    ssh -L 3333:server2:22 bastion-host
    
  2. 在我的本地 PC 上,运行:

    ssh -o port=3333 -D 9696 -L 2099:localhost:1099 localhost
    

然而,最后一步抱怨:

bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 9696

有没有人设法做类似的事情?

更新:

之所以如此复杂,是因为 jstatd 是一个 RMI 服务器应用程序:

http://download.oracle.com/javase/1.5.0/docs/tooldocs/share/jstatd.html

与 RMI 应用程序一样,它们使用 rmiregistry 进行注册。通过防火墙使用 rmi 需要我使用 SOCKS,如下所述:

http://download.oracle.com/javase/1.4.2/docs/guide/rmi/faq.html#firewallOut

不幸的是,VisualVM 只允许我设置 SOCKS 代理端口一次,并且 -D 选项不允许我将相同的本地端口转发到两台服务器......

答案1

我是否正确地认为您已经拥有计算机(计算机 A),并且有两台服务器(A 和 B),您无法直接在某个端口上连接到它们,因此想通过 SSH 隧道连接到它们?

如果是这样,您可以使用 -L 而不是 -D 在不同的本地端口上从您的计算机创建两个隧道(一个到每个目标服务器),然后在监视工具中连接到本地计算机(无代理设置),就好像它是您要检查的远程服务器。

ssh -L 9000:localhost:<local port jstatd listens on> user@server1
ssh -L 9001:localhost:<local port jstatd listens on> user@server2

然后使用本地监视器连接到 localhost:9000 和 localhost:9001,这些隧道将您连接到目标 jstatd。

如果有中间服务器,则有两跳隧道,

ssh -L 9000:server1:<local port jstatd listens on> user@bastion-host
ssh -L 9001:server2:<local port jstatd listens on> user@bastion-host

嗯,如果 bastion-host 可以与所有 JVM 通信,那么

ssh -D 9000 user@bastion-host

创建一个袜子代理就足够了,然后您就可以通过端口 9000 使用。

答案2

来自 ssh 联机帮助页:

 -D [bind_address:]port
         Specifies a local “dynamic” application-level port forwarding.
         This works by allocating a socket to listen to port on the local
         side, optionally bound to the specified bind_address.  Whenever a
         connection is made to this port, the connection is forwarded over
         the secure channel, and the application protocol is then used to
         determine where to connect to from the remote machine.  Currently
         the SOCKS4 and SOCKS5 protocols are supported, and ssh will act
         as a SOCKS server.  Only root can forward privileged ports.
         Dynamic port forwardings can also be specified in the configura‐
         tion file.

您指定同一本地端口进行两次转发;尝试-D 9697第二个设置。

答案3

最后一步已经说明了一切:它无法开始侦听端口 9696。这是因为,如果这是您的第二个隧道,您应该在 9696 处理第一个隧道时使用另一个端口。

相关内容