SSH 隧道简明教程

这篇具有很好参考价值的文章主要介绍了SSH 隧道简明教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本章主要介绍了什么是 SSH 隧道以及如何使用 SSH 隧道,包括 SSH 隧道加密数据传输以及绕过防火墙。

1. 什么是 SSH 隧道

SSH 隧道是 SSH 中的一种机制,它能够将其他 TCP 端口的网络数据通过 SSH 连接来转发,并且自动提供了相应的加密及解密服务。因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输,因此这一过程也被叫做“隧道”(tunneling)。

SSH 隧道也可以叫做端口转发

SSH 隧道能够提供两大功能:

  • 1)加密 SSH Client 端至 SSH Server 端之间的通讯数据。

  • 2)突破防火墙的限制完成一些之前无法建立的 TCP 连接。

本地转发和远程转发

SSH 端口转发自然需要 SSH 连接,而 SSH 连接是有方向的,从 SSH Client 到 SSH Server 。而我们的应用也是有方向的,比如需要连接 MySQL Server 时,MySQL Server 自然就是 Server 端,我们应用连接的方向也是从应用的 Client 端连接到应用的 Server 端。如果这两个连接的方向一致,那我们就说它是本地转发。而如果两个方向不一致,我们就说它是远程转发。

相关参数

  • “-L选项”:local,表示使用本地端口转发创建 ssh 隧道

  • “-R选项”:remote,表示使用远程端口转发创建 ssh 隧道

  • “-D选项”:dynamic,表示使用动态端口转发创建 ssh 隧道

  • “-N选项”: 表示创建隧道以后不连接到 sshServer端,通常与”-f”选项连用

  • “-f选项”:表示在后台运行ssh隧道,通常与”-N”选项连用

  • “-g选项”:表示 ssh 隧道对应的转发端口将监听在主机的所有IP中,不使用”-g选项”时,转发端口默认只监听在主机的本地回环地址中,”-g” 表示开启网关模式,远程端口转发中,无法开启网关功能

2. 演示

本地转发

客户端:192.168.172.131

服务端:192.168.172.133

一般是 server 端有 IP 能访问时用本地转发。

将服务器 192.168.172.133 上的 8888 端口映射到本地[192.168.172.131]的 18888 端口,即将本地 18888 端口流量转发到服务器 192.168.172.133 上的 8888 端口。

比如不能直接访问 server 的 8888 端口,此时就可以使用 ssh 隧道来突破该限制。

在服务器 192.168.172.133 上启动一个 http server:

[root@localhost ~]# python -m SimpleHTTPServer 8888
Serving HTTP on 0.0.0.0 port 8888 ...

然后在本地执行以下命令,开启 ssh 隧道。

命令1

[root@davytestcentos ~]# ssh -N -L 18888:localhost:8888 root@192.168.172.133
root@192.168.172.133's password:
#这里隧道建立后,会正常进行,进程没有退出   -f 后台运行

该命令表示在本地和 192.168.172.133 之间建立 ssh 隧道,由 ssh 客户端监听本地的 8888 端口并将流量转发到 192.168.172.133 的 sshServer,最终由 sshServer 在转发到 8888 端口

每部分参数具体含义如下:

  • “-N选项”:表示创建隧道以后不连接到 sshServer 端

  • “-L选项”:local,表示使用本地端口转发创建 ssh 隧道

  • 18888:localhost:8888:远端的 8888 端口会被转发到 localhost:8888 端口上去。

  • 这里的 localhost 实际上指监听【192.168.172.133 】的本地回环地址,如果要监听其他 IP 也可以手动指定

  • root@192.168.172.133 :我们创建的 ssh 隧道是连接到 192.168.172.133 上的 root 用户的

测试一下,请求本地[curl http://localhost:18888] 18888 端口能否访问到 远程服务器上的 http server。

[root@davytestcentos ~]# curl http://localhost:18888
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
<title>Directory listing for /</title>
<body>
。。。。。。。。。
</body>

这时转发数据流是: client 上的应用客户端将数据发送到本地的 18888 端口上, client 上的 ssh 客户端将本地 18888 端口收到的数据加密后发送到 server 端的 ssh server上,ssh server 会解密收到的数据并将之转发到监听的 8888 端口 最后再将从 http server 返回的数据原路返回以完成整个流程。

可以看到,本地已经开启的 18888 端口的监听。

[root@davytestcentos ~]# netstat -tunlp|grep 18888
tcp        0      0 127.0.0.1:18888         0.0.0.0:*               LISTEN      7306/ssh
tcp6       0      0 ::1:18888               :::*                    LISTEN      7306/ssh

命令2

命令1执行后,没有执行本地地址,默认是在监听本地回环地址。可以设置监听非本地回环地址,比如执行下面这个命令就可以在 ip 192.168.172.131 上监听:

[root@davytestcentos ~]# ssh -N -L 192.168.172.131:18888:192.168.172.133:8888 root@192.168.172.133
root@192.168.172.133's password:

访问网址:

[root@davytestcentos ~]# curl http://localhost:18888
curl: (7) Failed connect to localhost:18888; 拒绝连接
[root@davytestcentos ~]# curl http://192.168.172.131:18888
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
<title>Directory listing for /</title>
<body>
。。。。。。。
</html>

本地端口监听如下:

[root@davytestcentos ~]# netstat -tunlp|grep 18888
tcp        0      0 192.168.172.131:18888   0.0.0.0:*               LISTEN      7400/ssh

命令3

如果你觉得这还不够,希望所有 IP 地址的 18888 端口都被监听,那么可以在建立隧道时开启”网关功能”,使用”-g”选项可以开启”网关功能”:

[root@davytestcentos ~]# ssh -g -N -L 18888:192.168.172.133:8888 root@192.168.172.133
root@192.168.172.133's password:

访问网址:

[root@davytestcentos ~]# curl http://localhost:18888
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
<title>Directory listing for /</title>
<body>
。。。。。。。。。
</body>
</html>
[root@davytestcentos ~]# curl http://192.168.172.131:18888
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
<title>Directory listing for /</title>
<body>
。。。。。。。。。。
</body>
</html>

本地监听情况如下:

[root@davytestcentos ~]# netstat -tunlp|grep 18888
tcp        0      0 0.0.0.0:18888           0.0.0.0:*               LISTEN      7513/ssh
tcp6       0      0 :::18888  

至此,我们已经了解 ssh 本地转发功能了,接下来看一下远程转发。

远程转发

客户端:192.168.172.131

服务端:192.168.172.133

当 server 端没有可以直接访问的 IP 时就无法使用本地转发了,如果本地有 IP 可以直接访问那么还可以使用远程转发,也就是在服务端设置远程转发。

在服务器 192.168.172.133 上启动一个 http server:

[root@localhost ~]# python -m SimpleHTTPServer 8888
Serving HTTP on 0.0.0.0 port 8888 ...

然后假设本地有一个 server (192.168.172.133)端能访问的IP地址 192.168.172.131 ,然后在 服务端(192.168.172.133)上执行以下命令将端口转发到本地端口

[root@localhost ~]# ssh -N -R 18888:localhost:8888 root@192.168.172.131
root@192.168.172.131's password:

可以看做是在 server 端执行的一个本地转发,因为 server 端没有 ip 所以需要反过来操作。

端口监听都是在本地发生,但是执行命令的机器却变成了 server 端。

命令执行后会在本地(192.168.172.131)监听端口,并将流量转发到我们的 server 端。之前本地转发时也是在本地监听端口

将本地服务器(192.168.172.131) 的 18888 端口转发到 server 端的 8888 端口。

唯一区别是远程转发模式下 只能监听本地回环地址,不能监听其他IP,也不能开启网关模式,即无法让其他机器通过本地服务器(192.168.172.133) 来访问 server。

由于是在 server 端执行的命令,因此该场景中 server端扮演的是 ssh client 的角色,而 client 端则是 ssh server。

此时的数据流向为:client 端数据发送到 18888 端口,client 端上的 ssh server 监听该端口并对数据进行加密后转发到 server 端的 ssh client,ssh client 解密数据后转发到 server 节点的 8888 端口。

扩展-跨机器转发

ServerAIP:192.168.172.135

ServerBIP:192.168.172.131

ServerBIP:192.168.172.133

具体场景如下图所示:
ssh隧道,运维,操作性系统,Rundeck,ssh,运维

如上图所示,我们想要在A与B之间创建隧道,最终通过隧道访问到ServerC中的 http 服务。

ServerA与ServerB上没有开启任何 http 服务,ServerC中开启了 http 服务,监听了 8888 端口。

我们需要在 ServerA 192.168.172.135上执行以下命令开启 ssh 隧道:

[root@localhost ~]# ssh -N -L 18888:192.168.172.133:8888 root@192.168.172.131
root@192.168.172.131's password:

执行后 ServerA 上已经开始监听 8888 端口了,默认是在本地回环地址上,需要其他机器访问的话可以指定 ip 或者增加 -g 参数开启网关模式。在本地转发篇讲过

[root@localhost ~]# netstat -tunlp|grep 18888
tcp        0      0 127.0.0.1:18888         0.0.0.0:*               LISTEN      1608/ssh
tcp6       0      0 ::1:18888               :::*                    LISTEN      1608/ssh

然后测试一下

[root@localhost ~]# curl http://localhost:18888
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
<title>Directory listing for /</title>
<body>
。。。。。。。。。
</body>
</html>

注意

上述场景中存在一个问题,就是数据安全性的问题,我们之所以使用ssh隧道,就是为了用它来保护明文传输的数据,从而提升安全性,不过,在上例的场景中,只有ServerA与ServerB之间的传输是受ssh隧道保护的,ServerB与ServerC之间的传输,仍然是明文的,所以,如果想要在上述场景中使用ssh隧道进行数据转发,首先要考虑ServerB与ServerC之间的网络是否可靠。

其实,当我们在创建隧道时如果开启了网关功能,那么应用客户端与Client之间的通讯也会面临同样的问题。

ssh隧道,运维,操作性系统,Rundeck,ssh,运维

其实一般这种场景主要是为了绕过防火墙。

ssh隧道,运维,操作性系统,Rundeck,ssh,运维

动态转发

对于本地端口转发和远程端口转发,都存在两个一一对应的端口,分别位于 SSH 的客户端和服务端,而动态端口转发则只是绑定了一个本地端口,而目标地址:目标端口则是不固定的。目标地址:目标端口是由发起的请求决定的,比如,请求地址为192.168.1.100:3000,则通过 SSH 转发的请求地址也是192.168.1.100:3000。

在本地执行以下命令,

ssh -N -D localhost:2000 root@192.168.172.133

会在本地开启一个 socks 代理,监听 2000 端口

[root@kc-1 tmp]# netstat -tunlp|grep 2000                                           
tcp        0      0 127.0.0.1:2000          0.0.0.0:*               LISTEN      25496/ssh
tcp6       0      0 ::1:2000                :::*                    LISTEN      25496/ssh

我们只需要在本地配置上 socks 代理,localhost:2000 即可把所有请求通过 ssh 2000 端口转发到 192.168.172.133 这台机器上去了。

3. 通过跳转主机建立 SSH 隧道

许多大公司为了保障安全,会实施严格的规则来访问托管应用程序的服务器。其中一种安全措施是在客户端和需要访问的服务器之间放置一个网关,也被称为跳转服务器、跳转主机或跳转盒。

一种典型实现如下:首先需要使用您的凭据打开与 Jump 主机的 SSH 连接。然后,从 Jump 主机内部打开第二个 SSH 连接,以访问需要使用另一个帐户访问的实际服务器。通常,这个帐户是用于部署和运行应用程序的用户,而不是个人帐户。

假设您在这样的公司工作,并且想要创建一个 SSH 隧道,让连接到只能从App Server访问的 Oracle DB Server的端口 1521。您需要做的是创建一个如下所示的 SSH 隧道:

ssh隧道,运维,操作性系统,Rundeck,ssh,运维

以下命令通过跳转主机创建此 SSH 隧道(系统将提示您输入用户密码):

$ ssh -v -N appusr@appserver -J myusr@jumphost -L 1521:dbserver:1521

命令解释:

将本地主机的端口 1521 通过和DB Server的端口 1521建立了隧道。包含以下参数:

  • -v:表示启用详细模式,输出详细的连接信息,这对于调试很有用,并且不返回appserver的 shell 提示符

  • -N:表示禁用远程命令执行,只连接到远程主机,不执行任何命令,也是就是只做转发端口。

  • appusr@appserver:表示要连接的远程主机的用户名和主机名。

  • -J:表示使用代理命令连接到跳板机。

  • myusr@jumphost:其中,myusr 是跳板机的用户名,jumphost 是跳板机的主机名。

  • -L :local,表示使用本地端口转发创建 ssh 隧道。

  • 1521:dbserver:1521:表示将本地端口 1521 映射到远程主机的端口 1521。其中,1521 是本地端口号,dbserver 是远程主机的主机名,1521 是远程主机的端口号。

命令的作用:使用 appusr 用户名连接到 appserver 主机,并通过跳板机 jumphost 连接到 dbserver 主机,将本地端口 1521 映射到远程主机的端口 1521。

换句话说:您首先使用用户myusr与jumphost建立SSH连接,然后使用用户appusr与appserver建立另一个SSH连接,最后将端口1521从本地主机转发到dbserver。

建立后效果: 您可以使用SQL 客户端工具连接到远程数据库服务器,就像它在 localhost:1521 上运行一样。

4. 小结

SSH 有以下功能:

  • 1)保护 tcp 会话,保护会话中明文传输的内容。

  • 2)绕过防火墙或者穿透到内网,访问对应的服务。

常用命令:

创建本地转发模式的ssh隧道,命令如下

ssh -g -N -L forwardingPort:targetIP:targetPort user@sshServerIP

本机上的 forwardingPort 将会被监听,访问本机的 forwardingPort,就相当于访问 targetIP 的 targetPort,ssh隧道建立在本机与 sshServer 之间。

创建远程转发模式的ssh隧道,命令如下

ssh -N -R forwardingPort:targetIP:targetPort user@sshServerIP

sshServer 上的 forwardingPort 将会被监听,访问 sshServer 上的 forwardingPort,就相当于访问 targetIP 的 targetPort,ssh 隧道建立在本机与 sshServer 之间。

5. 参考

SSH Tunneling: Examples, Command, Server Config

ssh端口转发:ssh隧道文章来源地址https://www.toymoban.com/news/detail-739792.html

到了这里,关于SSH 隧道简明教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Verilator】 1 简明教程

    我是 雪天鱼 ,一名FPGA爱好者,研究方向是FPGA架构探索和数字IC设计。 欢迎来关注我的B站账号,我将定期更新IC设计教程。 B站账号: 雪天鱼 ,https://space.bilibili.com/397002941?spm_id_from=333.1007.0.0 先从GitHub下载实验代码 以一个用SystemVerilog编写的简单ALU来作为DUT(device under test)

    2024年02月02日
    浏览(69)
  • mpack简明教程

    本文先简单介绍MessagePack的基本概念。 然后,介绍一个MessagePack C API - MPack的通常使用。 接着尝试对MPack截断数据的读取。 注:本文完整代码见仓库。 如果你使用过C/C++的json库,那么上手MessagePack是比较容易的。关于C/C++ Json库的使用可见:C++ JSON库的一般使用方法-CSDN博客。

    2024年02月20日
    浏览(53)
  • Husky使用简明教程

    Husky 是一个流行的 Git 钩子工具,用于在不同的 Git 操作(如提交和推送)前自动运行脚本。比如代码格式化、静态检查等。这有助于保持代码库的质量和一致性。本教程将详细介绍 Husky 的原理、使用方式、配置方法以及如何在开发中集成 Husky。 Husky 原理 安装 Husky 配置 Hus

    2024年04月10日
    浏览(51)
  • shell简明教程3函数

    在本章中,您将了解为什么以及何时需要使用函数。 你将学习如何创建函数以及如何使用函数。 我们将讨论变量及其作用域。 学习如何使用参数访问传递给函数的参数。 最后,您还将学习如何使用函数处理退出状态和返回代码。 计算机编程和应用程序开发中有一个概念叫

    2024年02月11日
    浏览(52)
  • Blender骨骼动画简明教程

    Blender 是首选的开源3D动画软件之一。 令人惊讶的是,开始创建简单的角色动画并不需要太多时间。 一旦获得最终的 3D 角色模型,你就可以使用该软件的众多动画功能和工具将其变为现实。 推荐:用 NSDT编辑器 快速搭建可编程3D场景 例如,Blender 的绑定工具将帮助你实现角色

    2024年02月07日
    浏览(53)
  • AI绘画工具简明教程

    官方地址 首先需要邮箱注册,等待邀请(可能需要等待一两天) 能成功登录后会进入这样一个界面 https://app.scenario.com/generators 创建模型 提供的图片集上传的时候得是jpg,还需要裁剪成正方形。批量修改图片在线网站:https://www.birme.net/ 根据图集生成图片 官方网址:https://

    2024年02月11日
    浏览(72)
  • WebGPU开发简明教程【2023】

    WebGPU 是一种全新的现代 API,用于在 Web 应用程序中访问 GPU 的功能。 在 WebGPU 之前,有 WebGL,它提供了 WebGPU 功能的子集。 它启用了新一类丰富的网络内容,开发人员用它构建了令人惊叹的东西。 然而,它基于 2007 年发布的 OpenGL ES 2.0 API,而该 API 又基于更旧的 OpenGL API。

    2024年02月16日
    浏览(48)
  • 电商3D产品渲染简明教程

    3D 渲染让动作电影看起来更酷,让建筑设计变得栩栩如生,现在还可以帮助营销人员推广他们的产品。 从最新的《阿凡达》电影到 Spotify 的上一次营销活动,3D 的应用让一切变得更加美好。 在营销领域,3D 产品渲染可帮助品牌创建产品的高分辨率图像和视频,这些图像和视

    2024年02月13日
    浏览(39)
  • stable diffusion使用简明教程

    controlNet模块使用 上面骨骼图是通过Openpose Editor调整姿势然后send to txt2img到这里的,使用Openpose Edito中姿势生成需要将Openpose Editor指定为none状态。 Preprocessor选项: Preprocessor部分选项使用教程 官方教程链接:Control human pose in Stable Diffusion Stable Diffusion Art (stable-diffusion-art.com) 1.

    2024年02月02日
    浏览(46)
  • 汇编语言简明教程习题答案

    (2)判断题 AX被称为累加器,在8086程序中使用很频繁。(✓) 指令指针IP寄存器属于通用寄存器。(✓) 8086具有8个32位通用寄存器。(×) 解析:8086的寄存器有8个16位通用寄存器、4个16位段寄存器、1个16位标志寄存器和1个16位指令指针寄存器 8086编程使用逻辑地址,将其中

    2023年04月08日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包