![我可以使用其他主机而不是本地主机作为 SSH 反向隧道端口转发中的目标字段吗?](https://linux22.com/image/1551253/%E6%88%91%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%E5%85%B6%E4%BB%96%E4%B8%BB%E6%9C%BA%E8%80%8C%E4%B8%8D%E6%98%AF%E6%9C%AC%E5%9C%B0%E4%B8%BB%E6%9C%BA%E4%BD%9C%E4%B8%BA%20SSH%20%E5%8F%8D%E5%90%91%E9%9A%A7%E9%81%93%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E4%B8%AD%E7%9A%84%E7%9B%AE%E6%A0%87%E5%AD%97%E6%AE%B5%E5%90%97%EF%BC%9F.png)
192.168.1.132:8081
我正在使用 Putty 实现 SSH 反向隧道端口转发。大多数教程都教我将远程端口转发到本地主机端口。但是,我想知道在目标字段中输入其他主机是否有意义?
我曾尝试这样做。192.168.1.132:8081
是一个具有内容页面的正常运行的 Web 服务器,但是ERR_EMPTY_RESPONSE
当我从客户端设备访问localhost:12345
(我将端口设置12345
为源端口)时,出现了问题。
我的 Putty 配置
传出代理配置:
隧道配置(Dynamic
一个用于Socks5连接,请忽略它;一个R12345
是我正在使用的隧道):
我尝试从目标(SSH 服务器)访问隧道的结果是:
谁能帮我?
更新 1
在运行 SSH 命令的设备中,我通过代理服务器进行通信。这会影响反向隧道行为吗?
更新2
我尝试直接从 http 服务器建立反向隧道。但是在 SSH 服务器中,我可以通过以下方式访问网站:http://本地主机:12345. 附加设置和结果如下。
答案1
是的!
但你需要明白,这other_host
是你将要指定的是在的LAN network
ssh 客户端. 因为ssh 客户端和ssh 服务器可以位于两个不同的 LAN 网络中。
例如:
ssh -R 1234:192.168.1.69:4321 [email protected]
# ^
# |_ other_host
然后,你最好确保192.168.1.69
从你这边可以 ping 通(ssh 客户端192.168.1.69
)。terabithia的网络局域网内可能存在与 terabithia.com 类似的 IP 地址的机器,但那不是other_host
上面代码片段中提到的那个。
需要注意一些细微的事情:
- 尽管您在 terabithia.com 内设置了监听 TCP 端口 1234,但这在 terabithia.com 内并不对外开放。这意味着,如果您到
nc -w 5 -z terabithia.com 12202 && echo "open" || echo "close"
那时检查端口是否打开,您将看到close
打印的消息,因为该端口仅在 terabithia.com 内可访问。 nc -w 5 -z localhost 1234
即使没有监听端口,other_host
或者根本other_host
不存在监听端口,该命令在 terabithia.com 中也始终会成功执行。在这种情况下,错误消息会打印在ssh client
控制台中。- 由于 ssh 是基于 TCP 的面向连接的通信协议,因此您需要组合使用其他工具(例如
nc
或socat
来转发 UDP 端口)。 -R
两个主要的混淆是和的使用-L
。理解这个主题的诀窍是认为ssh client
和属于两个不同的网络 LAN。如果ssh server
,则 的上下文other_host
取自LAN 。否则,如果,则上下文取自LAN。ssh client's
-R
-L
ssh server's
- 只有添加该字段才
-L
可以打开可公开访问的端口address binding
。
答案2
是的,你可以这样做,但如果你不了解它是如何工作的,就很容易做出错误的假设。
如果我没记错的话(已经过去好几个月了,所以为了尽快给您答复,我希望我没记错……),
指定为“本地”端口的隧道将导致一个软件(我将其称为“侦听器”)在运行 SSH 客户端的机器上进行侦听。“远程”端口将导致一个软件(我将其称为“侦听器”)在运行 SSH 服务器的机器上进行侦听。
了解带有隧道的 Localhost:
现在,这是真正棘手的部分,很容易让您陷入困境。通常,当您在一台计算机上时,您会认为“localhost”指的是该计算机。但是,嗯,不是。最好将“目的地”字段视为文本。因此,在侦听器收到流量后,侦听器将通过本地 SSH 软件转发该流量,该软件将加密数据并通过隧道推送流量。发送流量的一方还将提供“目的地”信息。然后,远程 SSH 软件将接收该流量,并查看目的地的内容,然后尝试将流量发送到那里。
因此,如果您在客户端上输入“localhost”,则文本“localhost”将通过 SSH 隧道发送,而实际上是远程端将解析“localhost”。因此,localhost 很容易指向与您输入名称的机器不同的机器。
答案3
我可以使用其他主机而不是本地主机作为 SSH 反向隧道端口转发中的目标字段吗?
是的,你可以在目标主机字段中输入任何你想要的主机
命令行隧道定义
为了回答这个问题,我将使用以下形式X:Y:Z
,这是命令行 SSH 客户端描述隧道的方式,其中该隧道:
- 源端口
- 1234
- 目的地
- 本地主机:4321
将被描述为1234:localhost:4321
隧道如何运作
有两种类型的隧道具有目的地设置:
本地隧道
对于定义为的隧道,X:Y:Z
您可以将流量视为发送到客户在港口X
,以及服务器连接到Y
端口上的主机Z
,并转发所有流量。
远程隧道
对于定义为的隧道,X:Y:Z
您可以将流量视为发送到服务器在港口X
,以及客户连接到Y
端口上的主机Z
,并转发所有流量。
隧道可以做什么
本地隧道可用于:
- 访问无法通过互联网访问的服务
- 访问只能从特定 IP 使用的服务
远程隧道可用于:
- 允许远程系统访问本地计算机上的端口,但不将其暴露给互联网
- 通过互联网暴露您网络上的其他系统
答案4
如果您指定了代理,那么在某些情况下,您需要将本地 IP 地址(本例中为 192.168.1.132)添加到代理设置面板中的“排除的主机/IP 地址”列表中。否则,通过 putty 进行的反向 ssh 连接将尝试使用代理连接到本地 IP 地址。