在学习有关此主题的一些知识时,我想详细了解SSH隧道的概念。我已经在公共(public)论坛上浏览了一些细节,但仍然有一些疑问。
请澄清。
最佳答案
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客户端使用如下符号
在此ssh隧道传输中最难理解的部分是这些L和R标记/开关(或其他)。
那些字母L和R会使初学者大为困惑,因为该游戏中实际上有6个聚会!(每个聚会都有自己对本地和远程的看法):
邻居提供(案例3的相对侧/套接字)
您的LAN(案例4的对面/插槽)
就ssh客户端而言,这些隧道类型为:
因此,SSH隧道与提供对服务的访问有关,由于网络限制或限制,该服务通常无法访问。
这是简单的直觉规则,可在创建隧道时记住:
和
“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/