VSCode远程端口转发无需手动SSH命令,点击状态栏“Forward a Port…”输入远端端口(如3000)即可自动映射本地同号端口;仅当前窗口有效,依赖远端服务监听127.0.0.1或0.0.0.0;持久化需在~/.ssh/config中配置LocalForward。

VSCode 远程端口转发不需要手动写 SSH 命令,但必须理解它只转发「本地到远程」的流量,且依赖远程服务监听地址是否匹配。
点一下就能转发:VSCode 内置 Forward a Port 功能
连接远程主机后,按 Ctrl+Shift+P(Win/Linux)或 Cmd+Shift+P(Mac),输入 Remote-SSH: Forward a Port…,回车,输入远程服务监听的端口号(如 3000)。VSCode 会自动在本地监听同号端口(localhost:3000),并建立隧道。
这个操作本质是后台执行了类似 ssh -L 3000:localhost:3000 user@host 的命令。它只对当前 Remote 窗口有效,关闭窗口即断开;不重启 VSCode、不重连,就不会自动恢复。
- 右下角状态栏点击
Forwarded Ports可查看、编辑、删除已转发端口 - 悬停在端口条目上能看到完整映射(如
localhost:3000 → localhost:3000) - 若本地
3000已被占用,VSCode 会静默分配下一个可用端口(比如3001),但不会弹窗提醒——得自己去状态栏点开看实际映射 - 转发成功后图标为绿色;红色表示失败,常见原因是远程端口没服务、或服务没监听
localhost/127.0.0.1
持久化配置:改 ~/.ssh/config 而不是 settings.json
想每次连上就自动转发多个端口(比如数据库 5432、API 8080),必须编辑 ~/.ssh/config,在对应 Host 块里加 LocalForward 行:
Host my-server HostName 192.168.1.100 User dev LocalForward 5432 localhost:5432 LocalForward 8080 localhost:8080
注意:LocalForward 必须写在 ~/.ssh/config 里,不能写进 VSCode 的 settings.json;也不能写成 LocalForward=5432:localhost:5432(等号会直接被忽略,无报错)。
- 改完保存,需断开当前 Remote 连接,再重新 Connect 才生效
- VSCode Remote-SSH 扩展会读取该文件,无需额外插件或重启 VSCode 主进程
- 如果同时配了
remote.SSH.port(VSCode 设置中控制 SSH 连接端口),和LocalForward互不影响——前者管“怎么连上服务器”,后者管“连上后转哪些端口”
远程服务连不上?先查监听地址,不是防火墙
转发失败时看到 Connection refused,90% 是因为远程服务根本没在 localhost 或 127.0.0.1 上监听。VSCode 的端口转发只能把请求发给远程的 127.0.0.1:x,它不处理服务绑定逻辑。
在远程服务器上执行:
ss -tlnp | grep :3000
看输出第二列(Local Address:Port)是否包含 127.0.0.1:3000 或 *:3000。如果是 ::1:3000(IPv6 回环),而你的本地环境没启用 IPv6,也会失败。
- create-react-app / Next.js / Vite 默认只监听
localhost,启动时加--host 127.0.0.1或配server.host: '127.0.0.1' - Flask 默认只监听
127.0.0.1,用app.run(host='0.0.0.0')才能被转发识别(注意安全边界) - PostgreSQL 默认监听
127.0.0.1,但需确认pg_hba.conf允许local连接 - 远程防火墙(如 ufw)通常不影响,因为流量走的是 SSH 隧道,不经过 iptables INPUT 链
转发到非 localhost 目标:比如容器或内网机器
默认 LocalForward 3000 localhost:3000 只能访问远程本机服务。如果服务跑在 Docker 容器里,或另一台内网机器上,就得显式指定远程目标地址:
- 容器内服务(假设容器 IP 是
172.17.0.2,端口8080):LocalForward 8080 172.17.0.2:8080 - 跳板机后方的数据库(跳板机 A 连着 DB 机 B):
LocalForward 3307 10.0.1.5:3306(B 的内网 IP) - 要让局域网其他设备也能访问(比如手机调试),需远程 SSH 服务端开启
GatewayPorts yes,再用LocalForward *:8082 localhost:8080
这种写法绕过了 VSCode 图形界面,但更灵活。关键点在于:VSCode 只负责触发和管理隧道,真正的转发行为由 OpenSSH 客户端执行,所以所有 ssh -L 支持的语法都适用。
最易被忽略的一点:VSCode 的端口转发不继承终端里的 HTTP_PROXY 或 NO_PROXY 设置,如果你在远程终端里设置了代理变量,VSCode 的扩展进程(比如 Python 或 Docker 扩展)默认看不到——得单独配置 remote.extensionKind 或改 ~/.bashrc 并重启窗口。


















