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虚拟机中访问本地电脑提供的服务了。

相关推荐
萧曵 丶7 小时前
Linux 业务场景常用命令详解
linux·运维·服务器
豆是浪个8 小时前
Linux(Centos 7.6)命令详解:ps
linux·windows·centos
Run_Teenage8 小时前
Linux:深刻理解缓冲区
linux
youxiao_909 小时前
kubernetes 概念与安装(一)
linux·运维·服务器
凡梦千华9 小时前
logrotate日志切割
linux·运维·服务器
wdfk_prog9 小时前
[Linux]学习笔记系列 -- [fs][proc]
linux·笔记·学习
拜托啦!狮子10 小时前
安装和使用Homer(linux)
linux·运维·服务器
liulilittle10 小时前
XDP VNP虚拟以太网关(章节:一)
linux·服务器·开发语言·网络·c++·通信·xdp
Sapphire~10 小时前
Linux-13 火狐浏览器书签丢失解决
linux
不染尘.10 小时前
进程切换和线程调度
linux·数据结构·windows·缓存