SSH tunneling 简明示例

基本概念

SSH tunneling又称为SSH port forwarding。

如果想快速了解其应用场景,这篇文章A short guide to SSH port forwarding 很不错。其详细解释了Client to Server的Local Forwarding。虽然没有涉及Server to Client的Remote Forwarding,但他也指出:

Even though our examples above only discuss client-to-server port forwarding rules, the concept of server-to-client port forwarding is entirely symmetric. Only the roles are reversed: with S2C forwarding, the listening address is relative to the SSH server, and the destination host address is relative to the SSH client.

如果想了解概念和示例,官方的指南就很不错。概念看SSH Tunneling,示例看SSH Tunneling: Examples, Command, Server Config。

Local Forwarding示例

实验的拓扑如下图:
在这里插入图片描述

  • SSH client就是我的笔记本电脑, Windows操作系统。
  • SSH Server和Target Server都在公有云上
    • SSH Server的IP地址或主机名为$SSH_SERVER
    • Target Server的IP地址或主机名为$TARGET_SERVER
  • $L表示本地端口,本例中使用15211
  • $R表示需要连接的目标端口(也就是对外提供服务的端口),本例中使用1521,即Oracle数据库的监听。
  • SSH私钥存放在我笔记本上,文件名为pkey.pem

几个重要的概念:

  • SSH Tunnel只建立在SSH Client和SSH Server间,他们之间配置SSH即可(公钥,私钥,SSH端口)。
  • SSH Server和Target Server间无需配置SSH,只需网络连通并开放必要的端口即可
  • SSH Client和Target Server之间的网络可以不通
  • Target Server只需开放必要的端口(本例为1521)给SSH Server,和SSH Client可以没有任何关系
  • Target Server的IP地址或主机名是给SSH Server用的,和SSH Client没有任何关系。例如当Target Server和SSH Server是同一台主机时,这个地址可以是私网地址。

在我笔记本上执行以下命令,创建SSH Tunnel:

ssh -i pkey.pem ${SSH_USER}@${SSH_SERVER} -L 15211:${TARGET_SERVER}:1521

然后,在我的笔记本(就是Local端),就可以看到在15211端口启动了监听:

$ netstat -an|grep 15211
  TCP    127.0.0.1:15211        0.0.0.0:0              LISTENING
  TCP    [::1]:15211            [::]:0                 LISTENING

此时,可以通过笔记本上的客户端工具(如SQL Developer)测试到目标数据库服务器的连通性,指定:

  • 主机:127.0.0.1
  • 端口:15211

SQL Developer连通数据库后,可以在我的笔记本(Local端)看到建立的连接:

$ netstat -an|grep 15211
  TCP    127.0.0.1:15211        0.0.0.0:0              LISTENING
  TCP    127.0.0.1:15211        127.0.0.1:60878        ESTABLISHED
  TCP    127.0.0.1:60878        127.0.0.1:15211        ESTABLISHED
  TCP    [::1]:15211            [::]:0                 LISTENING

同时,在目标服务器上,也可以看到来自SSH服务器的连接:

$ netstat -an|grep 1521
tcp        0      0 10.0.0.233:1521         0.0.0.0:*               LISTEN
...
tcp        0      0 10.0.0.233:1521         13x.1xx.5x.8x:28658     ESTABLISHED
...

其中10.0.0.233为目标服务器的私网地址,13x.1xx.5x.8x为SSH服务器的公网地址。

Remote Forwarding 示例

实验的拓扑如下图:
在这里插入图片描述
在这个图中,SSH Client就是我的笔记本电脑,同时也是提供服务的Target Server。

SSH Server仍然存在,但和上例不同,Target Server没有了,因为和SSH Client重合了。在我的笔记本上,我装了一个Oracle数据库,端口1521。

在SSH Client上创建反向的SSH Tunnel,其中15211为SSH Server上的监听端口:

$ ssh -i opcbook.pem ${SSH_USER}@${SSH_SERVER} -R 15211:localhost:1521

在SSH Server上,可以看到已经启动了监听。

$ netstat -an|grep 15211
tcp        0      0 127.0.0.1:15211         0.0.0.0:*               LISTEN
tcp6       0      0 ::1:15211               :::*                    LISTEN

这里有一个问题,就是绑定的地址是127.0.0.1。这意味着只能使用SSH Server充当App Client。在其上的tnsnames.ora文件中配置网络服务名vagrant:

vagrant =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 15211))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orclpdb1)
    )
  )

然后就可以使用sqlplus连回我本地的数据库了:

$ sqlplus ssb@vagrant

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Feb 20 05:46:01 2024
Version 19.16.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Last Successful login time: Fri Feb 09 2024 08:46:35 +00:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL>

查看ssh的帮助,关于-R选项,有句话很关键:

By default, TCP listening sockets on the server will be bound to the loopback interface only. This may be overridden by specifying a bind_address. An empty bind_address, or the address ‘*’, indicates that the remote socket should listen on all interfaces. Specifying a remote bind_address will only succeed if the server’s GatewayPorts option is enabled (see sshd_config(5)).

来试一下。

修改"/etc/ssh/sshd_config",修改GatewayPorts为yes。重启sshd。确认已修改:

# sshd -T|grep -i gateway
gatewayports yes

然后使用之前相同的命令建立反向SSH Tunnel,这一回,监听主机不同了:

$ netstat -an|grep 15211
tcp        0      0 0.0.0.0:15211           0.0.0.0:*               LISTEN
tcp6       0      0 :::15211                :::*                    LISTEN

此时,任何客户端都可以来连这个15211端口了。我用笔记本上的SQL Developer试了下,成功了。

注意,由于我的SSH Server是在云上,因此云上的防火墙和其操作系统的防火墙都需开放15211端口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/402618.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高盛:日本这轮通胀是否可持续,关键看房租

租金在日本CPI中的权重高达20%,高盛预计短期内租金将继续拖累通胀至1.7%或以下,长期有望温和上行,使通胀稳在2%的水平。 日本正在转向“去通缩”,房租能否支撑通胀态势? 在日股今年一路高歌、有望“收复失地”时&…

STM32 4位数码管和74HC595

4位数码管 在使用一位数码管的时候,会用到8个IO口,那如果使用4位数码管,难道要使用32个IO口吗?肯定是不行的,太浪费了IO口了。把四个数码管全部接一起共用8个IO口,然后分别给他们一个片选。所以4位数码管共…

想高薪就业鸿蒙HarmonyOS 开发岗位,到底该学习些啥?

鸿蒙是什么? 经过十多年的发展,传统移动互联网的增长红利已渐见顶。万物互联时代正在开启,应用的设备底座将从几十亿手机扩展到数百亿 IoT 设备。GSMA 预测到 2025 年,全球物联网终端连接数量将达 246 亿个,其中消费物…

Nginx网络服务三-----(三方模块和内置变量)

1.验证模块 需要输入用户名和密码 我们要用htpasswd这个命令,先安装一下httpd 生成文件和用户 修改文件 访问页面 为什么找不到页面? 对应的路径下,没有这个文件 去创建文件 去虚拟机浏览器查看 有的页面不想被别人看到,可以做…

电脑蓝牙在哪里打开?1分钟轻松打开蓝牙!

“我在操作电脑的时候想将电脑的蓝牙打开来连接音响和键盘,但是不知道电脑蓝牙应该如何打开,有什么比较简单的方法吗?” 随着无线技术的日益发展,蓝牙已成为连接各种设备的重要桥梁。无论是传输文件、音频还是与外部设备进行通信&…

mysql优化指南之原理篇

之前碰到一个线上问题,在接手一个同事的项目后,因为工期比较赶,我还没来得及了解业务背景和大致实现,只是了解了上线发布的顺序和验证方式就进行了上线,在上线进行金丝雀的时候系统还没发生什么异常,于是我…

独家深度 | 一文看懂 ClickHouse vs Elasticsearch:谁更胜一筹?

简介: 本文的主旨在于通过彻底剖析ClickHouse和Elasticsearch的内核架构,从原理上讲明白两者的优劣之处,同时会附上一份覆盖多场景的测试报告给读者作为参考。 作者:阿里云数据库OLAP产品部 仁劼 原文地址:https://developer.ali…

【鸿蒙 HarmonyOS 4.0】路由router

一、介绍 页面路由指在应用程序中实现不同页面之间的跳转和数据传递。HarmonyOS提供了Router模块,通过不同的url地址,可以方便地进行页面路由,轻松地访问不同的页面。 二、页面跳转 2.1、两种跳转模式: router.pushUrl()&…

为全志D1开发板移植LVGL日历控件和显示天气

利用TCP封装HTTP包请求天气信息 Linux还真是逐步熟悉中,现在才了解到Linux即没有原生的GUI,也没有应用层协议栈,所以要实现HTTP应用,必须利用TCP然后自己封装HTTP数据包。本篇即记录封装HTTP数据包,到心知天气请求天气…

【SiamFC】《Fully-Convolutional Siamese Networks for Object Tracking》

ECCV 2016 Workshops 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 The OTB-13 benchmark5.3 The VOT benchmarks5.4 Dataset size 6 Conclusion(own)/ Future wo…

JS基础之JSON对象

JS基础之JSON对象 目录 JS基础之JSON对象对象转JSON字符串JSON转JS对象 对象转JSON字符串 JSON.stringify(value,replacer,space) value:要转换的JS对象 replacer:(可选)用于过滤和转换结果的函数或数组 space:(可选)指定缩进量 // 创建JS对象 let date {name:"张三…

UE蓝图 返回结果(FunctionResult)节点和源码

系列文章目录 UE蓝图 Get节点和源码 UE蓝图 Set节点和源码 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 UE蓝图 入口(FunctionEntry)节点和源码 UE蓝图 返回结果(FunctionResult)节点和源码 文章目录 系列文章目录一、FunctionResult节点功能二、FunctionResult节点…

利用数字人技术“活”化吉祥物,打造“科技+”数融盛会

在第十四届全国冬季运动会上,吉祥物“蒙古彩娃”安达和塞努不再同于往常静态的吉祥物形象,而是升级为生动活泼、能够与观众实时互动的数字人形象,活跃于赛事宣传、场馆介绍等多个场景,为本届冰雪盛会注入数字活力,提升…

【SQL注入】靶场SQLI DUMB SERIES-26空格和注释被过滤

26题提示所有的空格和注释都会被过滤掉 输入?id0判断闭合方式,回显报错可以确定闭合方式为单引号 正常思路是需要通过注释符将后面的语句注释掉,但是这一关的注释符被过滤了,可以考虑使用将后面的语句也闭合的思路来避免引号带来的报错。输…

【2024软件测试面试必会技能】Postman(1): postman的介绍和安装

Postman的介绍 Postman 是一款谷歌开发的接口测试工具,使API的调试与测试更加便捷。 它提供功能强大的 Web API & HTTP 请求调试。它能够发送任何类型的HTTP 请求 (GET, HEAD, POST, PUT..),附带任何数量的参数 headers。 postman是一款支持http协议的接口调试…

获取 Windows 系统托盘图标信息的最新方案(三)

目录 前言 一、实现 CallWndProcHook 二、安装钩子例程 三、创建消息处理窗口 四、完整代码和注意事项 五、总结&更新 文章出处链接:[https://blog.csdn.net/qq_59075481/article/details/136240462] 前言 在《获取 Windows 系统托盘图标信息的最新方案&#xff08…

“目标检测”任务基础认识

“目标检测”任务基础认识 1.目标检测初识 目标检测任务关注的是图片中特定目标物体的位置。 目标检测最终目的:检测在一个窗口中是否有物体。 eg:以猫脸检测举例,当给出一张图片时,我们需要框出猫脸的位置并给出猫脸的大小,如…

MySQL|MySQL基础(求知讲堂-学习笔记【详】)

MySQL基础 目录 MySQL基础一、 MySQL的结构二、 管理数据库1)查询所有的数据库2)创建数据库3)修改数据库的字符编码4)删除数据库5)切换操作的数据库 三、表的概念四、字段的数据类型4.1 整型4.2 浮点型(float和double)…

MongoDB的介绍和使用

目录 一、MongoDB介绍 二、MongoDB相关概念 三、MongoDB的下载和安装 四、SpringBoot 整合 MongoDB 一、MongoDB介绍 MongoDB是一种NoSQL数据库管理系统,采用面向文档的数据库模型。它以C语言编写,旨在满足大规模数据存储和高性能读写操作的需求。Mo…

如何将 .NET Aspire 应用程序部署到 Azure Container App

作者:Jiachen Jiang 排版:Alan Wang 最近发布的用于构建云原生应用程序的 .NET Aspire 与 Azure Container App(ACA)非常匹配。.NET Aspire 旨在轻松管理由一系列相互依赖的微服务组成的应用程序。Azure Container App 专为微服务…