SFTP、SSH 和 SSH 隧道

Ang*_*Sen 4 ssh sftp ssh-tunnel

我想详细了解 SSH 隧道的概念,因为我正在围绕这个主题学习一些东西。我已经在公共论坛上浏览了一些细节,但仍然有一些问题。

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

请说清楚。

Max*_*hny 5

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 :] 端口 1 : IP2 : 端口 2
  • L [IP1 :] 端口 1 : IP2 : 端口 2

在这个 ssh 隧道事情中,最令人困惑/最难理解的部分是这些LR标记/开关(或其他)。

那些字母 L 和 R 会让初学者很困惑,因为在这个游戏中实际上有 6(!!!) 个派对(每个派对都有自己的观点,什么是本地的,什么是远程的):

  1. SSH服务器
  2. 你的邻居想要向任何看到服务器的人公开他们的端口
  3. 想要连接到任何服务服务器的邻居看到
  4. 任何看到服务器并想要连接到您的邻居提供的任何服务的人(案例#3 的对面/套接字)
  5. 本地服务器网络中想要暴露给您的 LAN 的任何服务(案例#4 的另一端/套接字)

就 ssh 客户端而言,这些隧道类型是

  • “R”隧道(服务器侦听)-您将本地LAN 中的网络服务暴露给远程 LAN(您指示 sshd 服务器在远程端启动侦听端口并路由所有传入连接)
  • “L”隧道(您侦听) -服务器将其远程 LAN 的资源暴露给您的 LAN(您的 ssh 客户端开始侦听您工作站上的端口。您的邻居可以通过连接到您工作站的端口来访问远程服务器网络服务。服务器进行传出代表您的 ssh 客户端连接到本地服务)

因此,SSH 隧道旨在提供对通常由于网络限制或限制而无法访问的服务的访问。

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

  • 以开放式访问[R表情服务使用-L开关

  • 以开放式访问大号OCAL服务使用-R开关

“R”隧道的例子:

Jack 是您的同事(后端开发人员),他在其 IP 地址为 10.12.13.14 的工作站上开发服务器端代码。您是组织工作条件的团队负责人(或系统管理员)。你和 Jack 坐在同一个办公室,想通过远程服务器将他的 web 服务器暴露给外界。因此,您使用以下命令连接到 ssh 服务器:

 ssh me@server1 -g -R 80:ip-address-of-jack-workstation:80
Run Code Online (Sandbox Code Playgroud)

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

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

ssh rpi1@server -R 10122:localhost:22
Run Code Online (Sandbox Code Playgroud)

RPi 设备 #2

ssh rpi1@server -R 10222:localhost:22
Run Code Online (Sandbox Code Playgroud)

RPi 设备 #3

ssh rpi1@server -R 10322:localhost:22
Run Code Online (Sandbox Code Playgroud)

和 sysadmin 在服务器上时可以连接到其中任何一个:

ssh localhost -p 10122 # to connecto first device
ssh localhost -p 10222 # to connecto second device
ssh localhost -p 10322 # to connecto third device
Run Code Online (Sandbox Code Playgroud)

远程场所的管理员阻止了 ssh 传出连接,并且您希望生产服务器通过您的连接联系 bitbucket...

#TODO: add example
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

通过公共服务器从本地网络向任何人公开一些服务:

典型的命令是

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).
Run Code Online (Sandbox Code Playgroud)

我的隧道在我的电脑上运行良好,但我希望我的同事也能访问我的隧道

您开始的典型工作命令是

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
Run Code Online (Sandbox Code Playgroud)