第一章:引言

1.1 远程访问的需求场景

在当今数字化时代,远程访问已成为个人和企业不可或缺的技术能力。以下是典型的远程访问需求场景:

VPS 云端部署:许多用户选择在云服务器(如 AWS、DigitalOcean、阿里云等)上部署服务,以获得 7×24 小时的在线能力。这种场景下,用户需要从任意地点安全地管理和访问云端资源。

家庭实验室(HomeLab):技术爱好者常在家庭网络中搭建 NAS、智能家居中枢、媒体服务器等设备。远程访问使得用户在外出时仍能监控和管理家庭网络中的设备。

移动办公与多设备协同:现代工作方式要求在不同设备间无缝切换——从办公室的台式机到家中的笔记本,再到移动端的手机和平板。统一的远程访问方案可以确保工作环境的一致性。

开发与测试环境:开发者需要在隔离环境中运行代码、测试应用,同时能够从主设备远程调试和控制这些环境。

1.2 OpenClaw 架构概述

OpenClaw 是一款本地优先的个人 AI 助手框架,其架构设计围绕三个核心组件展开:

Gateway(网关):作为 OpenClaw 的控制平面,Gateway 是 WebSocket 服务端,负责协调会话、通道、工具和事件。它默认监听 ws://127.0.0.1:18789,是整个系统的神经中枢。

安全背景说明:Gateway 的默认配置体现了"默认安全"的设计理念:

  • 绑定到 localhost (127.0.0.1):防止意外暴露到网络,避免未授权访问
  • 端口 18789:避开常见服务端口,减少扫描和攻击面
  • HTTP 协议:默认不启用 TLS,鼓励用户通过反向代理或 VPN 隧道获得 TLS 加密

这种设计确保了 OpenClaw 在开箱即用时的安全性,用户可以根据需要逐步放宽访问限制。Gateway 支持多通道接入(WhatsApp、Telegram、Slack、Discord 等 20+ 平台),并提供统一的 API 接口。

Node(节点):Node 是执行设备本地操作的客户端组件,支持 macOS、iOS 和 Android 平台。Node 通过 Gateway 协议进行设备配对,可执行相机拍摄、屏幕录制、系统通知、位置获取等操作。Node 与 Gateway 分离的设计使得远程部署成为可能。

Session(会话):Session 是 OpenClaw 的执行上下文单元。每个会话包含独立的工具权限、模型配置和对话历史。会话分为 main(主会话,通常用于直接对话)和群组隔离会话,支持不同的沙箱策略和激活模式。

1.3 远程访问方案对比

方案 适用场景 优点 缺点 安全等级
Tailscale Serve 同 Tailnet 网络内的设备访问 零配置、端到端加密、无需公网 IP 仅限 Tailscale 网络成员访问 ⭐⭐⭐⭐⭐
Tailscale Funnel 需要从公网访问 Gateway 自动 HTTPS、内置 DDoS 防护、域名稳定 暴露于公网,需强密码保护 ⭐⭐⭐⭐
SSH 隧道 已有 SSH 访问通道的环境 无需额外工具、与现有 SSH 密钥体系集成 需手动维护隧道、配置相对复杂 ⭐⭐⭐⭐
方案选择建议
  • 家庭/办公室内网:使用 Tailscale Serve,所有设备加入同一 Tailnet 即可安全访问
  • VPS/云服务器:优先选择 Tailscale Funnel,如需更高控制度可选择 SSH 隧道
  • 高安全要求环境:Tailscale Serve + 设备配对认证,配合防火墙白名单

OpenClaw 的远程访问架构遵循"Gateway 在哪里运行,执行就在哪里发生"的原则——exec 工具在 Gateway 所在主机执行,而 device 动作(如相机、通知)则在配对的 Node 设备上执行。这种分离设计既保证了远程管理的便利性,又保留了设备本地功能的完整性。

1.4 系统要求与环境依赖

1.4.1 目标读者

本文档适合以下读者:

  • 个人用户:希望在家庭网络中远程访问 OpenClaw
  • 运维工程师:需要在生产环境部署安全的远程访问方案
  • 开发者:需要理解和调试 OpenClaw 的网络通信

前置知识要求:

  • 基本的 Linux 命令行操作
  • 网络基础概念(IP、端口、DNS)
  • 了解 SSH 和 TLS 的基本概念

1.4.2 系统要求

组件 最低要求 推荐配置
操作系统 Ubuntu 20.04 / Debian 11 Ubuntu 22.04 LTS
内存 512MB 1GB+
存储 100MB 500MB+
Node.js v18+ v20+ LTS
网络 稳定互联网连接 公网 IP 或 Tailscale

1.4.3 软件依赖

  • OpenClaw:最新稳定版本
  • Node.js:v18+(推荐 v20+ LTS)
  • Git:用于克隆仓库和版本控制
  • curl/wget:用于下载安装包
  • systemd(Linux):用于服务管理
  • Nginx(可选):用于反向代理和 TLS 终止
  • Certbot(可选):用于 Let's Encrypt 证书申请

1.5 文档结构导航

本文档按技术复杂度递进组织:

  1. 第一章 引言:背景知识和方案概述
  2. 第二章 Tailscale:最简单的零配置方案
  3. 第三章 SSH 隧道:灵活的传统方案
  4. 第四章 TLS/WebSocket:现代化的生产级方案
  5. 第五章 安全实践:通用的安全加固指南
推荐阅读路径:
  • 新手用户:按顺序阅读 1 → 2 → 5
  • 有经验用户:直接跳转到所需方案章节
  • 生产部署:重点阅读 4 和 5

1.6 快速入门指南

第一步:环境准备

# 检查 Node.js 版本
node --version  # 需要 v18+

# 安装 OpenClaw(如果尚未安装)
npm install -g @openclaw/core

第二步:选择方案

根据您的使用场景选择合适的远程访问方案:

  • 家庭网络:选择 Tailscale Serve(最简单)
  • 公网访问:选择 Tailscale Funnel 或 TLS/WebSocket
  • 已有 SSH:选择 SSH 隧道

第三步:按章节操作

按照选定方案的章节步骤进行配置,每章都包含:

  • 前提条件检查
  • 详细配置步骤
  • 验证方法
  • 故障排除指南

第四步:安全加固

完成基本配置后,务必阅读第五章的安全最佳实践,进行必要的安全加固。


第二章:Tailscale 方案详解

概述

Tailscale 是一个基于 WireGuard 的零配置 VPN 解决方案,为 OpenClaw 远程访问提供了简单而强大的网络互联能力。相比传统 VPN,Tailscale 通过去中心化的协调服务器建立点对点连接,实现了无需复杂配置的私有网络。

Tailscale 原理与优势

工作原理

Tailscale 的核心架构基于以下几个组件:

  1. Coordination Server(协调服务器):负责节点发现、身份验证和 NAT 穿透协调
  2. DERP(Designated Encrypted Relay for Packets)服务器:在中继模式下转发流量
  3. WireGuard 协议:提供高性能的加密通信通道

当两台设备建立连接时,Tailscale 会:

  • 通过协调服务器交换公钥和网络信息
  • 尝试建立直接的 WireGuard 连接
  • 如直连失败,自动切换到 DERP 中继

核心优势

  • 零配置部署:安装后自动加入私有网络
  • NAT 穿透:自动处理复杂的网络环境
  • 访问控制:细粒度的 ACL 策略管理
  • 多平台支持:支持 Linux、Windows、macOS、iOS、Android
  • 企业级安全:端到端加密,最小权限原则

Tailscale Serve 配置

Tailscale Serve 允许将本地服务安全地暴露给 Tailscale 网络内的其他节点。

基本配置

# 启动 HTTP 服务,将本地 8080 端口映射到 tailscale 域名
tailscale serve https / http://localhost:8080

# 查看当前 serve 配置
tailscale serve status

# 停止特定路径的服务
tailscale serve https / off

完整配置示例

假设我们有一个 OpenClaw Web 界面运行在本地 3000 端口:

# 1. 安装 Tailscale(Ubuntu/Debian)
curl -fsSL https://tailscale.com/install.sh | sh

# 2. 登录并加入网络
sudo tailscale up --advertise-routes=10.0.0.0/24

# 3. 启动本地服务(示例:简单的 HTTP 服务)
python3 -m http.server 3000 &

# 4. 配置 serve
sudo tailscale serve https / http://localhost:3000

# 5. 获取访问地址
TAILSCALE_IP=$(tailscale ip -4)
echo "服务可通过 https://${TAILSCALE_IP}.ts.net 访问"

配置文件自定义

创建 /etc/tailscale/tailscaled.conf

{
  "AuthKey": "tskey-auth-xxxxxxxxxxxxxxxxxxxxxx",
  "Ephemeral": false,
  "ExitNodeAllowLANAccess": false,
  "Hostname": "openclaw-server",
  "AcceptDNS": false,
  "EnableFunnel": true
}

Tailscale Funnel 公网暴露

Funnel 功能允许将本地服务安全地暴露到公网,无需复杂的端口映射。

启用 Funnel

# 启用 Funnel(需要管理员权限)
tailscale funnel on

# 配置 HTTPS 服务
tailscale serve https / http://localhost:3000

# 查看 Funnel 状态
tailscale serve status

注意:OpenClaw Gateway 也提供了内置的 Tailscale 支持,可以通过 --tailscale funnel 参数直接启用 Funnel 功能,无需手动执行 tailscale 命令。例如:

openclaw gateway run --tailscale funnel

这是 OpenClaw 内置的功能,通过调用 Tailscale API 实现,简化了配置流程。

实战示例

#!/bin/bash
# OpenClaw 公网访问配置脚本

echo "配置 Tailscale Funnel 公网访问..."

# 检查 Tailscale 状态
if ! tailscale status >/dev/null 2>&1; then
    echo "错误:Tailscale 未运行或离线"
    exit 1
fi

# 启动 OpenClaw 服务
sudo systemctl start openclaw
sleep 3

# 配置 Funnel
tailscale serve funnel http://localhost:8080

echo "Funnel 已启用,可通过以下地址访问:"
echo "https://$(tailscale status --json | jq -r '.Self.DNSName')"

安全配置与访问控制

ACL 策略配置

创建 tailscale-acl.json

{
  "Groups": {
    "group:admins": ["admin@company.com"],
    "group:developers": ["dev1@company.com", "dev2@company.com"]
  },
  "Hosts": {
    "openclaw-server": "100.64.0.1",
    "database": "100.64.0.2"
  },
  "ACLs": [
    {
      "Action": "accept",
      "Users": ["group:admins"],
      "Ports": ["*:*"]
    },
    {
      "Action": "accept", 
      "Users": ["group:developers"],
      "Ports": ["openclaw-server:443", "openclaw-server:22"]
    }
  ],
  "TagOwners": {
    "tag:server": ["group:admins"]
  }
}

应用 ACL:

tailscale acl set tailscale-acl.json

设备标签管理

# 为设备添加标签
tailscale set --advertise-tags=tag:server

# 查看设备标签
tailscale status --peers

实战配置示例

场景:远程管理 OpenClaw 集群

#!/bin/bash
# OpenClaw 远程管理配置

echo "=== OpenClaw Tailscale 配置 ==="

# 1. 安装配置
sudo apt update && sudo apt install -y tailscale
echo "TS_AUTHKEY=tskey-auth-xxxxx-your-key-here" | sudo tee /etc/default/tailscaled
sudo systemctl enable --now tailscaled

# 2. 加入网络(非交互模式)
sudo tailscale up --authkey=${TS_AUTHKEY} --hostname=openclaw-node-$(hostname)

# 3. 配置子网路由(如需要)
sudo tailscale up --advertise-routes=192.168.1.0/24

# 4. 启用 SSH 访问
sudo tailscale serve ssh

# 5. 验证连接
echo "节点 IP: $(tailscale ip -4)"
echo "DNS 名称: $(tailscale status --json | jq -r '.Self.DNSName')"

echo "配置完成!其他节点可通过以下方式访问:"
echo "SSH: ssh $(whoami)@$(tailscale ip -4)"
echo "Web: https://$(tailscale ip -4).ts.net"

故障排除

# 检查连接状态
tailscale status

# 查看详细日志
sudo journalctl -u tailscaled -f

# 测试网络连通性
tailscale ping <目标节点IP>

# 检查 NAT 类型
tailscale netcheck

总结

Tailscale 为 OpenClaw 提供了简单而强大的远程访问解决方案。通过 WireGuard 的高性能加密、智能的 NAT 穿透和灵活的访问控制,可以轻松建立安全的私有网络。Funnel 功能进一步扩展了公网访问能力,使得远程管理和服务暴露变得极其简单。

关键要点:

  • 零配置部署,自动建立私有网络
  • 企业级安全,端到端加密
  • 灵活的访问控制策略
  • 支持公网暴露(Funnel)
  • 跨平台兼容性好

第三章:SSH 隧道方案

概述

SSH 隧道(SSH Tunnel)是利用 SSH 协议的加密特性,在客户端和服务器之间建立安全通信通道的技术。对于 OpenClaw 远程访问,SSH 隧道提供了灵活的网络转发能力,可以在不暴露服务的情况下实现安全的远程访问。

SSH 隧道工作原理

核心机制

SSH 隧道基于 SSH 协议的端口转发功能,通过加密通道传输任意 TCP 流量:

  1. 加密传输:所有流量通过 SSH 加密通道传输
  2. 端口映射:将本地或远程端口映射到目标服务
  3. 协议透明:对上层应用透明,无需修改代码

隧道类型

  • 本地端口转发(-L):将本地端口转发到远程服务器的目标端口
  • 远程端口转发(-R):将远程服务器端口转发到本地目标端口
  • 动态端口转发(-D):创建 SOCKS 代理服务器

本地端口转发配置(ssh -L)

基本语法

ssh -L [本地绑定地址:]本地端口:目标主机:目标端口 用户名@跳板机

实战示例

场景1:访问内网 OpenClaw 管理界面
# 将本地 8888 端口转发到内网 OpenClaw 服务器的 8080 端口
ssh -L 8888:192.168.1.100:8080 admin@jump-server.company.com

# 现在可以通过 http://localhost:8888 访问内网服务
场景2:数据库安全访问
# 将本地 5432 端口转发到生产数据库
ssh -L 5432:prod-db.internal:5432 db-admin@bastion.host.com

# 本地应用连接 localhost:5432 即可访问生产数据库
psql -h localhost -p 5432 -U app_user mydb

高级配置

# 多端口转发(使用配置文件)
cat > ~/.ssh/config << 'EOF'
Host openclaw-tunnel
    HostName bastion.host.com
    User admin
    Port 22
    IdentityFile ~/.ssh/openclaw_key
    LocalForward 8888 192.168.1.100:8080
    LocalForward 9999 192.168.1.101:9090
    ServerAliveInterval 60
    ServerAliveCountMax 3
EOF

# 使用配置文件连接
ssh openclaw-tunnel

远程端口转发配置(ssh -R)

基本语法

ssh -R [远程绑定地址:]远程端口:目标主机:目标端口 用户名@跳板机

实战示例

场景1:暴露本地开发服务
# 将跳板机的 8080 端口转发到本地的开发服务器
ssh -R 8080:localhost:3000 developer@jump-server.company.com

# 团队其他成员可通过 http://jump-server.company.com:8080 访问
场景2:远程访问内网 OpenClaw
# 在 OpenClaw 服务器上执行
ssh -R 8888:localhost:8080 admin@public-server.com

# 外部用户访问 http://public-server.com:8888 即可访问内网服务

绑定地址限制

默认情况下,远程端口只绑定到 localhost。要允许远程端口绑定到所有接口或指定接口,需要在 SSH 服务器端配置 GatewayPorts 选项:

SSH 服务器配置说明:

编辑 /etc/ssh/sshd_config 文件,配置 GatewayPorts 参数:

# 选项1:允许远程端口绑定到所有网络接口(0.0.0.0)
GatewayPorts yes

# 选项2:允许客户端指定绑定地址(推荐)
GatewayPorts clientspecified

# 选项3:保持默认,只允许绑定到 localhost
# GatewayPorts no

安全提醒:

  • 启用 GatewayPorts yes 会使服务对所有网络接口可见,请确保有适当的防火墙保护
  • GatewayPorts clientspecified 提供更细粒度的控制,推荐在生产环境中使用
  • 始终配合 SSH 密钥认证和防火墙规则使用

动态 SOCKS 代理(ssh -D)

基本用法

# 创建 SOCKS5 代理,监听本地 1080 端口
ssh -D 1080 user@jump-server.company.com

# 使用代理访问内网资源
curl --socks5 localhost:1080 http://internal-service.local/api

持久化隧道方案(autossh 配置)

autossh 安装

# Ubuntu/Debian
sudo apt update && sudo apt install autossh

# CentOS/RHEL
sudo yum install epel-release
sudo yum install autossh

# Arch Linux
sudo pacman -S autossh

基础配置

# 简单的持久化隧道
autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" \
       -L 8888:192.168.1.100:8080 admin@jump-server.company.com

系统服务配置

创建 systemd 服务文件 /etc/systemd/system/openclaw-tunnel.service

[Unit]
Description=OpenClaw SSH Tunnel Service
After=network.target

[Service]
Type=simple
User=admin
ExecStart=/usr/bin/autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" \
          -L 8888:192.168.1.100:8080 -L 9999:192.168.1.101:9090 \
          admin@jump-server.company.com -i /home/admin/.ssh/openclaw_tunnel_key
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

启用并启动服务:

# 重新加载 systemd
sudo systemctl daemon-reload

# 启用开机自启
sudo systemctl enable openclaw-tunnel

# 启动服务
sudo systemctl start openclaw-tunnel

# 查看状态
sudo systemctl status openclaw-tunnel

安全最佳实践

SSH 配置强化

# /etc/ssh/sshd_config 安全配置
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AllowAgentForwarding no
AllowTcpForwarding yes
GatewayPorts no
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2

密钥管理

# 生成专用隧道密钥
ssh-keygen -t ed25519 -f ~/.ssh/openclaw_tunnel_key -C "openclaw-tunnel@$(hostname)"

# 设置严格的权限
chmod 600 ~/.ssh/openclaw_tunnel_key*

# 使用 ssh-agent
eval $(ssh-agent -s)
ssh-add ~/.ssh/openclaw_tunnel_key

总结

SSH 隧道为 OpenClaw 远程访问提供了灵活可靠的安全通道。通过本地转发、远程转发和动态代理三种模式,可以满足不同的访问需求。结合 autossh 的持久化能力,可以构建稳定的生产级隧道服务。

关键优势:

  • 加密传输,安全性高
  • 配置灵活,适应多种场景
  • 无需额外软件,利用现有 SSH 基础设施
  • 支持持久化和故障恢复

第四章:TLS 加密与 WebSocket

概述

TLS(Transport Layer Security)加密和 WebSocket 协议为 OpenClaw 远程访问提供了现代化的安全通信方案。TLS 确保数据传输的机密性和完整性,WebSocket 则提供了全双工的实时通信能力。两者的结合构成了现代 Web 应用安全通信的标准方案。

重要说明:OpenClaw Gateway 本身不直接提供 TLS 终止功能。Gateway 默认监听 HTTP 连接(通常端口 18789),TLS 加密需要通过反向代理服务器(如 Nginx、Caddy、Apache)来实现。这种架构分离了应用逻辑和 TLS 处理,提供了更好的灵活性和安全性。

典型部署架构

客户端 ↔️ HTTPS/WSS (443) ↔️ 反向代理 (Nginx/Caddy) ↔️ HTTP/WS (18789) ↔️ OpenClaw Gateway

反向代理负责 TLS 终止、负载均衡和静态资源服务,然后将解密后的流量转发给 OpenClaw Gateway 处理。

TLS/SSL 证书基础

证书类型

自签名证书(开发环境)
# 生成私钥和证书(有效期365天)
openssl req -x509 -newkey rsa:4096 -keyout openclaw.key -out openclaw.crt \
            -days 365 -nodes -subj "/CN=openclaw.local/O=OpenClaw/C=CN"

# 生成带 SAN 扩展的证书
openssl req -x509 -newkey rsa:4096 -keyout openclaw.key -out openclaw.crt \
            -days 365 -nodes -subj "/CN=openclaw.local" \
            -addext "subjectAltName=DNS:openclaw.local,DNS:localhost,IP:127.0.0.1"
Let's Encrypt 证书(生产环境)
# 安装 certbot
sudo apt update && sudo apt install certbot

# 获取证书(standalone模式)
sudo certbot certonly --standalone -d openclaw.example.com

# 证书文件路径:
# 私钥:/etc/letsencrypt/live/openclaw.example.com/privkey.pem
# 证书:/etc/letsencrypt/live/openclaw.example.com/fullchain.pem

WebSocket over TLS 实现

基本概念

WebSocket over TLS(WSS)在 WebSocket 协议基础上增加了 TLS 加密层,默认端口为 443。

Nginx 作为 WebSocket 代理

# /etc/nginx/sites-available/openclaw
upstream openclaw_backend {
    server 127.0.0.1:3000;
}

server {
    listen 443 ssl http2;
    server_name openclaw.example.com;
    
    # TLS 配置
    ssl_certificate /etc/letsencrypt/live/openclaw.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/openclaw.example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    
    # WebSocket 代理配置
    location /ws {
        proxy_pass http://openclaw_backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 86400;
    }
    
    # 普通 HTTPS 请求
    location / {
        proxy_pass http://openclaw_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

双向 TLS 认证(mTLS)

服务端配置

# nginx mTLS 配置
server {
    listen 443 ssl;
    server_name api.openclaw.example.com;
    
    ssl_certificate /etc/ssl/certs/server.crt;
    ssl_certificate_key /etc/ssl/private/server.key;
    
    # 客户端证书验证
    ssl_client_certificate /etc/ssl/certs/ca.crt;
    ssl_verify_client on;
    ssl_verify_depth 2;
    
    location / {
        if ($ssl_client_verify != SUCCESS) {
            return 403;
        }
        proxy_pass http://backend;
        proxy_set_header X-Client-Cert $ssl_client_escaped_cert;
    }
}

完整的 Nginx 反向代理配置示例

# /etc/nginx/conf.d/openclaw.conf
upstream openclaw_services {
    least_conn;
    server 127.0.0.1:3001 weight=1;
    server 127.0.0.1:3002 weight=1;
    server 127.0.0.1:3003 weight=2;
}

# HTTP 重定向到 HTTPS
server {
    listen 80;
    server_name openclaw.example.com;
    return 301 https://$server_name$request_uri;
}

# 主 HTTPS 服务器
server {
    listen 443 ssl http2;
    server_name openclaw.example.com;
    
    # TLS 优化配置
    ssl_certificate /etc/letsencrypt/live/openclaw.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/openclaw.example.com/privkey.pem;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305;
    ssl_prefer_server_ciphers off;
    
    # HSTS 头
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    
    # API 服务
    location /api/ {
        proxy_pass http://openclaw_services;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_connect_timeout 30s;
        proxy_send_timeout 30s;
        proxy_read_timeout 30s;
    }
    
    # WebSocket 服务
    location /ws/ {
        proxy_pass http://127.0.0.1:3003;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 86400;
    }
    
    # 静态文件服务
    location /static/ {
        alias /var/www/openclaw/static/;
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
    
    # 健康检查端点
    location /health {
        access_log off;
        return 200 "healthy\n";
        add_header Content-Type text/plain;
    }
}

故障排除

TLS 证书问题

问题 症状 解决方案
证书链不完整 SSL: CERTIFICATE_VERIFY_FAILED 合并证书链
Let's Encrypt 续期失败 Certbot failed to authenticate 检查端口占用,停止占用服务
混合内容错误 Mixed Content 警告 使用 WSS 而非 WS

总结

TLS 加密与 WebSocket 的结合为 OpenClaw 提供了现代化、高性能的安全通信方案。通过 TLS 确保数据机密性,WebSocket 提供实时通信能力,配合 Nginx 反向代理的负载均衡和 SSL 终止,可以构建企业级的远程访问系统。

关键技术点:

  • TLS 证书管理与自动续期(Let's Encrypt)
  • 证书固定防止中间人攻击
  • WebSocket over TLS 实现实时安全通信
  • 统一的认证机制保证本地远程一致性
  • Nginx 优化的反向代理配置

第五章:网络安全最佳实践

5.1 认证与授权机制

OpenClaw 的安全模型围绕多层认证机制构建,确保只有授权用户和设备能够访问 Gateway 服务。

API Key 认证

Gateway 支持通过 API Key 进行身份验证。在配置文件中设置:

{
  "gateway": {
    "auth": {
      "mode": "token",
      "token": "your-secure-random-token-here"
    }
  }
}

建议使用至少 32 字节的加密安全随机字符串:

# 生成安全的随机 token
openssl rand -base64 32

密码认证(Password Auth)

对于 Web 界面访问,可启用密码保护:

{
  "gateway": {
    "auth": {
      "mode": "password",
      "password": "your-strong-password"
    }
  }
}

注意:使用 Tailscale Funnel 时,gateway.auth.mode 必须设置为 "password",否则 Funnel 将拒绝启动。

设备配对认证(DM Pairing)

OpenClaw 默认启用设备配对机制保护私信(DM)访问。当未知发送者尝试联系助手时:

  1. 发送者会收到一个配对码
  2. 管理员需运行 openclaw pairing approve <channel> <code> 批准该设备
  3. 批准后,设备被加入本地允许列表

5.2 防火墙配置

UFW(Uncomplicated Firewall)配置

对于 Ubuntu/Debian 系统,推荐使用 UFW:

# 安装 UFW
sudo apt update && sudo apt install ufw

# 默认拒绝所有入站,允许所有出站
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 允许 SSH(必须首先配置,避免锁定)
sudo ufw allow 22/tcp

# 如果使用 Tailscale,允许 Tailscale 接口
sudo ufw allow in on tailscale0

# 启用防火墙
sudo ufw enable

# 查看状态
sudo ufw status verbose

OpenClaw 绑定策略

绑定模式 配置值 说明
仅本地 loopback (默认) 最安全,仅本机可访问
局域网 lan 同网络设备可访问
Tailnet tailnet 仅限 Tailscale 网络成员
自动 auto 根据配置自动选择

最佳实践

  • 生产环境保持 gateway.bind 为 loopback
  • 配合 Tailscale Serve/Funnel 进行安全暴露
  • 使用 Tailscale 时,设置 gateway.auth.allowTailscale: true 以利用 Tailscale 身份验证

5.3 日志与监控

OpenClaw 安全审计

OpenClaw 内置安全审计工具:

# 基础安全审计
openclaw security audit

# 深度审计(包含探测性检查)
openclaw security audit --deep

# 自动修复可安全修复的问题
openclaw security audit --fix

# JSON 格式输出
openclaw security audit --json

fail2ban 配置

# 安装 fail2ban
sudo apt install fail2ban

# 创建本地配置
sudo tee /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
EOF

# 启动服务
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

# 查看状态
sudo fail2ban-client status sshd

5.4 应急响应预案

安全事件分级

级别 描述 响应时间
P0 - 严重 Gateway 被入侵、API 密钥泄露 立即
P1 - 高 可疑登录活动、未授权设备配对 30 分钟内
P2 - 中 配置漂移、权限异常 24 小时内
P3 - 低 安全更新可用 计划维护窗口

紧急响应流程

场景 1:API 密钥泄露
# 1. 立即撤销旧密钥
openclaw config unset gateway.auth.token

# 2. 生成新密钥
NEW_TOKEN=$(openssl rand -base64 32)
openclaw config set gateway.auth.token "$NEW_TOKEN"

# 3. 重启 Gateway
openclaw gateway restart

# 4. 更新所有客户端配置
# 5. 审查日志确认泄露范围
openclaw logs --since "24h ago" | grep -i "unauthorized\|invalid"
场景 2:可疑设备访问
# 1. 列出所有已配对设备
openclaw devices list

# 2. 撤销可疑设备
openclaw devices revoke <device-id>

# 3. 清除所有待处理配对请求
openclaw devices clear-pending

# 4. 临时启用严格配对模式
openclaw config set channels.telegram.dmPolicy "pairing"
场景 3:Gateway 完全锁定
# 如果配置错误导致无法访问:

# 1. 停止 Gateway
openclaw gateway stop

# 2. 重置配置到安全默认值
openclaw reset

# 3. 或手动编辑配置文件
nano ~/.openclaw/openclaw.json

# 4. 重新启动
openclaw gateway start

5.5 安全加固检查清单

部署前检查

  • ✅ Gateway 绑定地址设为 loopback(默认)
  • ✅ 已配置强密码或 API Key(≥32 字节随机)
  • ✅ 已启用设备配对认证
  • ✅ 防火墙已启用并正确配置
  • ✅ SSH 已禁用密码登录(如适用)
  • ✅ 已安装 fail2ban(可选)

定期维护检查

  • ✅ 运行 openclaw security audit 无警告
  • ✅ 检查已配对设备列表,移除不活跃设备
  • ✅ 审查访问日志,确认无异常
  • ✅ 更新 OpenClaw 到最新版本
  • ✅ 检查 TLS 证书有效期(如使用 HTTPS)

生产环境加固

  • ✅ 使用 Tailscale 或 VPN 保护访问
  • ✅ 配置 Nginx 反向代理 + TLS
  • ✅ 启用 HSTS 头
  • ✅ 配置自动安全审计 cron 任务
  • ✅ 设置日志轮转和备份

5.6 常见安全问题 FAQ

Q1: 忘记 Gateway 密码怎么办?
# 重置密码
openclaw config set gateway.auth.password "$(openssl rand -base64 24)"

# 或完全重置配置
openclaw reset
Q2: 如何临时关闭远程访问?
# 方法1:停止 Gateway
openclaw gateway stop

# 方法2:限制绑定地址
openclaw config set gateway.bind loopback
openclaw gateway restart

# 方法3:防火墙阻止(紧急情况)
sudo ufw deny 18789/tcp

总结

OpenClaw 的安全模型遵循"默认安全"原则:

  1. Gateway 默认仅绑定本地回环,防止意外暴露
  2. 私信通道默认启用配对认证,阻止未授权访问
  3. Tailscale 集成提供零配置安全网络,避免端口暴露
  4. 内置审计工具帮助持续监控安全态势

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐