SFTP,SSH和SSH隧道

6

我想深入了解SSH隧道的概念,因为我正在学习与此主题相关的一些知识。我已经阅读了公共论坛中的一些详细信息,但仍然有一些问题。

  1. 在远程服务器上运行了一个SFTP服务,并且我已经获得了连接到它的凭据。 我正在使用类似WinScp的GUI连接远程服务器。 SSH隧道在这里的作用是什么?
  2. 远程SFTP服务器管理员要求我从我的计算机生成RSA公钥并将其添加到远程服务器中。现在,我可以直接从SSH终端连接到服务器而无需密码。 SSH隧道在这里的作用是什么?
  3. 隧道是否隐含或需要在某些情况下显式调用?

请解释清楚。

1个回答

9

SSH隧道、SSH控制台会话和SFTP会话在功能上没有关联。

它们可以在单个会话中同时使用,但通常不是这种情况,因此不要试图在SSH / SFTP会话中找到任何隧道的关系或作用。

混合使用ssh隧道和多个ssh / sftp会话是没有意义的。基本上,您将使用专用的ssh会话进行隧道连接,并使用额外的会话进行控制台和传输。

SSH隧道到底是什么?

很多时候,双方(您和服务器)位于不同的网络中,这些网络之间的任意网络连接都是不可能的。

例如,由于NAT,服务器可以在其网络上看到工作站节点和服务节点,而这些节点对外部网络不可见。

对于发起与远程服务器的连接的用户也是如此:因此,您(ssh客户端)可以看到本地资源(工作站节点和服务器节点),但无法看到远程服务器网络上的节点。

这就是SSH隧道的用途。

SSH隧道不是一种协助远程控制台ssh会话和安全文件传输的工具,相反,它是通过ssh协议来帮助您建立传输通道,将通用TCP连接隧道化的方式就像TCP代理一样工作。一旦建立了这样的管道并且使用起来,它不知道通过这样的管道/隧道正在传输什么。

它的概念类似于TCP代理。

TCP代理在单个节点上运行,因此它充当连接器和发出者的角色。

在SSH隧道的情况下,TCP代理的概念被分为两半:一个节点(参与ssh会话)扮演侦听器(连接接受者)的角色,而第二个节点则扮演代理的角色(即发起外部连接)。

当您建立到远程服务器的SSH会话时,可以配置两种类型的隧道,在ssh连接处于活动状态时,这些隧道是活动的:

  • R [IP1 :] PORT1:IP2:PORT2
  • L [IP1 :] PORT1:IP2:PORT2

最让人困惑 / 难以理解的是这个SSH隧道中的L和R标记/开关(或类似物)。

那些字母L和R可能会让初学者感到困惑,因为实际上在这个游戏中有6个(!)参与方(每个人都有自己的本地和远程视角):

  1. SSH服务器
  2. 希望向任何看到服务器的人公开端口的邻居
  3. 想要连接到任何服务,服务器可以看到的邻居
  4. 希望连接到邻居提供的任何服务的任何看到服务器的人(情况#3的相反端口/套接字)
  5. 希望暴露给您的LAN的服务器本地网络中的任何服务(情况#4的相反端口/套接字)

在ssh客户端方面,这些隧道类型是

  • "R"隧道(服务器监听)- 您将本地局域网的网络服务暴露给远程局域网(您指示sshd服务器在远程侧开始监听端口并路由所有传入的连接)
  • "L"隧道(您监听)- 服务器将其远程局域网的资源暴露给您的局域网(您的ssh客户端在您的工作站上开始监听端口。您的邻居可以通过连接到您工作站的端口访问远程服务器的网络服务。服务器代表您的ssh客户端对本地服务进行外向连接)

因此,SSH隧道是为提供访问通常由于网络限制或限制而无法访问的服务而设计的。

这里有一个简单的反直觉规则需要记住:

  • 要打开对远程服务的访问,请使用-L开关

  • 要打开对本地服务的访问,请使用-R开关

"R"隧道示例:

Jack是您的同事(后端开发人员),他在IP地址为10.12.13.14的工作站上开发服务器端代码。您是团队负责人(或系统管理员),负责组织工作环境。您与Jack坐在同一办公室,想通过远程服务器将他的Web服务器暴露给外界。

 ssh me@server1 -g -R 80:ip-address-of-jack-workstation:80

假设这种情况下,任何人都可以通过访问http://server1/来访问Jack的当前网站版本。

假设世界上有许多物联网Linux设备(如树莓派)分布在多个家庭网络中,并因此无法从外部访问。它们可以连接到家庭服务器并向服务器公开它们自己的22号端口,以便管理员能够连接到所有这些服务器。因此,RPi设备可以通过以下方式连接到服务器: RPi设备 #1

ssh rpi1@server -R 10122:localhost:22

树莓派设备 #2

ssh rpi1@server -R 10222:localhost:22

树莓派设备#3

ssh rpi1@server -R 10322:localhost:22

当系统管理员在服务器上时,可以连接到其中任何一个。

ssh localhost -p 10122 # to connecto first device
ssh localhost -p 10222 # to connecto second device
ssh localhost -p 10322 # to connecto third device

管理员在远程位置阻止了 SSH 出站连接,您希望生产服务器通过您的连接联系 Bitbucket...

#TODO: add example

SSH隧道中的典型陷阱:

将远程服务映射到本地特权端口

ssh me@server -L 123:hidden-smtp-server:25 # fails
#bind fails due to priviledged ports
#we try to use sudo ssh to allow ssh client to bind to local port switches

sudo ssh me@server -L 123:hidden-smtp-server:25 # fails
#this usually results to rejected public keys because ssh looks for the key in /root/.ssh/id_rsa
#so you need to coerce ssh to use your key while running under root account

sudo ssh me@server -i /home/me/.ssh/id_rsa -L 123:hidden-smtp-server:25

通过公共服务器向任何人暴露本地网络中的某些服务:

典型命令如下:

ssh me@server -R 8888:my-home-server:80
#quite often noone can't connect to server:8888 because sshd binds to localhost.
#To make in work you need to edit /etc/ssh/sshd_config  file to enable GatewayPorts (the line in file needs to be GatewayPorts yes).

我的隧道在我的电脑上只能被我使用,但我希望我的同事也能够访问我的隧道

你通常启动的工作命令是:

ssh me@server  -L 1234:hidden-smtp-server:25
#by default ssh binds to loopback(127.0.0.1) and that is the reason why noone can use such tunnel.
#you need to use switch -g and probably manually specify bind interface:
ssh me@server  -g -L 0.0.0.0:1234:hidden-smtp-server:25

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接