使用 SSH 隧道通过中间人访问手机上的 Web 应用

使用 SSH 隧道通过中间人访问手机上的 Web 应用

总结: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 应用程序?




我已经研究过以下问题,但无法弄清楚需要什么:

通过多个主机使用 SSH 作为 socks 代理

通过中间机转发 SSH 流量

通过多跳的 SSH 隧道

答案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

相关内容