我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SSH 端口转发

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SSH 端口转发

SSH 端口转发

本文用于记录一下 SSH 端口转发功能的学习笔记,以做备忘,主要参考文章如下:

  1. 彻底搞懂SSH远程转发命令
  2. SSH端口转发
  3. An Illustrated Guide to SSH Tunnels

SSH 不仅可以远程登录,还有一个非常实用的功能:端口转发。

SSH 端口转发又叫 SSH 隧道(tunnel),是在 SSH 连接的基础上,通过将客户端或服务器端的某个端口的数据放到 SSH 连接中加密传输,从而在不安全的网络中安全的传输数据或者绕过防火墙的限制实现对目的主机目的端口的访问的一个功能。

端口转发有两个主要作用:

(1)将不加密的数据放在 SSH 安全连接里面传输,在不安全的网络或不受信任的网络提供安全连接,比如通过端口转发访问 Telnet、FTP 等明文服务,数据传输就都会加密,或者在不安全的公用网络中,利用信任的 SSH 服务器访问网络或邮件服务器。

(2)绕过防火墙的限制实现对目的主机的访问。

端口转发有三种使用方法:本地端口转发,远程端口转发,动态端口转发。

本地端口转发(本地隧道)

本地端口转发 是指在 SSH 连接的基础上,将远程的 SSH 服务器作为中介,建立一个本地客户端主机到目的主机(第三台主机)的连接,将对于本地客户端主机指定端口的访问通过 SSH 连接转发给 SSH 服务器,再由 SSH 服务器发到目标主机的目标端口,同时将结果传回。由于被转发的端口位于本地客户端,所以就叫做本地端口转发。本地被转发的端口类似于隧道的的入口,目标主机的目标端口类似于隧道的出口。

创建本地端口转发的命令格式如下:

ssh -L 本地端口:目标主机:目标端口 uesr@host [-N]
  1. 这个命令在本地客户端主机执行,它在建立端口转发的同时也建立了基本的 SSH 连接;
  2. -L 选项表示建立本地端口转发,在之后本地端口、目标主机、目标端口之间用 :(冒号)隔开;
  3. user@host 是登录 SSH 服务器的用户名与地址;
  4. -N 选项(可选)表示这个 SSH 连接只进行端口转发,不登录远程 Shell,不能执行远程命令,只能充当隧道;
  5. 目标主机不一定必须是第三台主机,也可以是 SSH 服务器本身,此时目标主机就是 localhost;如果目标主机是第三台主机,那么端口转发只能保证本地主机至 SSH 服务器之间的连接是安全的,并不能保证 SSH 服务器至目标主机间的连接是安全的,这取决于 SSH 服务器与目标主机的连接方式。

应用场景1

(1)台式机 B 上运行着虚拟机 C,虚拟机使用虚拟机软件搭建的虚拟网络与宿主主机 B 相连接,但在主机 B 以外无法直接访问该虚拟网络。想要通过 SSH,用与台式机 B 处于同一 WiFi 下的笔记本 A 来远程控制虚拟机 C,(在A上)执行端口转发命令:

ssh -L 22022:虚拟机 C 地址:22 desktop_user@台式机 B 地址

这个命令中,22022 是一个主机 A 上未被占用的端口,desktop_user是登录到台式机 B 的用户名,注意此时台式机 B 需要开启 ssh 服务器端服务。
在虚拟机 C 上也开启 ssh 服务器端服务后,在主机 A 上执行:

ssh -P 22022 vitual_user@localhost

这个命令以 SSH 协议访问本机的 22022 端口,这个请求会通过主机 A 和台式机 B 之间的 SSH 连接到达台式机 B,台式机 B 将这个请求转变为对虚拟机 C 的 22 端口的访问请求,并为 主机 A 返回结果,这样就可以在主机 A 上以 SSH 协议登录虚拟机 C。
在这个命令中,-P 选项指定访问特定端口,而不是默认的 22 端口,vitual_user 是登录到虚拟机的用户名,因为主机 A 是访问自己的端口,所以地址是 localhost,也可以利用其它主机访问主机 A 的 22022 端口达到访问虚拟机 C 的目的,此时 localhost 就改为 主机 A 的 ip 地址或域名。

(2)加密访问邮件服务器

想要通过 SSH 连接安全的访问邮件服务器,在本地主机执行以下命令:

ssh -L 1100:mail.example.com:110 mail.example.com

这个命令中,1100 是本机未被占用的端口,mail.example.com 是邮件服务器,这个命令将对本机的 1100 端口的访问转发到邮件服务器 mail.example.com 的 110 端口(邮件获取协议 POP3 协议的默认端口)。端口转发建立以后,POP3 邮件客户端只需要访问本机的 1100 端口,请求就会自动转发到 mail.example.com 的 110 端口。

在这种情况下,邮件服务器 mail.example.com 本身作为中介,必须运行 SSH 服务器,否则,就必须通过另一台 SSH 服务器作为中介,命令如下:

ssh -L 1100:mail.example.com:110 other.example.com

这个命令中,本机的 1100 端口还是绑定 mail.example.com 的 110 端口,但是由于 mail.example.com 没有运行 SSH 服务器,所以必须通过 other.example.com 中介。本机的 POP3 请求通过 1100 端口,先发给 other.example.com 的 22 端口(sshd 默认端口),再由后者转给 mail.example.com,得到数据以后再原路返回。

注意,采用上面的中介方式,只有本机到 other.example.com 的这一段是加密的,other.example.com 到 mail.example.com 的这一段并不加密。

远程端口转发(远程隧道)

远程端口转发 是指在建立 SSH 连接的基础上,将本地客户端主机作为中介,建立一个 SSH 服务器到目的主机(第三台主机)的连接,将对于 SSH 服务器指定端口的访问通过 SSH 连接转发给客户端,再由客户端主机发到目标主机的目标端口,同时将结果传回。由于被转发的端口位于远程 SSH 服务器,所以就叫做远程端口转发。远程 SSH 服务器上被转发的端口类似于隧道的的入口,目标主机的目标端口类似于隧道的出口。

创建远程端口转发的命令格式如下:

ssh -R 远程端口:目标主机:目标端口 uesr@host [-N]
  1. 这个命令同样在客户端主机执行;
  2. -R 选项表示建立远程端口转发,在之后远程端口、目标主机、目标端口之间用 :(冒号)隔开,远程端口是一个在远程 SSH 服务器上的端口;
  3. user@host 是登录 SSH 服务器的用户名与地址;
  4. -N 选项(可选)表示这个 SSH 连接只进行端口转发,不登录远程 Shell,不能执行远程命令,只能充当隧道;
  5. 目标主机不一定必须是第三台主机,也可以是本地客户端主机本身,此时目标主机就是 localhost;如果目标主机是第三台主机,那么端口转发只能保证 SSH 服务器至本地主机之间的连接是安全的,并不能保证本地客户端主机至目标主机间的连接是安全的,这取决于本地客户端主机与目标主机的连接方式。
  6. 注意:OpenSSH 服务器对于远程端口转发的设定,默认只接受远程服务器主机本机上的应用发起的请求,想要从其他连接到服务器的设备发起请求,需将 /etc/ssh/sshd_config 配置文件中 GatewayPorts 选项后的 no 修改为 yes。

应用场景2

(1)台式机 B 上运行着虚拟机 C,虚拟机使用虚拟机软件搭建的虚拟网络与宿主主机 B 相连接,但在主机 B 以外无法直接访问该虚拟网络。想要通过 SSH,用与台式机 B 处于同一 WiFi 下的笔记本 A 来远程控制虚拟机 C,在 B 上执行端口转发命令:

ssh -R 22122:虚拟机 C 地址:22 desktop_user@笔记本 A 地址

这个命令中,22122 是一个笔记本 A 上未被占用的端口,desktop_user是登录到笔记本 A 的用户名,注意此时笔记本 A 是远程 ssh 服务器,此时与本地端口转发的例子是不同的,在本地端口转发的例子中,台式机 B 是远程 ssh 服务器。
在虚拟机 C 上也开启 ssh 服务器端服务后,在笔记本 A 上执行:

ssh -P 22122 vitual_user@localhost

-P 选项指定访问特定端口,vitual_user 是登录到虚拟机的用户名,因为主机 A 是访问自己的端口,所以地址是 localhost。
这样,笔记本 A 对本机 22122 端口的 SSH 访问请求经过台式机 B 和笔记本 A之间的 SSH 连接转发到台式机 B,再由台式机 B 发送给虚拟机 C,这样就建立了笔记本 A 和虚拟机 C 之间的 SSH 连接。

(2)内网计算机 A 运行着 http 服务,但 A 没有公网 IP,其他设备不能使用该服务。恰好云服务器 B 有公网 IP(甚至域名),便于被访问。在不将 http 服务迁移至云服务器 B 的前提下,可以使用 SSH 端口转发使其他设备通过访问 B 的方式访问 A 上的 http 服务。在 A 上执行端口转发命令:

ssh -R 80:localhost:80 cloud_user@server.example.com

这时目标主机是 A 本身(localhost),80 号端口是 http 默认端口,cloud_user 是 B 上的用户名;server.example.com 是 B 的域名。

于是其它人就可以通过访问 http://server.example.com 来访问内网计算机 A 提供的 http 服务了。

动态端口转发

动态端口转发 是指在本机与 SSH 服务器之间建立一个 SSH 连接,然后本机内部针对某个端口的通信,都通过这个加密连接转发,但这种转发不规定目标主机和目标端口,而是去读取应用发起的请求,从请求中获取目标信息。在这种情况下,SSH 服务器要去访问哪一个网站,完全是动态的,取决于原始通信,所以就叫做动态端口转发。

相对的,本地端口转发和远程端口转发在建立时要指定目标主机目标端口,可以统称为固定端口转发

创建动态端口转发的命令格式如下:

ssh -D 本地端口 user@host [-N]

这个命令中,-D 表示动态端口转发,user@host 表示登录到 SSH 服务器的用户名和地址,-N 表示这个 SSH 连接只进行端口转发,不能执行远程命令。

需要注意动态端口转发只绑定本地端口,并没有指定目标主机目标端口,而是在通信到达 SSH 服务器时使用 SOCKS4 或 SOCKS5 协议动态确定。所以,如果要使用动态端口转发访问网络,需要在系统或应用(浏览器等)中设置一个使用SOCKS5 协议、服务器为 localhost、端口为绑定的端口的代理,利用代理使请求走绑定的端口。

举例来说,如果本地端口是2121,那么动态转发的命令就是下面这样。

ssh -D 2121 user@host -N

下面是动态端口转发建立后的一个使用实例:

curl -x socks5://localhost:2121 http://www.example.com

上面命令中,curl 的 -x 参数指定代理服务器,即通过 SOCKS5 协议的本地 2121 端口,访问 http://www.example.com

多级端口转发

端口转发可以有多级,以达到绕过多个防火墙的效果。比如建立两个端口转发,第一个端口转发的出口作为第二个端口转发的入口,通过第二个端口转发访问目标主机目标端口。

例如,本地主机 A 想访问 目的主机 D,但因为防火墙的限制,无法直接连接,现在知道主机 A 可以连接到服务器 B,而服务器 B 可以连接到服务器 C ,服务器 C 可以直接访问目标主机 D,在这种情况下,就可以建立两级连接。

先在主机 A 建立到服务器 B 的本地端口转发:

ssh -L 本地端口:localhost:2999 user_b@服务器 B ip 地址

这个命令在本地主机 A 和 服务器 B 之间建立一个端口转发,2999 是服务器 B 上一个空闲的端口,localhost 表示服务器 B 接收到主机 A 的请求后转发到自己的 2999 端口。这个命令没有加 -N 参数,因为还需要登录服务器 B 建立第二个端口转发。
在登录服务器 B 之后,建立服务器 B 经过服务器 C 到目标主机 D 的端口转发:

ssh -L 2999:目标主机 D:目标端口 user_c@服务器 C ip 地址 -N

这个命令将对 2999 端口的访问请求经由服务器 C 转发到目标主机 D。
这样,最终就通过两级端口转发实现访问主机 A 的端口相当于访问目标主机 D 的目标端口的效果。

来源地址:https://blog.csdn.net/weixin_44149294/article/details/126326474

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SSH 端口转发

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

ssh端口转发怎么用

这篇文章给大家分享的是有关ssh端口转发怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1. 本地端口转发首先在本地主机运行:格式ssh -L local-port:target-host:target-po
2023-06-22

linux ssh端口转发的三种方式

ssh是我使用最频繁的两个命令行工具之一(另一个则必须是vim)。有了ssh,我可以远程处理各种可能出现的问题而无需肉身到现场。 这几天teamviewer被黑的事情影响挺大,于是由远程控制想到了内网穿透,自然而然的想到了ssh的端
2022-06-04

ssh端口转发是什么?有什么用?

目录前言1. 本地端口转发2. 远程端口转发3. 动态端口转发(SOCKS5)4. 本地端口转发 和 动态端口转发有啥区别5. 多级端口转发6. 总结前言 一开始我对 ssh 端口转发这个名词概念很模糊,听起来也很晦涩难懂,不知道它的作用到
2022-06-04

SSH端口转发实现内网穿透的实现

我们局域网的机器能够访问外网,但是外网不能访问内网。因为内网访问互联网时候能确定外网的地址,外网却不能确定我们局域网内的具体地址。(ip地址有限)如果 我们在访问外网的时候,这个链接让他保持、不断,那么这个链接就相当于我们建了一条路
2022-06-04

Linux下的SSH端口转发配置的方法介绍

本篇内容介绍了“Linux下的SSH端口转发配置的方法介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!通常情况下两个不同的网络之间总会开放
2023-06-13

SSH端口转发在Linux SysOps中的应用与实现

SSH端口转发在Linux SysOps中有很多应用和实现方式。应用:1. 安全访问内部资源:通过SSH端口转发,可以安全地访问位于内部网络的资源,而无需直接将内部网络暴露在公共网络中。2. 跨网络访问:使用SSH端口转发,可以跨越不同的网
2023-10-09
2023-09-18

node.js实现端口转发

本文为大家分享的是node.js端口转发实现代码,供大家参考,具体内容如下#!/sbin/nodevar net = require('net');function proxyPort(srcport,destServer,destport
2022-06-04

python-检测ssh端口

#!/usr/bin/env python#-*- coding:utf-8 -*-import socket,sysfrom optparse import OptionParserstat_ok=0stat_warning=1stat_
2023-01-31

云服务器端口转发

云服务器端口转发是指在一个云服务器上部署多个虚拟主机,每个虚拟主机都会分配相应的端口给其上运行的多个虚拟主机,以确保它们之间的通讯畅通无阻。要在一个云服务器上部署多个虚拟主机,通常需要以下步骤:选择一个云主机平台,并安装必要的服务和协议。例如Apache、GoogleCloud、IronPub等。在云主机平台上创建一个云服务器,并将其连接到公共的网关。在这个云服务器上部署多个虚拟主机,每个虚拟主机都有相应的端口。将多个虚拟...
2023-10-27

windows端口转发怎么配置

Windows端口转发可以通过以下步骤进行配置:1. 打开“控制面板”,选择“系统和安全”,然后选择“Windows防火墙”。2. 选择“高级设置”,然后选择“入站规则”。3. 选择“新建规则”,然后选择“端口”。4. 在“指定端口类型”下
2023-06-12

linux端口转发怎么配置

这篇文章主要介绍“linux端口转发怎么配置”,在日常操作中,相信很多人在linux端口转发怎么配置问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux端口转发怎么配置”的疑惑有所帮助!接下来,请跟着小编
2023-06-29

编程热搜

目录