ssh - SFTP,SSH和SSH隧道

标签 ssh sftp ssh-tunnel

在学习有关此主题的一些知识时,我想详细了解SSH隧道的概念。我已经在公共(public)论坛上浏览了一些细节,但仍然有一些疑问。

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

  • 请澄清。

    最佳答案

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

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

    SSH隧道到底是什么?

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

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

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

    这是 ssh隧道

    SSH隧道不是一种工具来协助ssh相关的事情,例如远程控制台ssh session 和安全文件传输,但它却是另一种方法-ssh协议(protocol)可帮助您构建传输以隧道传输普通TCP连接,就像TCP代理工作一样。一旦建立了这种管道并付诸行动,它就不知道通过这种管道/隧道传输了什么。

    它的概念类似于TCP代理。

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

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

    当您建立到远程服务器的SSH session 时,您可以配置两种类型的隧道,这些隧道在ssh连接处于 Activity 状态时处于 Activity 状态。
    多个ssh客户端使用如下符号

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

  • 在此ssh隧道传输中最难理解的部分是这些L和R标记/开关(或其他)。

    那些字母L和R会使初学者大为困惑,因为该游戏中实际上有6个聚会!(每个聚会都有自己对本地和远程的看法):
  • ssh服务器
  • 您的邻居想要向任何看到服务器
  • 的人公开其端口
  • 您想要连接到任何服务服务器的邻居看到
  • 任何看到服务器并想连接到您的任何服务的人
    邻居提供(案例3的相对侧/套接字)
  • 服务器本地网络中要暴露给的任何服务
    您的LAN(案例4的对面/插槽)

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

  • 因此,SSH隧道与提供对服务的访问有关,由于网络限制或限制,该服务通常无法访问。

    这是简单的直觉规则,可在创建隧道时记住:
  • 打开对 R 表情服务的访问,您可以使用 -L 切换


  • 打开对 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
    

    在这种情况下,Internet上的任何人都可以通过访问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
    

    和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
    

    远程场所的管理员阻止了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
    

    关于ssh - SFTP,SSH和SSH隧道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61284981/

    相关文章:

    git - 将 Jenkins 连接到 AWS CodeCommit 存储库

    java - SFTP Java - 管道关闭 Jsch 异常

    java - 使用 JSch 库在 Java 中获取 session 和 SFTP channel

    linux - CentOS 权限、文件夹、用户和群组

    java - "JSchException: reject HostKey"使用 JSch 从 Java 连接到 SSH 服务器时

    linux - Linux 中的 ssh 端口转发(隧道)

    bash - 转义单引号 ssh 远程命令

    git,远程访问 - ssh

    git - Heroku Git - fatal error : The remote end hung up unexpectedly