利用好 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
那所有浏览器请求的流程变成:
-
- 先发给你本地
1080
- 先发给你本地
-
- 进 SSH 加密隧道
-
- 再由
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
你每次要连数据库,难道还要:
-
- 先 ssh 到 A
-
- 再 ssh 到 B
-
- 再在 B 上操作数据库
这时可以结合端口转发 + SSH config / 图形化工具,把这几个跳统一配置好。
对你来说最后就变成:
- • 本地开一个端口,比如
13306 - • 本地客户端连
127.0.0.1:13306 - • 后面的多级跳,交给配置 & 工具处理
大脑不再需要「脑内模拟拓扑」,全交给工具和端口转发。
8.4 场景 4:调试第三方 WebHook / 回调
典型问题:
- • 第三方平台只认 公网 URL(比如支付回调、消息回调)
- • 你本地接口是
http://localhost:3000/callback - • 不想为了调试专门搭一套公网环境
思路:
-
- 找一台有公网的服务器,配置一个对外 URL
-
- 服务器上用 远程端口转发 把回调请求打回你本地
-
- 本地服务收到真实请求,直接调试即可
大概流程是:
第三方平台 → 公网服务器 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. 监听地址别乱开
-
- • 一般用
127.0.0.1(只在本机可见)就够了 - • 不要动不动就
0.0.0.0,那是整个世界都能连进来
- • 一般用
- 2. 端口别乱选
-
- • 很多软件会抢常见端口,比如 80、443、3306 之类
- • 建议给自己预留一小段「习惯端口」:比如
13306、15432这种 - • 转发失败,多半是端口已经被别的进程占用或者命令写错了
- 3. SSH 会话记得关
-
- • 开了转发就扔那不管,时间久了连自己都忘了哪条在用
- • 在公司环境长期挂着,也会增加安全风险
- • 用完记得
Ctrl + C关闭,或者专门整理一下常用转发规则
- 4. 别拿它绕公司安全策略
-
- • 端口转发太容易用来「翻墙」或者访问敏感系统
- • 很多公司是明确禁止随意搞端口转发的
- • 建议提前看一眼公司安全 / 合规要求,别给自己挖坑
最后小结
端口转发这个东西,说白了就是:
我能连 A,A 能连 B,那我就让 A 当中介,把我到 A 的这条路,顺便延长到 B。
记住这几件事,就差不多够用了:
- 1.
-L:远端服务映射到本地 - 2.
-R:本地服务映射到远端 - 3.
-D:开一个 SOCKS 代理,当通用通道
剩下的,就是结合你自己的环境:
- • 多画两张小拓扑
- • 多敲几次命令
- • 有条件的话,用下图形化工具(比如 DartShell)把常用的几条配置成一键连接
用着用着,你自然会有感觉:
「诶,这种场景直接转个端口就好了,还用啥花里胡哨的大方案。」😄