ssh 是如何工作的?
在 terminal 中 ,当我们输入 ssh username@remote_host
时,terminal 程序调用 ssh client ,ssh client 发起网络请求 ,请求 remote_host
的默认22端口,远端服务器22端口收到请求后,将请求转发到本地的 ssh server 程序。然后 ssh server 和 ssh client 交换 公钥、私钥、cipher suite info。在 ssh server 主机创建 shell 进程。这样 ssh 加密通道就创建完成了。后续的 shell 命令和命令的响应都将通过这个通道传输。
例如,当 ssh 通道建立后,在本地输入 ls
命令,那么 ls 命令将通过通道发送到 ssh server 所在的服务器,并且在 ssh server 中执行。ssh server 的 shell 进程在执行完命令后,将命令所有的输出,重定向到管道,通过管道传递给 ssh-client 的另一端。另一端进行解密并打印到 terminal application 上。
ssh 端口转发,或者 ssh 隧道?
The SSH protocol requires that requests for services on a remote machine be made over channels. A single SSH connection may contain multiple channels, all run simultaneously over that connection.
Each channel, in turn, represents the processing of a single service. When you invoke a process on the remote host with Net::SSH, a channel is opened for that invocation, and all input and output relevant to that process is sent through that channel. The connection itself simply manages the packets of all of the channels that it has open.
This means that, for instance, over a single SSH connection you could execute a process, download a file via SFTP, and forward any number of ports, all (seemingly) at the same time!
Naturally, they do not occur simultaneously, but rather work in a “time-share” fashion by sharing the bandwidth of the connection. Nevertheless, the fact that these channels exist make working with the SSH protocol a bit more challenging than simpler protocols (like FTP, HTTP, or Telnet).
本地转发到远端
本地转发就是通过跳板机将本地的端口转发到远端服务器。本地使用 ssh 程序监听指定端口,并将这个端口的所有请求转发到远端的指定端口。
例如 将 127.0.0.1(local host) 的 1234 (local port) 端口转发到 www.leorain.cn (remote host) 的 80 (remote port) 端口。所有对于 127.0.0.1 的 1234 端口访问都将转发到 www.leorain.cn 的 443 端口。
命令示例:
ssh -i .ssh/jumpserver/jumpserver_tunnel_id_rsa tunnel@123.123.123.123 -L 127.0.0.1:5600:172.16.0.18:5601 -N
本地 ssh-client 与跳板机建立 ssh 隧道,将本地的 5600 端口通过跳板机转发到 172.16.0.18 的 5601 端口上。
-
-i 指定私钥文件
-
-L 定义本地端口转发到远端。格式:
-L [本地主机:]本地主机端口:远程网络主机:远程网络主机端口
-
-N 不执行远端命令。仅做端口转发。如果连接跳板机的用户是禁止登录的,会在发起连接后直接关闭连接。
ps. 一般跳板机都有自己的一套登录、转发程序。如果要自己进行转发,最好的做法是在跳板机创建一个禁止登录的用户(例子中的 tunnel 用户),该用户仅可以发起 ssh 隧道。具体做法: www.leorain.cn
远端转发到本地(内网穿透)
Forwarding remote connections to the local host is also straightforward; simply call the
#remote_to
method of the#forward
service. This takes three (or four) parameters: the local port and host to be forwarded to (in that order), and the remote port to listen on. The fourth parameter is optional, and is the bind address on the remote machine; this defaults to “127.0.0.1”.
假设有这样一个场景:
内网有两个服务器: A 和 C ,远端有一个阿里云服务器 B 。其中内网的 A 可以连接远端的 B,A 可以访问内网 C 的 10808 端口,该端口提供梯子功能。现在 远端的 B 服务器需要使用内网 C 的 10808 端口。由于 C 处于内网,B 不能直接访问,需要由 A 对 B 发起 ssh 连接,并将 B 的 7998(自定义端口) 转发到 C 的 10808 端口上。这样,在 B 服务器内访问 7998 端口,就相当于访问了 C 的 10808 端口。
实际场景:我有一个阿里云服务器(B),要在阿里云服务器内下载一个国外的学术文档。但由于众所周知的原因,阿里云服务器无法直接访问 墙外的狗狗 . 我的本地电脑 (A) 可以直接连接 B 。本地电脑(A) 可以访问局域网电脑 C 的代理端口 10808 。通过远端转发可以将 B 的指定端口通过 A 转发到 C 的 10808 端口。
命令示例:
ssh -R 123.123.123.123:7998:192.168.0.194:10809 ubuntu@123.123.123.123 -N
本地主机 A 对 B 发起 ssh 连接,并将 B 的 7998 端口通过 A 转发到 C 的 10809 上。
- -R 远程转发通过参数
-R
指定,格式:-R [登录主机:]登录主机端口:本地网络主机:本地网络主机端口
sshd_config里要打开AllowTcpForwarding
选项,否则-R
远程端口转发会失败。B 服务器默认监听在 127.0.0.1 上,如果需要绑定0.0.0.0上,让其他主机可以访问B的端口,可以设置sshd_config配置文件 的 GatewayPorts
,或者在 B 服务器内使用 ssh -L 将本地的端口转发到 0.0.0.0 上。连接建立后,在 B 服务器内设置 http_proxy
export http_proxy=http://127.0.0.1:7998
export https_proxy=https://127.0.0.1:7998
w3m www.狗狗.com # 测试一下连接
一切顺利的话,😃 dddd
动态端口转发
动态端口转发,相当于在 ssh 发起端创建一个 SOCKS 代理服务,所有使用这个 socks 的请求,都将转发到 ssh 远端,并将由 ssh 远端发起数据请求,并返回给 ssh 发起端,发起端将数据送回请求端。
命令示例:
ssh -D 127.0.0.1:50000 remote_host -N
将本地的 50000 端口作为 socks 服务端口,请求发送到 本地的 50000 端口,本地端口把请求转发到 remote_host 。
- 动态转发通过参数
-D
指定,格式:-D [本地主机:]本地主机端口
。相对于前两个来说,动态转发无需再指定远程主机及其端口。它们由通过 SOCKS协议 连接到本地主机端口的那个主机。
使用示例:
- firefox
-
dbeaver
参考文献文章来源:https://www.toymoban.com/news/detail-460478.html
- Net::SSH Manual :: Chapter 6: Port Forwarding
文章来源: leorain-ssh隧道原理及三种隧道转发文章来源地址https://www.toymoban.com/news/detail-460478.html
到了这里,关于ssh隧道原理及三种隧道转发模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!