Linux ssh端口转发

参考资料

  1. SSHポートフォワーディングを利用したログイン方法
  2. SSHポートフォワードを利用する(Tera Term転送編)
  3. TeraTermからEC2へ踏み台EC2越しにSSH転送でアクセスする
  4. SSH 端口转发 👍

目录

  • [一. 环境准备](#一. 环境准备)
    • [1.1 Wind10宿主机](#1.1 Wind10宿主机)
    • [1.2 wsl](#1.2 wsl)
    • [1.3 vm虚拟机](#1.3 vm虚拟机)
    • [1.4 Termux](#1.4 Termux)
  • [二. 简介](#二. 简介)
  • [三. 使用命令行进行`ssh`端口转发](#三. 使用命令行进行ssh端口转发)
    • [3.1 本地端口转发(`Local Forward`)](#3.1 本地端口转发(Local Forward))
      • [3.1.1 实战](#3.1.1 实战)
    • [3.2 远程端口转发(`Remote Forward`)](#3.2 远程端口转发(Remote Forward))
      • [3.2.1 实战1](#3.2.1 实战1)
      • [3.2.2 实战2](#3.2.2 实战2)
    • [3.3 动态端口转发(`Dynamic / SOCKS`)](#3.3 动态端口转发(Dynamic / SOCKS))
      • [3.3.1 实战](#3.3.1 实战)
  • [四. 使用`TeraTerm`进行`ssh`端口转发](#四. 使用TeraTerm进行ssh端口转发)
    • [4.1 本地端口转发(`Local Forward`)](#4.1 本地端口转发(Local Forward))
      • [4.1.1 实战1](#4.1.1 实战1)
      • [4.1.2 实战2](#4.1.2 实战2)
    • [4.2 远程端口转发(`Remote Forward`)](#4.2 远程端口转发(Remote Forward))

一. 环境准备

1.1 Wind10宿主机

1.2 wsl

⏹ip地址:172.22.125.148

bash 复制代码
apluser@FengYeHong-HP:~$ ip -4 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 172.22.125.148/20 brd 172.22.127.255 scope global eth0
       valid_lft forever preferred_lft forever
apluser@FengYeHong-HP:~$

1.3 vm虚拟机

⏹ip地址:192.168.137.129

bash 复制代码
apluser@ubuntu24-01:~$ ip -4 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    altname enp2s1
    inet 192.168.137.129/24 metric 100 brd 192.168.137.255 scope global dynamic ens33
       valid_lft 1568sec preferred_lft 1568sec
apluser@ubuntu24-01:~$

1.4 Termux

⏹ip地址:192.168.3.23


二. 简介

ssh端口转发就是通过 SSH 隧道安全地转发 TCP 端口,用来安全访问原本无法直接访问的网络服务,或者把服务映射到本地或远端。

常见的使用场景:

1️⃣ 安全访问内网 / 防火墙后的服务,很多服务(数据库、Web 后台、开发接口)不允许直接暴露在公网,只能在公司或服务器内网访问。

  • 问题:
    • 你在家里或者外网,无法直接访问远程内网服务
  • 解决办法:
    • 通过 SSH 本地端口转发,把远程服务映射到你本地端口,再访问就像在内网一样了。

2️⃣ 远程提供本地服务,有时候,你本地运行了一个测试服务(比如 HTTP、API),希望远程服务器或其他同事访问,但你本地机器在 NAT/内网。

  • 解决办法:
    • 用 SSH 远程端口转发
  • 原理:
    • 远程服务器端口通过 SSH 隧道映射到你本地端口

3️⃣ 安全访问互联网 / 绕过限制,当你在限制网络(公司、学校或某些国家/地区)时,可能访问不了某些网站。

  • 解决办法:
    • 用 动态端口转发(SOCKS5 代理)
    • 流量通过 SSH 到远程服务器,再由服务器访问互联网
  • 好处:
    • 加密流量 → 防窥探
    • 可以突破防火墙/地理限制

⏹上述的3种使用场景分别对应着3种ssh端口转发规则:

  • 本地端口转发(Local Forward): 本地端口 → SSH → 远端端口
    • 从本地电脑访问远端服务器的内部服务
  • 远程端口转发(Remote Forward):远端端口 → SSH → 本地端口
    • 让远端服务器访问你本地电脑上运行的服务
  • 动态端口转发(Dynamic / SOCKS):SOCKS5 代理
    • 把 SSH 服务器当成代理服务器

三. 使用命令行进行ssh端口转发

3.1 本地端口转发(Local Forward

⏹本地转发(local forwarding)指的是,在你的电脑上创建一个本地端口,将发往该端口的所有通信都通过 SSH 服务器,转发到指定的远程服务器的端口。

这种情况下,SSH 服务器只是一个作为跳板的中介,用于连接本地计算机无法直接连接的远程服务器。

本地转发是在本地计算机建立的转发规则。

⏹语法规则如下

  • -L:转发本地端口。
  • -N:不发送任何命令,只用来建立连接。没有这个参数,会在 SSH 服务器打开一个 Shell。
  • -f:将 SSH 连接放到后台。没有这个参数,暂时不用 SSH 连接时,终端会失去响应。
bash 复制代码
ssh -N -f -L <本地端口>:<目标主机>:<目标端口> <SSH 用户>@<SSH 服务器>

⏹也可以这么理解:

  • 在我这台电脑上监听 9000端口
  • 只要有人连 localhost:9000
  • SSH 就在 192.168.137.129 上 去连接 127.0.0.1:8000
  • 再把数据通过 SSH 隧道转本地电脑

⏹如果经常使用本地转发,可以将设置写入 SSH 客户端的用户个人配置文件(~/.ssh/config)。

bash 复制代码
Host test.example.com
LocalForward client-IP:client-port server-IP:server-port

3.1.1 实战

⏹在vm虚拟机开启迷你python服务器,并绑定127.0.0.1地址,确保只能从vm内部的127.0.0.1的8000端口进行访问。

bash 复制代码
apluser@ubuntu24-01:~$ python3 -m http.server 8000 --bind 127.0.0.1
Serving HTTP on 127.0.0.1 port 8000 (http://127.0.0.1:8000/) ...
  • 可以看到,即使是在vm虚拟机内部,只能通过127.0.0.1:8000进行访问

⏹我们在本地电脑,通过ssh命令进行本地端口转发

bash 复制代码
PS E:\> ssh -N -f -L 9000:127.0.0.1:8000 apluser@192.168.137.129
apluser@192.168.137.129's password:
PS E:\>
PS E:\> Get-NetTCPConnection -LocalPort 9000

LocalAddress                        LocalPort RemoteAddress                       RemotePort State       AppliedSetting OwningProcess
------------                        --------- -------------                       ---------- -----       -------------- -------------
::1                                 9000      ::                                  0          Listen                     1896
127.0.0.1                           9000      0.0.0.0                             0          Listen                     1896

⏹然后就可以看到

3.2 远程端口转发(Remote Forward

⏹远程转发指的是在远程 SSH 服务器建立的转发规则。它跟本地转发正好反过来。建立本地计算机到远程 SSH 服务器的隧道以后:

  • 本地转发是通过本地计算机访问远程 SSH 服务器
  • 而远程转发则是通过远程 SSH 服务器访问本地计算机。

⏹语法规则如下

  • -R:远程端口转发。
  • -N:不发送任何命令,只用来建立连接。没有这个参数,会在 SSH 服务器打开一个 Shell。
bash 复制代码
ssh -R <远程端口>:<目标主机>:<目标端口> -N <SSH 用户>@<SSH 服务器>

3.2.1 实战1

⏹在本地电脑开启迷你python服务器,并绑定127.0.0.1地址,确保只能从本地的127.0.0.1的8000端口进行访问。

bash 复制代码
PS E:\> python3 -m http.server 8089 --bind 127.0.0.1
Serving HTTP on 127.0.0.1 port 8089 (http://127.0.0.1:8089/) ...

⏹本地电脑安装OpenSSH服务器之后,在Powershell命令行中,通过Start-Service sshd开启ssh,确保本地电脑可以被ssh远程访问。

⏹开启之后再次进行确认,可以看到OpenSSH SSH Server处于Running状态了。

bash 复制代码
PS E:\> Get-Service sshd

Status   Name               DisplayName
------   ----               -----------
Running  sshd               OpenSSH SSH Server


PS E:\>

⏹在本地电脑,通过ssh命令远程连接到vm虚拟机之后,进行远程端口转发

  • ssh -R 9001:127.0.0.1:8089 -N apluser@192.168.137.129
  • 因为本次没有使用在后台执行,所以执行了之后,画面没有变化像卡住了一样,这是正常情况。
  • -N:不启动远程 shell,不显示提示符,只会正在老老实实帮我们挂着隧道,维护端口转发

⏹然后我们就可以在vm虚拟机侧,访问本地电脑提供的服务了。

3.2.2 实战2

⏹如下图所示,vm虚拟机可以ssh到termux,但是termux却无法ssh到vm虚拟机。

  • ssh -R 2222:localhost:22 u0_a362@192.168.3.23 -p 8022
  • VM 通过 ssh -R 主动连接 Termux,将 VM 本地的 SSH 服务(localhost:22)映射到 Termux 的 2222 端口,
    从而可以在 Termux 上使用 ssh -p 2222 localhost反向登录回 VM,实现 SSH 切换。

3.3 动态端口转发(Dynamic / SOCKS

⏹动态转发指的是,本机与 SSH 服务器之间创建了一个加密连接,然后本机内部针对某个端口的通信,都通过这个加密连接转发。

它的一个使用场景就是,访问所有外部网站,都通过 SSH 转发。

动态转发需要把本地端口绑定到 SSH 服务器。至于 SSH 服务器要去访问哪一个网站,完全是动态的,取决于原始通信,所以叫做动态转发。

  • 作用:把本地端口变成一个 SOCKS5 代理,所有流量可通过 SSH 隧道发出
  • 用途:访问外部网络(突破防火墙、匿名访问)
bash 复制代码
ssh -D <本地端口> <SSH 用户>@<SSH 服务器> -N

3.3.1 实战

  • 本地电脑通过 ssh -D 建立一个 SOCKS5 动态代理到 VM。本地凡是显式配置为使用 localhost:1080SOCKS5 代理的程序,
    其网络连接都会通过 SSH 隧道转发到 VM,并由 VM 作为出口 访问目标网络。
bash 复制代码
PS E:\> ssh -D 1080 apluser@192.168.137.129 -N
apluser@192.168.137.129's password:
  • curl.exe --proxy socks5://localhost:1080 https://www.baidu.com
    • 在powershell中,curl实际上是Invoke-WebRequest的别名,真正的和linux一样的curl叫curl.exe
    • 这种转发采用了 SOCKS5 协议。访问外部网站时,需要把 HTTP 请求转成 SOCKS5 协议,才能把本地端口的请求转发出去。
  • curl.exe --socks5-hostname localhost:1080 https://www.baidu.com
    • curl更加推荐这样写,这样写的话 DNS 在 VM中。DNS 在本地的话,有的环境可能会被污染。

四. 使用TeraTerm进行ssh端口转发

⏹很多日企都会使用TeraTerm连接服务器操作,此处介绍TeraTermssh端口转发操作。

4.1 本地端口转发(Local Forward

4.1.1 实战1

⏹本地电脑连接到vm虚拟机,在vm虚拟机上开启只允许127.0.0.1的8000端口访问的服务。

然后进行端口转发,将经过本机电脑的8989端口的请求转发到127.0.0.1的8000端口。

⏹然后就可以在本机的8989端口访问vm虚拟机内部的服务了。

4.1.2 实战2

⏹本地电脑连接到vm虚拟机,在vm虚拟机上进行端口转发,将经过本机电脑的9001端口的请求转发到192.168.3.238022端口。

从而实现了将vm虚拟机作为跳板机,连接termux的操作。

⏹因为进行了端口9001的转发,因此我们通过localhost9001端口就可以直接登录到termux

4.2 远程端口转发(Remote Forward

⏹本地电脑开启了python服务,然后通过TeraTerm连接vm虚拟机之后,进行远程端口转发。设置完之后就可以在vm虚拟机中访问本地电脑提供的服务了。

相关推荐
groundhappy4 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
通信小小昕4 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫6 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生6 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.117 小时前
linux基础IO
linux·运维·服务器
BelongPanda9 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯9 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_777998349 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器
yunwei3710 小时前
eBPF 教程:检查 exec 后真正安装的可执行镜像
linux·开源
笑锝没心没肺10 小时前
yum update 报错:GPG key retrieval failed: [Errno 14] HTTPS Error 404 - Not Found
linux·运维·服务器