利用好 macOS 端口转发,发挥大用处,小白教程

144 阅读9分钟

利用好 macOS 端口转发,发挥大用处,小白教程

端口转发这个词,很多人一听就感觉有点:
“这东西,好像听过,但没真用过。”

但说简单点,其实就是一句话:

「我现在碰不到这台机器,那就找一台能碰到它的,帮我转一下,有点像代理。」

不着急,我们先从基础说起,让小白也能看完就敢自己动手。


一、先过下基础:IP 和端口

这个你肯定知道,但我们快速过一下,后面会反复用到。

  • • IP 地址:哪台机器
  • • 端口号:这台机器上的哪个服务,一个 IP 上可以跑很多服务,用端口来区分

常见的几个端口:

  • • 22:SSH
  • • 80 / 443:HTTP / HTTPS
  • • 3306:MySQL
  • • 6379:Redis

你可以把它想象成:

IP 是小区 + 楼栋,端口是门牌号。
找到了小区,还得知道几单元几室,才能敲对门。


二、为什么要端口转发?

理想情况:你想连一台机器,直接来一句:

ssh user@server
mysql -h server -P 3306

现实情况大概是这样:

  • • 数据库在内网,没有公网 IP
  • • 公司有好几层防火墙、NAT,外面根本打不进来
  • • 某些端口根本没对外开
  • • 真正的目标机器,只能先 SSH 到跳板机,再从跳板机进内网

这时候就轮到 端口转发 登场了:

把「我能连到的那台机子」变成「帮我中转的中介」,让它把流量转给真正的目标。


三、SSH 端口转发的三种姿势

以 SSH 为例,常见就三种:

  • • 本地转发-L
  • • 远程转发-R
  • • 动态转发-D(SOCKS 代理)

记住一个原则:看清楚「谁在访问谁」,方向弄明白了,命令就不绕。


四、本地端口转发:把远端服务「搬」到本地(-L

4.1 场景描述

公司内网有个 MySQL:10.0.0.5:3306,外网访问不到。
但你能 SSH 到跳板机 jump,而 jump 能访问这个 MySQL。

有时甚至是同一台机器:
3306 端口因为安全原因没对外开放,但你可以 SSH 登录。
这时候就可以用到 -L

4.2 核心命令

ssh -L 3307:10.0.0.5:3306 user@jump

这行命令在做什么?

  • • 在你 本机 开了一个端口:127.0.0.1:3307
  • • 你连这个本地端口
  • • SSH 把流量塞进加密隧道
  • • 跳板机再帮你转发到 10.0.0.5:3306

然后你在本地的 MySQL 客户端只需要这样配置:

  • • host:127.0.0.1
  • • port:3307

对客户端来说:

「我连的是本地一个 MySQL。」

实际上你是拐了好几道弯,连到了内网的数据库。

一句话理解:

本地端口转发 = 把远端服务映射到我本地一个端口。

如果你觉得命令行麻烦,也可以用像 DartShell 这样的图形化工具,一点一点配:
这里就可以放 DartShell 的本地端口转发示意图:[图1]


4.3 在 macOS 上怎么确认本地端口开起来了?

开了上面的 -L 之后,可以在 macOS 上用:

lsof -iTCP -sTCP:LISTEN -n -P | grep 3307

看到类似:

ssh     12345 user   5u  TCP 127.0.0.1:3307 (LISTEN)

说明本地的 3307 端口已经在监听,转发生效。


五、远程端口转发:把本地服务「搬」到远端(-R

5.1 场景描述

你在本地跑了一个 Web 服务:http://localhost:3000,想让远端服务器访问到。

比如你在家办公,本地起了个系统给同事看:

  • • 同事在公司,访问不到你家里的电脑
  • • 但你们都有一台都能访问到的外网服务器

这时候可以通过这个外网服务器当「中转展示机」。

5.2 核心命令

ssh -R 8000:localhost:3000 user@remote

这行命令的意思:

  • • 在远端 remote 这台服务器上开一个端口:127.0.0.1:8000
  • • 远端访问 localhost:8000 时
  • • 流量经过 SSH 隧道
  • • 被转回你本机的 localhost:3000

5.3 适用场景

  • • 远端的程序要调你本地的接口
  • • 临时给同事看你本地跑的 demo,不想专门部署一套公网环境

远程端口转发 = 把我的本地服务,借远端机器的端口,对外露出一小角。

用图形化工具(比如 DartShell)的话,大概就是在「远程转发」里填:

  • • 远端端口:8000
  • • 本地目标:localhost:3000

这里可以放 DartShell 远程端口转发的截图:[图2]


六、动态端口转发:通用的 SOCKS 代理(-D

一个疑问:那我是不是每个端口,都要配置一次?

如果你想更通用一点,有个「全局通道」,可以用 -D

6.1 核心命令

ssh -D 1080 user@jump

这会在你本地开一个 SOCKS5 代理

  • • 地址:127.0.0.1
  • • 端口:1080

如果你在浏览器里设置:

  • • SOCKS5 代理:127.0.0.1:1080

那所有浏览器请求的流程变成:

    1. 先发给你本地 1080
    1. 进 SSH 加密隧道
    1. 再由 jump 帮你访问目标网站

可以理解成:

「我本地所有网络请求,先走到跳板机那边,再从那儿出去。」

6.2 适用场景

  • • 只有特定出口 IP 才能访问的系统
  • • 只能从内网访问的资源

七、路由器端口映射 vs SSH 端口转发

两者都可以叫「端口转发」,但做事的位置不一样。

7.1 路由器端口映射(NAT)

  • • 在网关设备上做
  • • 例如:公网 :8080 → 内网 192.168.1.100:80
  • • 更偏向「网络设备配置」,需要改路由器设置

7.2 SSH 端口转发

  • • 建立在一条 SSH 连接之上
  • • 不用改路由器,只要你能 SSH 进去就行
  • • 自带加密、认证,比直接暴露端口安全很多

一句话总结:

改路由器是「在墙上开洞」,
SSH 转发是「在现有管道里再拉一根小管子」。


八、几个你大概率会用到的实战场景

8.1 场景 1:连数据库 / Redis,不暴露端口(最常用)

生产数据库通常:

  • • 在内网
  • • 只允许特定机器访问
  • • 很少会直接对外开放端口

内网 MySQL:10.0.0.5:3306,只允许从跳板机访问。

命令:

ssh -L 13306:10.0.0.5:3306 dbadmin@jump

然后你本地连:

  • • host:127.0.0.1
  • • port:13306

体验上:

跟连本地 MySQL 没太大区别,但安全性和隔离做得更好。


8.2 场景 2:在家访问公司内网 Web 面板

内网有一个运维面板:http://10.0.0.20:8080,只有在公司内网才能访问。

在家用 SSH 端口转发:

ssh -L 18080:10.0.0.20:8080 user@jump

然后本地打开浏览器访问:

http://127.0.0.1:18080

感觉上就像开了一个:

「只为这个网页服务的小型 VPN」。


8.3 场景 3:多级跳板,连最里层的机器

很多公司网络结构是这样的:

你本机 → 跳板机 A → 内网机器 B → 再连数据库 / Redis

你每次要连数据库,难道还要:

    1. 先 ssh 到 A
    1. 再 ssh 到 B
    1. 再在 B 上操作数据库

这时可以结合端口转发 + SSH config / 图形化工具,把这几个跳统一配置好。

对你来说最后就变成:

  • • 本地开一个端口,比如 13306
  • • 本地客户端连 127.0.0.1:13306
  • • 后面的多级跳,交给配置 & 工具处理

大脑不再需要「脑内模拟拓扑」,全交给工具和端口转发。


8.4 场景 4:调试第三方 WebHook / 回调

典型问题:

  • • 第三方平台只认 公网 URL(比如支付回调、消息回调)
  • • 你本地接口是 http://localhost:3000/callback
  • • 不想为了调试专门搭一套公网环境

思路:

    1. 找一台有公网的服务器,配置一个对外 URL
    1. 服务器上用 远程端口转发 把回调请求打回你本地
    1. 本地服务收到真实请求,直接调试即可

大概流程是:

第三方平台 → 公网服务器 URL → (ssh -R) → 你的本地服务

细节可以配合 Nginx / Caddy / 现有网关一起拼。


九、在 macOS 上怎么确认端口转发生效?

做完转发,最好确认一下端口是不是在监听、通不通。

9.1 看监听端口(lsof)

比如刚才的:

ssh -L 13306:10.0.0.5:3306 dbadmin@jump

可以用:

lsof -iTCP -sTCP:LISTEN -n -P | grep 13306

如果看到类似输出:

ssh     23456 user   5u  TCP 127.0.0.1:13306 (LISTEN)

说明本地 13306 已经在监听。

9.2 简单测一下连通(nc)

再用 nc(netcat)试一下:

nc -vz 127.0.0.1 13306

输出类似:

Connection to 127.0.0.1 port 13306 [tcp/*] succeeded!

说明从你本机到数据库这条「隧道」是通的。


十、踩坑提示:别只会通,还要安全

最后简单提几条容易忽略的点:

  1. 1. 监听地址别乱开
    • • 一般用 127.0.0.1(只在本机可见)就够了
    • • 不要动不动就 0.0.0.0,那是整个世界都能连进来
  2. 2. 端口别乱选
    • • 很多软件会抢常见端口,比如 80、443、3306 之类
    • • 建议给自己预留一小段「习惯端口」:比如 1330615432 这种
    • • 转发失败,多半是端口已经被别的进程占用或者命令写错了
  3. 3. SSH 会话记得关
    • • 开了转发就扔那不管,时间久了连自己都忘了哪条在用
    • • 在公司环境长期挂着,也会增加安全风险
    • • 用完记得 Ctrl + C 关闭,或者专门整理一下常用转发规则
  4. 4. 别拿它绕公司安全策略
    • • 端口转发太容易用来「翻墙」或者访问敏感系统
    • • 很多公司是明确禁止随意搞端口转发的
    • • 建议提前看一眼公司安全 / 合规要求,别给自己挖坑

最后小结

端口转发这个东西,说白了就是:

我能连 A,A 能连 B,那我就让 A 当中介,把我到 A 的这条路,顺便延长到 B。

记住这几件事,就差不多够用了:

  1. 1. -L远端服务映射到本地
  2. 2. -R本地服务映射到远端
  3. 3. -D开一个 SOCKS 代理,当通用通道

剩下的,就是结合你自己的环境:

  • • 多画两张小拓扑
  • • 多敲几次命令
  • • 有条件的话,用下图形化工具(比如 DartShell)把常用的几条配置成一键连接
  • 图片

用着用着,你自然会有感觉:

「诶,这种场景直接转个端口就好了,还用啥花里胡哨的大方案。」😄