Ang*_*Sen 4 ssh sftp ssh-tunnel
我想详细了解 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标记/开关(或其他)。
那些字母 L 和 R 会让初学者很困惑,因为在这个游戏中实际上有 6(!!!) 个派对(每个派对都有自己的观点,什么是本地的,什么是远程的):
就 ssh 客户端而言,这些隧道类型是:
因此,SSH 隧道旨在提供对通常由于网络限制或限制而无法访问的服务的访问。
这是在创建隧道时要记住的简单反直觉规则:
和
“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)
| 归档时间: |
|
| 查看次数: |
687 次 |
| 最近记录: |