我想详细了解SSH隧道的概念,因为我正在学习有关此主题的一些知识。我在公共论坛上浏览了一些细节,但仍然有一些问题。
请澄清。
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客户端使用类似[]的符号
此ssh隧道操作中最令人困惑/最困难的部分是避免在这些L / R开关的上下文中将任何actor关联为远程或本地。
这些字母L和R会使人非常困惑,因为在此游戏(OMG)中实际上有6个政党(合同):
就ssh客户端而言,这些隧道类型为
所以SSH隧道就是要提供对服务的访问,由于网络限制或限制,该服务通常是无法访问的。
这里是创建隧道时要记住的简单的直觉规则
:和
“ 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