我喜欢通过可视化来解释这种事情。:-)
将您的SSH连接视为管道。大管子。通常,您将通过这些管道来在远程计算机上运行外壳程序。该外壳程序在虚拟终端(tty)中运行。但是您已经知道这部分了。
可以将您的隧道视为管道中的管道。您仍然拥有较大的SSH连接,但是-L或-R选项可让您在其中建立较小的管道。
每个管都有起点和终点。最大的管道,即SSH连接,始于SSH客户端,最后到达您连接的SSH服务器。所有较小的管都有相同的端点,除了“开始”或“结束”的作用是由您使用-L
还是-R
(分别)创建它们来确定的。
(您没有说,但是我将假设您提到的“远程”计算机(位于防火墙后面的一台计算机)可以使用网络地址转换(NAT)访问Internet。这很重要,因此如果错误,请更正此假设。)
创建隧道时,可以指定将在其上应答的地址和端口,以及将其传送到的地址和端口。该-L
选项告诉隧道在隧道的本地端(运行客户端的主机)进行应答。该-R
选项告诉隧道在远程端(SSH服务器)进行应答。
因此...为了能够从Internet SSH到防火墙后面的计算机中,您需要有问题的计算机打开与外界的SSH连接,并包括一个-R
隧道,其“入口”点是防火墙的“远程”端。他的联系。
在上面显示的两个模型中,您想要一个在右边。
从防火墙主机:
ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com
这告诉您的客户建立一个带有-R
表情入口的隧道。连接到隧道远端的端口22222的所有内容实际上都会到达“本地主机端口22”,其中“本地主机”是从隧道出口点(即ssh客户端)的角度来看的。
其他选项是:
-f
告诉ssh进行身份验证后使其本身成为后台,因此您不必坐在远程服务器上运行某些东西即可使隧道保持活动状态。
-N
说您要建立SSH连接,但实际上并不想运行任何远程命令。如果您创建的只是一个隧道,那么包含此选项将节省资源。
-T
禁用伪tty分配,这是适当的,因为您没有尝试创建交互式shell。
除非您为无密码登录设置了DSA或RSA密钥,否则会有密码挑战。
请注意,强烈建议您使用仅为此隧道/客户/服务器设置的一次性帐户(而不是您自己的登录名)。
现在,从您的publichost上的shell中,通过隧道与防火墙主机建立连接:
ssh -p 22222 username@localhost
您将遇到一个主机密钥挑战,因为您可能从未遇到过该主机。然后,您将获得该username
帐户的密码挑战(除非您设置了用于无密码登录的密钥)。
如果您要定期访问此主机,还可以通过在~/.ssh/config
文件中添加几行来简化访问:
host remotehostname
User remoteusername
Hostname localhost
Port 22222
调整remotehostname
并remoteusername
适合。该remoteusername
字段必须与您在远程服务器上的用户名匹配,但是remotehostname
可以是适合您的任何主机名,它不必与任何可解析的匹配。
(要在非本地主机 IP 上公开反向端点,请查看此文章)