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 标记/开关(或其他)。
那些字母 L 和 R 会让初学者很困惑,因为在这个游戏中实际上有 6(!!!) 方(每个方都有自己的观点,什么是本地的,什么是远程的):
- 你
- ssh 服务器
- 你的邻居想要将他们的端口暴露给任何看到服务器的人
- 想要连接到任何服务服务器的邻居会看到
- 看到服务器并想要连接到您的任何服务的任何人
邻居提供(案例#3 的对面/插座)
- 服务器本地网络中的任何服务想要暴露给
您的局域网(案例#4 的对面/插座)
就 ssh 客户端而言,这些隧道类型是:
- “R”隧道(服务器侦听)-您将网络服务从您的本地 LAN 公开到远程 LAN(您指示 sshd 服务器开始在远程端侦听端口并路由所有传入连接)李>
- “L”隧道(您监听)- 服务器将其远程 LAN 的资源暴露给您的 LAN(您的 ssh 客户端开始监听工作站上的端口。您的邻居可以通过连接访问远程服务器网络服务到您工作站的端口。服务器代表您的 ssh 客户端与本地服务建立传出连接)
所以 SSH 隧道是关于提供对通常由于网络限制或限制而无法访问的服务的访问。
下面是在创建隧道时要记住的简单反直觉规则:
和
“R”隧道示例:
Jack 是您的同事(后端开发人员),他在 IP 地址为 10.12.13.14 的工作站上开发服务器端代码。您是组织工作条件的团队负责人(或系统管理员)。你和 Jack 坐在同一个办公室,想通过远程服务器将他的 web 服务器暴露给外界。
因此,您可以使用以下命令连接到 ssh 服务器:
ssh me@server1 -g -R 80:ip-address-of-jack-workstation:80
在这种情况下,互联网上的任何人都可以通过访问 http://server1/ 访问 Jack 当前版本的网站
假设世界上有许多 IoT Linux 设备(如树莓派)位于多个家庭网络中,因此无法从外部访问。
他们可以连接到家庭服务器并将自己的端口 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