参考资料
- SSHポートフォワーディングを利用したログイン方法
- SSHポートフォワードを利用する(Tera Term転送編)
- TeraTermからEC2へ踏み台EC2越しにSSH転送でアクセスする
- 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 实战)
- [3.1 本地端口转发(`Local Forward`)](#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))
- [4.1 本地端口转发(`Local Forward`)](#4.1 本地端口转发(
一. 环境准备
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:1080的SOCKS5代理的程序,
其网络连接都会通过 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协议,才能把本地端口的请求转发出去。
- 在powershell中,

curl.exe --socks5-hostname localhost:1080 https://www.baidu.comcurl更加推荐这样写,这样写的话DNS在 VM中。DNS 在本地的话,有的环境可能会被污染。

四. 使用TeraTerm进行ssh端口转发
⏹很多日企都会使用TeraTerm连接服务器操作,此处介绍TeraTerm的ssh端口转发操作。

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.23的8022端口。
从而实现了将vm虚拟机作为跳板机,连接termux的操作。

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

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