SFTP,SSH和SSH隧道

问题描述 投票:0回答:1

我想详细了解SSH隧道的概念,因为我正在学习有关此主题的一些知识。我在公共论坛上浏览了一些细节,但仍然有一些问题。

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

请澄清。

ssh sftp ssh-tunnel
1个回答
1
投票

SSH隧道,SSH控制台会话和SFTP会话在功能上无关。它们可以在单个会话中同时使用,但是通常不是这样,因此不要尝试在ssh / sftp会话中找到隧道的任何关系或作用。

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

SSH隧道到底是什么?

双方(您和服务器)通常都位于不同的网络中,在这些网络之间不可能建立任意的网络连接。

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

对于启动与远程服务器的连接的用户同样有效:因此,您(ssh客户端)可以看到您的本地资源(工作站节点和服务器节点),但是看不到远程服务器网络上的节点。

这里是ssh隧道

SSH隧道不是辅助ssh相关事物的工具,例如远程控制台ssh会话和安全文件传输,但其他方法却很不同-ssh协议可以帮助您以相同的方式构建传输以隧道化通用TCP连接TCP代理有效。一旦建立了这样的管道并付诸行动,它就不知道通过该管道/隧道传输了什么。

其概念类似于TCP代理。

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

如果使用SSH隧道,则将TCP代理的这种概念分为两​​半-一个节点(参与ssh会话)执行侦听器(连接的接受者的角色,第二个节点执行代理的角色(即发起传出的连接) 。

当您建立到远程服务器的SSH会话时,您可以配置两种类型的隧道,它们在ssh连接处于活动状态时处于活动状态。多个ssh客户端使用类似[]的符号

  • R [IP1:] PORT1:IP2:PORT2
  • L [IP1:] PORT1:IP2:PORT2
  • 此ssh隧道操作中最令人困惑/最困难的部分是避免在这些L / R开关的上下文中将任何actor关联为远程或本地。

这些字母L和R会使人非常困惑,因为在此游戏(OMG)中实际上有6个政党(合同):

  1. ssh服务器
  2. 您的邻居想要向看到服务器的任何人公开其端口
  3. 您要连接到任何服务服务器的邻居看到
  4. 看到服务器并想连接到任何服务的人邻居提供(案例3的相对侧/套接字)
  5. 服务器本地网络中任何想要暴露给您的LAN(案例4的相对侧/插槽)
  6. 就ssh客户端而言,这些隧道类型为

  • “ R”隧道(服务器侦听)-您将网络服务从您的LOCAL公开 LAN到远程LAN(您指示sshd服务器在远程端开始侦听端口并路由所有传入的连接)
  • “ L”隧道(您正在侦听)-服务器公开了其远程LAN的资源
  • 到您的LAN(您的ssh客户端开始侦听工作站上的端口。邻居可以通过连接到以下端口访问远程服务器网络服务:您的工作站服务器代表您的ssh客户端建立与本地服务的传出连接)

    所以SSH隧道就是要提供对服务的访问,由于网络限制或限制,该服务通常是无法访问的。

这里是创建隧道时要记住的简单的直觉规则

  • 使用-L开关打开对R远程服务的访问权限
  • 要打开对L ocal服务的访问,请使用-R开关
  • “ R”隧道的示例:

Jack是您的同事(后端开发人员),他在其IP地址为10.12.13.14的工作站上开发服务器端代码。您是负责组织工作条件的团队负责人(或sysadmin)。您与杰克坐在同一办公室,并希望通过远程服务器将其Web服务器公开给外界。因此,您可以使用以下命令连接到SSH服务器:

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

在这种情况下,互联网上的任何人都可以通过访问http://server1/访问Jack的当前版本的网站>

假设世界上有许多IoT Linux设备(例如raspberry pi)位于多个家庭网络中,因此无法从外部访问。他们可以连接到家庭服务器,并向服务器公开自己的端口22,以便管理员能够连接到所有这些服务器。因此,RPi设备可以通过以下方式连接到服务器:RPi设备#1

ssh rpi1@server -R 10122:localhost:22

RPi设备#2

ssh rpi1@server -R 10222:localhost:22

RPi设备#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
© www.soinside.com 2019 - 2024. All rights reserved.