---
title: "远程 Linux 上安全运行 Claude Code"
description: "在美区 Ubuntu 上用 Cloudflare Tunnel 做 HTTPS 门户，安全远程使用 Claude Desktop。"
canonical: https://yonnia.com/blog/linux-claude-code-secure-desktop
language: zh
date: 2026-09-13
updated: 2026-09-13
tags: ["Linux","Claude","安全","远程桌面"]
reading_minutes: 9
words: 2605
---
# 远程 Linux 上安全运行 Claude Code

> 基于一次真实落地实践整理（DigitalOcean 美国机 + 浏览器远程桌面 + Claude Desktop）。  
> 目标：在自己可控的美区 Linux 上，用浏览器安全地使用 Claude Desktop / Claude Code，并具备中文输入、文件上传、声音与 HTTPS 门户。  
> 文档日期：2026-09-13 · 适用系统：Ubuntu 24.04 LTS

---

## 0. 你最终会得到什么

| 能力 | 说明 |
|------|------|
| 美区 VPS | DigitalOcean Droplet，长期可续费 |
| 图形桌面 | TigerVNC + XFCE（Claude Desktop 稳定）/ Plasma（可选） |
| 浏览器入口 | `https://wi.ci` 密码门户（Cloudflare Tunnel，无需裸开 3389/5901） |
| 两种远程方式 | **noVNC**（VNC 桌面）· **Guacamole + 声音**（xrdp/RDP） |
| Claude | Claude Desktop（Linux）可登录使用；可在桌面里继续用 CLI / 工程 |
| 中文输入 | Fcitx5 拼音，`Ctrl+Space` 切换 |
| 文件互传 | 门户「文件管理」拖拽上传到桌面 Inbox |
| 安全基线 | 非 root 日常用户、密钥登录、UFW、密钥不进文档 |

---

## 1. 为什么要这样做

- Claude Desktop / 部分能力对网络区域敏感；美国 VPS + 本地浏览器远控，比「本机直连不稳」更可控。
- **不要把 VNC/RDP 端口暴露到公网**。用 Cloudflare Tunnel（或 SSH 隧道）把桌面收在 HTTPS 后面。
- 日常用低权限用户 `desk`，root 只做装包与系统配置。
- 密码、Token 放在服务器本地 secrets 文件或本机密码管理器，**永远不要写进教程仓库或聊天记录的可转发副本**。

---

## 2. 购买与初始化 DigitalOcean

### 2.1 选型建议

- 规格：**2 vCPU / 4 GB RAM**（Claude Desktop + 浏览器偏吃内存；再小容易卡死）
- 系统：**Ubuntu 24.04 LTS x64**
- 区域：美国（如 NYC3）
- 预算：约 **$24/月** 量级（随官方调价变化）
- 计费：可用账户邮箱注册；支付按你的账户方式（卡 / Alipay 等）

### 2.2 创建 Droplet

1. 注册/登录 DigitalOcean。  
2. Create → Droplets → 选区域、Ubuntu 24.04、2C/4G。  
3. 认证方式优先 **SSH Key**；若暂时用密码，创建后立刻改为密钥并禁用密码登录。  
4. 主机名示例：`claude-code-us`。  
5. 创建后记录：**公网 IP**、root 初始密码（若有）——只保存在本机加密位置。

### 2.3 本机第一次登录

```bash
ssh root@YOUR_DROPLET_IP
```

建议立刻：

```bash
apt update && apt -y upgrade
timedatectl set-timezone Asia/Shanghai   # 或保留 UTC，按你习惯
adduser desk
usermod -aG sudo desk
## 为 desk 配置与你一致的登录密码（可与 VNC 密码统一，便于钥匙串解锁）
```

### 2.4 SSH 加固（强烈建议）

在本机生成密钥（若还没有），把公钥写入服务器：

```bash
## 本机
ssh-copy-id -i ~/.ssh/id_ed25519.pub desk@YOUR_DROPLET_IP
```

服务器 `/etc/ssh/sshd_config` 建议：

```
PermitRootLogin prohibit-password
PasswordAuthentication no
PubkeyAuthentication yes
```

然后：

```bash
systemctl reload ssh
```

UFW 基线（先放行 SSH，再启用）：

```bash
ufw allow OpenSSH
ufw enable
## 后面若用 Cloudflare Tunnel，通常不必对公网开放 5901/3389/8080
```

---

## 3. 安装图形桌面与 TigerVNC

### 3.1 桌面环境

实践结论：

- **XFCE**：轻、稳，**Claude Desktop 窗口正常**（推荐作为 noVNC 默认）。  
- **KDE Plasma 5**：观感更好，但 Electron（Claude Desktop）在 VNC/Plasma 下曾出现 **InputOnly / 看不见窗口**；可保留作备选，不要当作 Claude 主力桌面。

安装示例（可同时装，便于切换）：

```bash
apt install -y xfce4 xfce4-goodies
## 可选：
apt install -y kde-plasma-desktop
```

### 3.2 TigerVNC（仅本机回环）

```bash
apt install -y tigervnc-standalone-server tigervnc-common
sudo -u desk vncpasswd          # 设置 VNC 密码
```

`~desk/.vnc/xstartup` 要点：

- `unset DBUS_SESSION_BUS_ADDRESS` 后 `dbus-launch`
- 导出输入法环境（见第 8 节）
- `exec startxfce4`（或 Plasma 的 `startplasma-x11`）

启动（示例显示号 `:1` → 端口 `5901`）：

```bash
sudo -u desk vncserver :1 -geometry 1920x1080 -depth 24
```

**安全**：VNC 监听 `localhost` only，公网只走 Tunnel / SSH 转发。

```bash
ssh -L 5901:127.0.0.1:5901 desk@YOUR_DROPLET_IP
## 再用本地 VNC 客户端连 127.0.0.1:5901
```

### 3.3 防休眠 / 防锁屏（远程机必备）

否则浏览器里会突然「锁屏 / 黑屏」：

- `systemd`：mask `sleep.target suspend.target hibernate.target`
- Plasma：`~/.config/kscreenlockerrc` 关闭 Autolock  
- `xset s off -dpms` 写入会话启动脚本  

---

## 4. 安装 Claude Desktop（Linux）

1. 按 Anthropic 官方 Linux 安装方式安装 Claude Desktop（apt 包或官方文档当前方式）。  
2. 用 `desk` 用户在图形桌面启动，完成登录。  
3. 桌面可放快捷方式 `start-claude-desktop.sh`（强制 `DISPLAY=:1`）。  

注意事项：

- **4GB 内存很紧**：少开 Chrome 标签；不要同时挂很多 Electron 应用。  
- 若在 Plasma 下窗口「启动了但看不见」：切回 XFCE 再开 Claude。  
- KDE Wallet 弹窗可禁用（`kwalletrc` → `Enabled=false`）；Claude 可能回退到 plaintext 会话存储，属权衡。  
- GNOME Keyring / 登录密码与 desk 密码一致时，钥匙串更少打断。

Claude Code CLI（可选，与 Desktop 互补）：

```bash
## 按官方当前文档安装 Node / claude CLI
## 在桌面终端里用，而不是把 API Key 写进世界可读文件
```

---

## 5. Web 远程桌面门户（noVNC + 上传）

### 5.1 组件

- **websockify**：把 `5901` 变成 WebSocket  
- **noVNC**：浏览器里的 VNC  
- **Flask 小门户**：登录、分辨率、语言、文件上传、模式切换  
- **nginx**：反代本机端口  
- **cloudflared**：Cloudflare Tunnel → 本机 nginx  

典型本机端口（仅 127.0.0.1）：

| 服务 | 端口 |
|------|------|
| 门户 Flask | 8081 |
| nginx（Tunnel 目标） | 8080 |
| VNC | 5901 |
| Guacamole Tomcat | 8085 |
| guacd | 4822 |
| xrdp | 3389（仅 localhost） |

### 5.2 文件上传（Inbox）

- 服务器目录示例：`/home/desk/Desktop/Inbox`  
- 门户提供拖拽上传；UI 可做成右侧浮动「文件管理」。

### 5.3 Cloudflare Tunnel + 域名

1. 域名（示例 `wi.ci`）接入 Cloudflare DNS。  
2. 安装 `cloudflared`，创建 Tunnel，Ingress：

```yaml
ingress:
  - hostname: wi.ci
```
service: http://127.0.0.1:8080
```
  - service: http_status:404
```

3. 门户自身再加一层密码（与 VNC 密码分开更好）。  
4. 验证：`https://wi.ci` → 登录 → noVNC 出桌面。

---

## 6. Guacamole + xrdp（带声音的浏览器远程）

### 6.1 为什么还要 Guacamole

- noVNC 声音链路较弱或需额外 WebSocket 音频。  
- Guacamole 走 **RDP（xrdp）**，配合 PipeWire/`xrdp-sink` 可做浏览器内声音。  

注意：Guacamole/RDP 是 **另一路桌面会话**（例如显示 `:10`），不是同一块 noVNC 屏幕。

### 6.2 安装要点

1. 安装 `xrdp` / `xorgxrdp`，`desk` 用户可登录。  
2. Docker Compose 部署 Guacamole + guacd + PostgreSQL。  
3. nginx 反代 `/guacamole/`，并配置 WebSocket Upgrade。  
4. **UFW 允许 Docker 网桥访问宿主机 guacd:4822**（否则会一直 Waiting / Bad gateway）：

```bash
ufw allow from 172.16.0.0/12 to any port 4822
```

5. RDP 音频：编译/安装 `pulseaudio-module-xrdp` 或 PipeWire 的 xrdp 模块；会话里 `PULSE_SINK=xrdp-sink`。  
6. Guacamole 连接参数示例：`127.0.0.1:3389`，用户 `desk`，`enable-audio=true`，`server-layout=en-us-qwerty`。  

### 6.3 门户里的连接方式

- 下拉框：**Guacamole+声音** / **noVNC**  
- Guacamole iframe 需 `tabindex` + 点击聚焦，否则浏览器键盘事件会被门户抢走。  
- 英文输入正常后，再启用中文输入法（见下节）。

### 6.4 已移除的方案

- **RustDesk**：可卸以免多开端口与维护成本（按你的威胁模型决定）。  
- 独立「RDP 客户端」入口可与 Guacamole 合并，减少用户选择负担。

---

## 7. 分辨率、语言与门户体验

- 分辨率下拉：调用 `xrandr` / 脚本改 VNC 几何。  
- 语言：门户 UI 中英切换（zh/en）。  
- 全屏、新标签打开、退出登录。  
- Favicon、紧凑顶栏，给桌面更多垂直空间。  

---

## 8. 中文输入法（Fcitx5 拼音）

### 8.1 安装

```bash
apt install -y fcitx5 fcitx5-chinese-addons fcitx5-frontend-gtk3 \
  fcitx5-frontend-gtk4 fcitx5-frontend-qt5 fonts-noto-cjk fonts-noto-cjk-extra
```

### 8.2 配置原则

- 默认 **英文键盘**，`ActiveByDefault=False`。  
- 切换：**Ctrl + Space** → 拼音；再按回英文。  
- 环境变量（写入 `~/.xsession`、VNC `xstartup`、`~/.profile`）：

```bash
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
```

- 会话启动时：`fcitx5 -d --replace`  

### 8.3 与 Guacamole 的关系

- 曾出现「输入法进程吞掉所有按键」→ 英文也没反应。  
- 修复顺序：先保证 **Ctrl+Space 关闭拼音时英文畅通**，再教用户切中文。  
- 若英文再次失灵：先 `Ctrl+Space` 切回英文，或重连 Guacamole。

---

## 9. 安全运行清单（请当作强制项）

1. **公网不开放** 5901 / 3389 / 8080 / 4822；只开 22（或改端口）+ Cloudflare。  
2. SSH **密钥登录**，关闭密码登录；root 禁止密码。  
3. 门户密码 ≠ 随意弱口令；可与 VNC 分离。  
4. Secrets 路径示例（权限 `600`，仅 root/desk 可读）：  
   - `/root/secrets/desk-portal-password.txt`  
   - `/root/secrets/desk-rdp-password.txt`  
   - `/root/secrets/guacamole-admin.txt`  
5. 定期 `apt upgrade`；关注 Claude Desktop 与内核更新。  
6. 快照：DigitalOcean Snapshot 在大改前拍一张。  
7. 不要把 Cookie、API Key、桌面录像发到公开地方。  
8. 内存告警：`free -h`；OOM 时优先关浏览器标签 / 重启桌面会话。  

---

## 10. 日常使用方式

1. 打开 `https://你的域名` → 输入门户密码。  
2. 选连接方式：  
   - **noVNC**：日常桌面、Claude Desktop（XFCE）  
   - **Guacamole+声音**：需要系统声时  
3. 点桌面区域一下，确保键盘焦点在远端。  
4. 中文：`Ctrl+Space`。  
5. 传文件：门户「文件管理」→ 拖到 Inbox。  
6. 退出：门户「退出登录」；不要依赖「关浏览器标签 = 锁屏安全」。  

续费提醒：可为 Droplet 与 Claude 会员分别设日历/助理提醒（例：每月固定日）。

---

## 11. 故障排查速查

| 现象 | 常见原因 | 处理 |
|------|----------|------|
| 门户 502 | cloudflared / 源站挂了 | `systemctl restart cloudflared nginx desk-portal` |
| Guacamole Waiting / Bad gateway | UFW 拦 Docker→4822 | 放行 `172.16.0.0/12` → 4822 |
| Guacamole 黑屏 | Plasma 合成器 / 会话挂了 | `KWIN_COMPOSE=N`；重连；或改用 noVNC |
| 键盘完全没反应 | iframe 没焦点 / 输入法吞键 | 点击桌面；Ctrl+Space；查 fcitx |
| Claude 启动了看不见 | Plasma + Electron | 改用 XFCE；清 Singleton 锁后重启 |
| 突然锁屏 | Plasma 自动锁 / 休眠 | 关 Autolock；mask sleep targets |
| 声音没有 | 未走 xrdp-sink / 未开音频 | Guacamole 模式 + PipeWire xrdp 模块 |
| 很卡 / 被杀进程 | 4G 内存打满 | 少开标签；重启 VNC 会话 |

---

## 12. 桌面环境切换（备忘）

服务器上可保留切换脚本（示例路径）：

- `/home/desk/bin/use-xfce` — noVNC 用 XFCE（Claude 推荐）  
- `/home/desk/bin/use-plasma` — 切回 Plasma（需自测 Claude）  

改 `~/.vnc/xstartup` 后执行：

```bash
sudo -u desk vncserver -kill :1
sudo -u desk vncserver :1 -geometry 1920x1080 -depth 24
```

xrdp/Guacamole 会话改的是 `~/.xsession`，重连 Guacamole 后生效。

---

## 13. 推荐目录与服务名（落地参考）

```
/opt/desk-portal/app.py          # 门户
/opt/guacamole/                  # Guacamole 栈
/home/desk/.vnc/                 # VNC 配置
/home/desk/.xsession             # xrdp 会话
/home/desk/Desktop/Inbox         # 上传目录
/root/secrets/                   # 密码与令牌（勿提交 Git）
```

常见 systemd 单元：

- `desk-portal.service`  
- `desk-websockify.service`  
- `desk-audio.service`（若启用 noVNC 音频）  
- `cloudflared.service`  
- `xrdp` / `xrdp-sesman`  

---

## 14. 从零到可用的最短路径（清单）

1. 买 DO 美区 2C/4G Ubuntu 24.04  
2. SSH 密钥 + UFW + 用户 `desk`  
3. 装 XFCE + TigerVNC（localhost）  
4. 装 Claude Desktop，桌面登录成功  
5. 门户 + noVNC + 上传  
6. Cloudflare Tunnel 绑定域名 HTTPS  
7.（可选）Guacamole + xrdp + 音频 + UFW 放行 Docker→guacd  
8. 关休眠/自动锁屏  
9. 装 Fcitx5 拼音，Ctrl+Space  
10. 拍 Snapshot，写好续费提醒  

---

## 15. 免责声明

- 云厂商 TOS、Claude/Anthropic 服务条款以官方为准；区域与合规自行负责。  
- 本教程描述的是 **自有 VPS 上的系统管理与远程桌面**，不教绕过任何服务的安全或计费策略。  
- 文档中的域名、IP、路径来自一次实践，迁移时请替换为你的实际值。  

---

## 附录 A. 本次实践环境快照（可删）

| 项 | 值 |
|----|----|
| 云主机名 | claude-code-us |
| 系统 | Ubuntu 24.04 |
| 规格 | 2C / 4GB / NYC |
| 门户域名示例 | wi.ci |
| noVNC 桌面 | XFCE（Claude 稳定） |
| Guacamole | Plasma + xrdp（声音） |
| 输入法 | Fcitx5 拼音 |

---

*文档结束。建议下载后与你的私密笔记（密码、Tunnel ID、账单邮箱）分开放。*
