总结:A -> B 和 C -> B 有效。如何让 A->C 有效?
我有 3 个主机
A. A local machine
B. A middle-man
C. A phone with a webapp running on port 333
A 和 C 都可以通过 SSH 进入 B。因此,A->B 和 C->B 可以正常工作,但 A -> C 则不能正常工作。
http://localhost:3344
在 B 上,我可以从 C 创建隧道后 访问此 Web 应用程序:
machine-c$ /usr/bin/ssh -f -N -T -R 3344:localhost:333 user@machine-b
我原本以为,上面的隧道工作正常,我所需要的只是一条从 A 到 B 的隧道,如下所示:
machine-a$ /usr/bin/ssh -f -N -T -L 9999:machine-b:3344 user@machine-b
我可以看到以下消息:
Local connections to LOCALHOST:9999 forwarded to remote address machine-b:3344
但是访问 localhost:9999 会挂起,并重复出现以下消息:
debug2: channel 3: zombie
debug2: channel 3: garbage collecting
debug1: channel 3: free: direct-tcpip: listening port 9999 for machine-b port 3344, connect from ::1 port 24626 to ::1 port 9999, nchannels 4
debug1: Connection to port 9999 forwarding to machine-b port 3344 requested.
debug2: fd 10 setting TCP_NODELAY
debug1: channel 3: new [direct-tcpip]
channel 3: open failed: connect failed: Operation timed out
不确定这是否相关,但由于 A -> B 有效,我还设置了一个反向隧道,以便 B -> A 也能正常工作。B->C 也是如此。因此总体而言,以下方法有效:
A -> B
machine-a$ ssh user@machine-b
B -> A(首先需要从 A -> B 建立反向 SSH 隧道)
machine-a$ ssh -f -N -T user@machine-b -R1234:localhost:22
machine-b$ ssh -p 1234 user@machine-a
对 C->B 也做了同样的事情
我如何设置从 A 到 C 的 SSH 隧道(通过 B?)以便我可以使用 localhost:3344 直接在 A 上访问该 web 应用程序?
我已经研究过以下问题,但无法弄清楚需要什么:
答案1
我有一个类似的设置,它工作正常。我发现的区别是,在您的机器上使用 ssh 命令,9999:machine-b:3344
而我使用9999:localhost:3344
。您的方法对我来说也不起作用,但它不会产生相同的错误。为了完整起见,这是我得到的结果:
debug1: Connecting to localhost [::1] port 9999.
debug1: Connection established.
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.5p1 Debian-6
channel 2: open failed: connect failed: Connection refused
ssh_exchange_identification: Connection closed by remote host`
以下命令对我来说很有效:
machine-c$ ssh -f -N -T -R 3344:localhost:333 user@machine-b
现在在机器a上:
machine-a$ ssh -f -N -T -L 9999:localhost:3344 user@machine-b
由于我没有在机器 c 的 333 端口上运行任何东西,我将其替换为 22,并通过 ssh 连接来检查隧道是否正常工作:
machine-a$ ssh -p 9999 user@localhost