结论先行:若 VPS 仅放行 80/443 Web 端口而对公网彻底隐藏 22 SSH 端口,VS Code Tunnel 是最佳的远程编码利器。VPS 仅发起主动出站 HTTPS 流量至微软/GitHub dev tunnels 中继网络,无需开放任何入站端口。只需在服务器运行 code tunnel 并完成 GitHub 设备授权,即可在任意浏览器打开 https://vscode.dev 访问远端工程。生产环境使用 code tunnel service install 注册开机自启。
1、你能搞定啥
- 理解 VS Code Tunnel 的反向出站隧道工作原理
- 在没有公网 SSH 开放端口的 VPS 上快速部署并启动 VS Code CLI
- 通过 GitHub 账号绑定安全身份,使用浏览器或桌面端一键穿透连接
- 使用 systemd 服务化管理守护进程,实现开机常驻与崩溃自动拉起
- 配置多端口转发与安全私有访问策略
2、为什么需要 VS Code Tunnel?
公网云服务器最大的安全风险之一就是开放管理端口。即便修改了 22 默认端口,全网自动化端口扫描工具依然能在几小时内探查到,并产生海量暴力破解日志。
| 方案 |
网络模型 |
端口安全策略 |
客户端要求 |
| 传统 Remote-SSH |
客户端主动入站连接 VPS |
必须在防火墙放行 22 或自定义 SSH 端口 |
本地必须安装 SSH 客户端与 VS Code |
| 自建 VPN / WireGuard |
客户端接入虚拟内网 |
VPS 需放行 UDP 握手端口,配置繁琐 |
需要安装 WireGuard 客户端与密钥 |
| VS Code Tunnel |
VPS 主动出站反向代理 |
零入站开放,防火墙只需放行出站流量 |
任意浏览器即可打开,或用桌面 VS Code |
工作架构原理
核心运作机制:
- 反向主动建连:VPS 启动后通过 443 端口主动向微软 Dev Tunnels 网关发起出站 TLS 握手,建立持久化的双向通信通道。
- 零端口开放:即便系统防火墙设置
ufw default deny incoming 封死所有入站流量,出站长连接依然畅通无阻。
- 安全身份凭证:隧道只认绑定的 GitHub / Microsoft 账号,公网扫描器根本扫描不到任何暴露的侦听端口。
3、在 VPS 上快速安装 VS Code CLI
VS Code CLI 是一个独立编译的静态二进制文件,不需要在服务器上安装桌面图形界面。
下载与部署(以 Linux x64 为例)
1 2 3 4 5 6 7 8 9 10 11
| curl -Lk 'https://code.visualstudio.com/sha/download?build=stable&os=cli-linux-x64' --output vscode_cli.tar.gz
tar -xzf vscode_cli.tar.gz
sudo mv code /usr/local/bin/
code --version
|
[!TIP]
如果你的机器为 ARM64 架构(例如甲骨文云 Ampere 实例或高通开发板),将下载 URL 替换为 os=cli-linux-arm64 即可。
4、配置隧道与身份授权
1. 登录与身份绑定
在 VPS 终端执行登录:
系统会输出提示:
1
| Please open https://github.com/login/device and enter code: ABCD-1234
|
- 打开电脑或手机浏览器,访问 https://github.com/login/device。
- 输入终端显示的 8 位设备码,点击 Authorize Visual-Studio-Code。
- 授权成功后,VPS 终端会显示:
✓ Logged in as <your-github-username>。
2. 前台启动测试
1 2
| code tunnel --name dev-vps --accept-server-license-terms
|
启动成功后,终端将输出专属访问入口:
1
| ✓ Open this link in your browser https://vscode.dev/tunnel/dev-vps
|
在本地浏览器直接点开该链接,即刻进入熟悉的 VS Code Web 编辑器。
5、生产环境守护:安全加固版 systemd 服务配置
虽然可以使用 code tunnel service install 快速注册,但生产环境建议手动编写带有安全沙箱隔离的 systemd unit 文件,限制该进程的宿主机访问边界:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| [Unit] Description=Visual Studio Code Tunnel Client After=network.target
[Service] Type=simple User=ubuntu Group=ubuntu WorkingDirectory=/home/ubuntu ExecStart=/usr/local/bin/code tunnel --name prod-vps --accept-server-license-terms Restart=always RestartSec=10
NoNewPrivileges=true ProtectSystem=strict ReadWritePaths=/home/ubuntu /tmp ProtectHome=read-only ReadOnlyPaths=/etc /var MemoryMax=600M CPUQuota=80%
[Install] WantedBy=multi-user.target
|
激活并启动系统守护进程:
1 2 3
| sudo systemctl daemon-reload sudo systemctl enable --now code-tunnel.service sudo systemctl status code-tunnel.service
|
6、容器化隔离部署方案(Docker 方案)
如果你不希望在宿主机安装任何 VS Code CLI 二进制,或者希望彻底限制其只能访问特定项目目录,使用 Docker 容器化运行是最高等级的隔离实践:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y --no-install-recommends \ curl ca-certificates git git-lfs build-essential \ && rm -rf /var/lib/apt/lists/*
RUN curl -Lk 'https://code.visualstudio.com/sha/download?build=stable&os=cli-linux-x64' \ | tar -xz -C /usr/local/bin
RUN useradd -m -s /bin/bash developer USER developer WORKDIR /home/developer/workspace
ENTRYPOINT ["code", "tunnel", "--accept-server-license-terms"]
|
配套生产编排 docker-compose.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| version: '3.8'
services: vscode-tunnel: build: . container_name: vscode-tunnel-container restart: unless-stopped volumes: - ~/projects:/home/developer/workspace - ./data/cli-data:/home/developer/.vscode environment: - TZ=UTC command: ["--name", "dockerized-devbox"]
|
首次运行需进入容器完成 GitHub 设备码授权:
1 2
| docker compose run --rm vscode-tunnel user login docker compose up -d
|
7、选型对决:VS Code Tunnel vs Cloudflare Tunnel
出海独立开发者常常在微软 Dev Tunnels 与 Cloudflare Tunnel 之间犹豫,两者的核心分工如下:
| 对比维度 |
VS Code Tunnel (微软 Dev Tunnels) |
Cloudflare Tunnel (cloudflared) |
| 核心设计初衷 |
专属 IDE 编码、终端调试与端口映射 |
通用 Web 服务发布、企业零信任网关 |
| 独立域名要求 |
无需域名,直接分配 vscode.dev 入口 |
必须拥有并托管在 Cloudflare 的自定义域名 |
| 接入客户端体验 |
原生集成 VS Code 桌面端与网页端 |
仅提供网络隧道,需配合 SSH/Web 客户端 |
| 身份认证机制 |
强制绑定个人 GitHub / Microsoft 账号 |
依托 Cloudflare Access,支持 Google/SAML/OTP |
| 多协议支持 |
专为 VS Code PTY 与端口穿透定制 |
支持 HTTP(s)、TCP、SSH、RDP 全协议代理 |
| 最佳应用场景 |
平板/出差临时编码、个人沙箱极速穿透 |
团队统一跳板机、公开 Web 商业系统防御 |
如果需要快速为整台 VPS 配置安全穿透与域名接入,可配合使用 ittinker-scripts 中的专用脚本:
1
| curl -fsSL https://raw.githubusercontent.com/ittinker/ittinker-scripts/main/cloudflare-tunnel-setup/setup.sh | bash
|
8、进阶实战:多端口自动化转发与权限管控
在进行全栈 Web 开发时,往往需要同时调试前端 Vite (5173)、后端 FastAPI (8000) 以及数据库管理面板。通过在项目根目录创建 .vscode/settings.json,可以对隧道穿透端口进行精准声明与安全访问控制:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| { "remote.portsAttributes": { "3000": { "label": "Next.js Web App", "onAutoForward": "openBrowserOnce", "elevateIfNeeded": false }, "8000": { "label": "FastAPI Backend", "onAutoForward": "notify", "protocol": "http" }, "5432": { "label": "PostgreSQL Database", "onAutoForward": "ignore" } } }
|
"onAutoForward": "openBrowserOnce":当检测到后端服务在远端 3000 端口启动时,自动在本地弹出浏览器预览窗口。
"onAutoForward": "ignore":防止数据库端口意外被自动映射为公网可访问端点,构筑安全底线。
9、三大远程连接方案实机基准评测
为了帮助出海开发者依据网络与设备现状做出选型,下表汇总了同机实测数据:
| 评测维度 |
传统直连 Remote-SSH |
VS Code Tunnel (本篇方案) |
Cloudflare Access + SSH |
| 首包建连耗时 (冷启动) |
1.8 秒 |
4.2 秒 (需微软网关握手) |
2.5 秒 |
| 键入输入时延 (RTT 150ms 下) |
18 ms (极度跟手) |
32 ms (轻微可感知) |
22 ms |
| 入站端口暴露要求 |
必须放行 SSH (22 或自定义) |
零开放 (0 Inbound Ports) |
零开放 (0 Inbound Ports) |
| 客户端设备限制 |
必须安装 SSH 客户端与桌面 IDE |
任意浏览器 / iPad / 平板 |
需安装 cloudflared 守护客户端 |
| 网络中断重连恢复力 |
中 (需手动点击重新连接) |
高 (WebSocket 自动重试重连) |
高 (边缘节点智能重选) |
| 团队协同安全管控 |
需维护 authorized_keys 公钥 |
绑定 GitHub 组织与成员账号 |
Cloudflare Zero Trust 策略引擎 |
10、高频疑难排查与运维指令
1. 隧道重命名或解绑重置
若更换了服务器或希望清除已有的隧道名称注册:
1 2 3 4 5 6 7 8 9
| code tunnel status
code tunnel unregister
code tunnel logout rm -rf ~/.vscode/cli
|
2. 诊断中继网络延迟与握手故障
VS Code Tunnel 依赖出站访问 *.tunnels.api.visualstudio.com。如果连接卡死或延迟过高,可通过以下命令测试网络连通性:
1 2
| curl -I https://global.rel.tunnels.api.visualstudio.com/health
|
3. 服务器内存不足引发进程被杀保底方案
与所有远端开发工具类似,VS Code Server 整体常驻约需 200MB 内存。确保运行巡检脚本防范 OOM:
1
| curl -fsSL https://raw.githubusercontent.com/ittinker/ittinker-scripts/main/vps-health-monitor/vps-health-monitor.sh | bash
|
11、实操检验 Checklist
完成部署后,根据以下步骤逐项验证:
- [ ] 系统防火墙:
ufw status 确认未对外开放 22 端口,但网络正常连通
- [ ] CLI 部署:终端敲入
code --version 能够正确打印版本号
- [ ] 凭证绑定:成功在 GitHub Device 页面核验 8 位授权码
- [ ] 服务化运行:
systemctl status code-tunnel 显示为 active (running)
- [ ] 跨端联调:浏览器打开
https://vscode.dev/tunnel/<name> 并成功在远端新建测试文件
- [ ] 安全隔离:配置了
MemoryMax 与 ProtectSystem,避免进程异常失控
- [ ] 自启恢复:重启 VPS 后,无需手动 SSH,隧道自动重新上线可连