SSH端口转发

本文介绍SSH端口转发原理及应用场景,演示如何利用SSH端口转发实现安全的Telnet连接,突破防火墙限制。
   SSH 会自动加密和解密所有SSH 客户端与服务端之间的网络数据。但是,SSH 还能够将其他TCP 端口的网络数据通过SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为SSH 为其他TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP 这些TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是允许SSH 的连接,也能够通过将TCP 端口转发来使用SSH 进行通讯
   SSH 端口转发能够提供两大功能:
  (1)加密SSH Client 端至SSH Server 端之间的通讯数据
  (2)突破防火墙的限制完成一些之前无法建立的TCP 连接
   例如这样一种应用场景:B、C位于企业内部的同一个局域网,A位于互联网上的某个网络,企业内部设置了防火墙,A想通过互联网访问C机器上的telnet服务,由于telenet服务不安全,所以企业的防火墙策略中一般会禁止外部用户访问内部机器上的telnet,并且企业一般不允许开VPN,开VPN相当于直接连到企业内部。由于ssh服务是比较安全的,所以企业的防火墙策略中一般会允许外部用户访问内部某个运行着ssh服务的主机,所以A要访问C上的telenet服务可以通过ssh端口转发的方式,假设B就是一个ssh服务器,即A可以通过访问B上的ssh服务进而去访问C上的telenet服务,此时B是堡垒机,相当于一个跳板,A借助这个跳板访问企业内部C的telnet服务,此时A和B之间是ssh连接,B和C之间。下面模拟一下这种场景:
   A:centos7(192.168.25.107)
   B:rhel5(192.168.25.100)
   C:centos6(192.168.25.106)

这里写图片描述

查看C上是否安装了telnet服务

这里写图片描述

查看telnet服务是否已打开(由图中可看出telnet服务已设为开机启动)

这里写图片描述

telnet服务的23端口已打开

这里写图片描述

先禁用一下C的防火墙

这里写图片描述

拒绝来自于A发起的请求,模拟防火墙对telnet连接的限制

这里写图片描述

A上确认一下没有其他服务正在使用9527端口

这里写图片描述

   因为之前做了基于key验证的实验,所以没有输密码直接就连上了,并且跳转到了远程shell即B上,即此时A与B已经建立起ssh连接,相当于为不安全的telnet连接搭建了一个安全的隧道。此时想在A上继续执行命令,不能exit退出远程shell,因为此时隧道已经建起来了,若exit,隧道就断开了,所以要么再单独开一个终端,要么加-Nf选项。

这里写图片描述

-N不打开远程shell,不跳到远程主机
-f直接在本机执行命令,不用再打开新终端,即后台执行
 192.168.25.106 目标主机C的IP
 23目标主机C上的服务端口,即telnet服务
 192.168.25.100跳板机B的IP(应确保跳板机上有ssh服务)

这里写图片描述

    如图第三个连接,是B的22端口(即B的ssh服务)连接到A的32926端口,即A和B的ssh连接已建立,即隧道已经搭好了,就等着发起telenet流量了,此时还没有telenet连接。

这里写图片描述

本地的9527端口已处于监听状态

这里写图片描述

C上还没有到23端口的连接,即还没有到telenet服务的连接

这里写图片描述

这里写图片描述

   执行完ssh -L命令后,就在本机(即A)打开了一个随机端口32926,用作ssh客户端,并且建立起与ssh服务器(即B)的连接,并且打开本机(即A)的9527端口,让其充当telenet服务器,去监听本机的telnet请求
   执行完telenet 127.0.0.1 9527命令后,就在本机(即A)打开了随机端口38528,充当telenet客户端,由它发起telnet请求,本机的9527端口(即telnet服务端)监听到请求后,就与本机的38528端口(即telenet客户端)建立起telnet连接
   本机的9527端口(即telnet服务端)接收到telnet数据包后,就将其转交给本机32926端口(ssh客户端),由它对telnet数据包进行加密封装,封装成ssh包,并由由它转发给ssh服务器(即B)的22端口
   图中第一个连接是38528端口(即telenet客户端)向9527端口(即telnet服务端)发起的连接,第三个连接是9527端口(即telnet服务端)向38528端口(即telenet客户端)发起的连接,因为两个端口位于同一台主机,所以都在这里显示了出来。

这里写图片描述

    ssh服务器(即B)收到ssh客户端(即A)发来的ssh包后,将其解密解封装,得到telnet数据包,然后在本机打开53580随机端口用作telnet客户端,并将telnet数据包转发给telnet服务器(即C)的23端口
    图中第三条连接是ssh客户端(即A,端口为32926)到B(即ssh服务器)的连接;
    第一条是B(即telnet客户端,端口为53580)到telnet服务器(即C,端口为23端口)的连接。

这里写图片描述

    此时C上已建立起telnet连接,是由telnet客户端(即B,端口为53580)发起的

这里写图片描述

   如图可看出,A已经成功连上了C

这里写图片描述

   exit退出与远程shell的连接

这里写图片描述

   退出后,A上telnet服务器(即本机的9527端口)与telenet客户端(本机的38528端口)之间的telnet连接断开,
   B(即telnet客户端,端口为53580)到C(即telnet服务器,端口为23端口)的telnet连接断开
   此时只剩下ssh客户端(即A)与ssh服务器(即B)的ssh连接,即隧道仍存在,本机的9527端口仍处于监听状态

这里写图片描述

   用ps aux可看到后台执行的ssh服务

这里写图片描述

   关闭ssh进程

这里写图片描述

   关了之后本机的9527端口也关了

这里写图片描述

  此时A再次发起telenet连接已经连不上了
### Ollama SSH 端口转发配置指南 Ollama 是一种用于管理大型语言模型的工具,但它本身并不直接提供 SSH 功能。然而,可以通过标准的 OpenSSH 配置实现端口转发功能,并将其集成到涉及 Ollama 的工作流中。 以下是关于如何通过 SSH 进行端口转发的相关说明: #### 本地端口转发 当需要将远程服务器上的某个服务暴露给本地计算机时,可以使用以下命令设置本地端口转发: ```bash ssh -L <local_port>:<destination_host>:<destination_port> user@remote_server ``` 在此场景下,`<local_port>` 表示本地监听的端口号,`<destination_host>` 和 `<destination_port>` 则表示目标主机及其开放的服务端口[^2]。 例如,如果希望将运行在 `10.2.2.9` 上的 MySQL 数据库(默认端口为 3306)映射到本地机器上,则可执行如下命令: ```bash ssh -L 3307:10.2.2.9:3306 user@ssh_gateway ``` 这样,在本地访问 `localhost:3307` 就相当于连接到了 `10.2.2.9:3306`。 #### 远程端口转发 对于某些情况下可能需要让外部网络能够访问本机的一个特定服务的情况,可以采用远程端口转发的方式完成此操作: ```bash ssh -R <remote_port>:<source_host>:<source_port> user@remote_server ``` 这里 `<remote_port>` 定义的是远端要绑定的端口;而 `<source_host>` 及其对应的 `<source_port>` 指定源地址和服务端口[^1]。 假设有一款仅限局域网内部使用的 Web 应用程序正在 localhost 的 8080 端口上运行,那么为了让其他同事也能看到这个页面,就可以这样做: ```bash ssh -R 8081:127.0.0.1:8080 colleague@example.com ``` 此时任何向 `colleague.example.com:8081` 发起请求的操作都会被重定向至发起者的个人电脑并返回相应数据。 #### 多节点环境下的无密码 SSH 设置 在一个多节点环境中,为了简化跨节点间通信流程以及提高效率,通常建议预先建立好免密登录机制以便后续自动化脚本调用更加顺畅[^3]。具体做法包括但不限于交换公钥文件等内容。 首先确认当前用户的 .ssh 文件夹是否存在 id_rsa.pub 类型的公开密钥材料,如果没有则先创建一对新的 RSA 密码对儿: ```bash ssh-keygen -t rsa -b 4096 -C "your_email@example.com" ``` 接着把生成出来的 public key 添加进每一个目标设备中的 authorized_keys 文档里头去: ```bash cat ~/.ssh/id_rsa.pub | ssh user@target_node 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys' ``` 最后测试一下能否成功达成无需输入额外验证信息即可顺利完成整个链接过程的效果: ```bash ssh target_node ``` 如果一切正常的话应该可以直接跳转过去而不必再手动填写账号密码之类的信息了。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值