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 15211TCP    127.0.0.1:15211        0.0.0.0:0              LISTENINGTCP    [::1]:15211            [::]:0                 LISTENING

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

  • 主机:127.0.0.1
  • 端口:15211

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

$ netstat -an|grep 15211TCP    127.0.0.1:15211        0.0.0.0:0              LISTENINGTCP    127.0.0.1:15211        127.0.0.1:60878        ESTABLISHEDTCP    127.0.0.1:60878        127.0.0.1:15211        ESTABLISHEDTCP    [::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@vagrantSQL*Plus: Release 19.0.0.0.0 - Production on Tue Feb 20 05:46:01 2024
Version 19.16.0.0.0Copyright (c) 1982, 2022, Oracle.  All rights reserved.Last Successful login time: Fri Feb 09 2024 08:46:35 +00:00Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0SQL>

查看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端口。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElasticStack安装(windows)

官网 : Elasticsearch 平台 — 大规模查找实时答案 | Elastic Elasticsearch Elastic Stack(一套技术栈) 包含了数据的整合 >提取 >存储 >使用,一整套! 各组件介绍: beats 套件:从各种不同类型的文件/应用中采集数据。比如:a,b,cd,e,aa,bb,ccLogstash:…

图——最小生成树实现(Kruskal算法,prime算法)

目录 预备知识: 最小生成树概念: Kruskal算法: 代码实现如下: 测试: Prime算法 : 代码实现如下: 测试: 结语: 预备知识: 连通图:在无向图…

⭐北邮复试刷题LCR 018. 验证回文串__双指针 (力扣119经典题变种挑战)

LCR 018. 验证回文串 给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。 本题中,将空字符串定义为有效的 回文串 。 示例 1: 输入: s “A man, a plan, a canal: Panama” 输出: true 解释…

你好,iLogtail 2.0!

作者:张浩翔(笃敏) 概述 随着可观测数据采集需求的不断推陈出新,多样化的数据输入输出选项、个性化的数据处理能力组合、以及高性能的数据处理吞吐能力已经成为顶流可观测数据采集器的必备条件。然而,由于历史原因&a…

设计师常常从哪些网站获取灵感?

1、Pinterest Pinterest是一个基于图片共享的社交网站。用户可以在平台上浏览、收集和分享各种想法、设计灵感和项目。Pinterest用户可以在其网站或应用程序上创建虚拟画板(boards),根据主题或兴趣收集和整理你最喜欢的图片(包括…

【k近邻】Kd树构造与最近邻搜索示例

【k近邻】 K-Nearest Neighbors算法原理及流程 【k近邻】 K-Nearest Neighbors算法距离度量选择与数据维度归一化 【k近邻】 K-Nearest Neighbors算法k值的选择 【k近邻】 Kd树的构造与最近邻搜索算法 【k近邻】 Kd树构造与最近邻搜索示例 近邻法的实现需要考虑如何快速搜索个最…

QT的UI入门

二、UI入门 QWidget类(熟悉) QWidget类是所有组件和窗口的基类,内部包含了一些基础的界面特性。 常用属性: 修改坐标 x : const int 横坐标,每个图形的左上角为定位点,横轴的零点在屏幕的最左边&#xff0c…

docker 容器内服务随容器自动启动

docker 容器内服务随容器自动启动 背景准备工作方案一,直接修改.bashrc文件(简单粗暴)方案二,编写启动脚本加入.bashrc文件(文明一点)制作nginx服务自启动镜像测试新镜像,nginx服务随容器自动启…

恶意代码识别率提升95%!谷歌开源人工智能网络安全防御工具

近日,谷歌日前宣布发起网络安全人工智能防御计划,旨在利用人工智能技术提升网络安全水平,扭转困扰网络安全行业的“防守困境”。 该计划的核心举措是开源Magika,这是一款用于文件类型识别的AI工具,能够帮助检测恶意软件…

C++学习Day09之系统标准异常

目录 一、程序及输出1.1 系统标准异常示例1.2 标准异常表格 二、分析与总结 一、程序及输出 1.1 系统标准异常示例 #include<iostream> using namespace std; #include <stdexcept> // std 标准 except 异常class Person { public:Person(int age){if (age <…

网络安全“降本增笑”的三大帮手

在网络安全这个快速变化和危机四伏的领域中&#xff0c;通过使用正确的工具和方法&#xff0c;我们可以在工作中取得更高的效率&#xff0c;并降低相关成本。 雷池社区版 雷池社区版—开源Web应用防火墙。这款产品凭借强大的规则引擎&#xff0c;它允许用户自定义安全策略&…

Docker本地部署Rss订阅工具并实现公网远程访问

文章目录 1. Docker 安装2. Docker 部署Rsshub3. 本地访问Rsshub4. Linux安装Cpolar5. 配置公网地址6. 远程访问Rsshub7. 固定Cpolar公网地址8. 固定地址访问 Rsshub是一个开源、简单易用、易于扩展的RSS生成器&#xff0c;它可以为各种内容生成RSS订阅源。 Rsshub借助于开源社…