先说结论:这条“25 万+ OpenClaw 实例暴露”的安全提醒,不是危言耸听,更不是在制造流量焦虑。我自己的判断很直接:OpenClaw 这类开源 AI Agent 现在确实火,但太多人只是照着“openclaw 安装教程”把服务跑起来,完全没有想过它背后开着的端口、监听地址和密钥文件意味着什么。这篇文章不打算复述那些公开的统计数据,我只想从一个常年做服务部署和自动化落地的人的角度,讲清楚三件事:你的 OpenClaw 为什么一部署就会暴露、怎么自查自己是不是在“名单”里、以及从本地算力到技能扩展再到安全加固,一套完整的正确玩法应该是什么样的。
文章比较长,既适合刚接触 OpenClaw、准备在安卓 Termux 或云服务器上部署的新手,也适合想把 OpenClaw 接到电商、ROS 2 等实际场景里用的老手。我会尽量说人话,把参数逻辑讲透,保证你照着能落地。
1. 25 万这个数字背后:为什么 OpenClaw 一部署就会“裸奔”到公网
1.1 一个“实例”从启动到暴露,通常只差几步
先解释一下“实例”是什么。OpenClaw 这类开源 AI Agent 本质是一个运行时:它负责接收任务、调度大模型推理、调用浏览器或工具技能、最后把事情做完并返回结果。为了让外部程序或者聊天界面能跟它对话,OpenClaw 启动后一定会开一个本地服务端口,这个端口既是网页操作入口,也是 API 调用通道。
问题出在大多数快速开始文档都只教你“跑起来”,没教你“怎么安全地只给自己用”。你在云服务器上执行启动命令,或者用 Docker 映射端口,如果配置文件里没有显式把服务绑定到127.0.0.1,它默认就会监听0.0.0.0。这句话换成大白话就是:你的服务在向整个互联网打招呼,端口一开,谁都能来敲你的门。
拿 Docker 举个例子,最典型的错误启动方式是这样:
docker run -p 3000:3000 openclaw-image这条命令把容器里的 3000 端口直接映射到了宿主机的公网端口。如果宿主机是云服务器,就等于把 OpenClaw 的入口堂而皇之地贴上了公网。正确姿势应该至少先绑回环地址,后面我会专门讲。
“实例暴露”和“被入侵”还不一样。暴露是被动状态,入侵是主动行为。25 万个实例暴露,不等于 25 万个都被打穿了,但它意味着这 25 万个实例在互联网扫描工具眼里都是可访问目标。你的电脑、你的云主机,只要开着 OpenClaw 端口且没有访问控制,就随时可能出现在这种“名单”里。
1.2 为什么会有这么多人“裸奔”
我观察到的原因大致有三类。
第一类是“快速体验心态”。很多人刷到 OpenClaw 相关视频或文章,马上在云主机上安装、启动、点开网页试一下,试完就放着不管了。这类服务没有身份认证,没有密钥校验,日志里还可能躺着大模型的 API Key,属于最典型的暴露。
第二类是“只有服务器条件”。想远程访问,但不懂内网穿透也不理解防火墙策略,索性把端口全部放行。安全组规则常见配成0.0.0.0/0,这等于在云厂商防火墙上挂了个说明牌:所有端口,所有来源,都能进。
第三类最隐蔽,是“日志和配置文件泄漏”。OpenClaw 部署时经常要用环境变量写入大模型厂家的 API Key。有些教程要求你把.env文件放在工作目录,如果服务监听了公网而且开启了目录浏览,或者调试模式打印了环境变量,密钥就直接暴露了。不少人以为“只要模型走的是官方 API,就轮不到本地算力”,这个认知本身没错,但把 API Key 放在裸奔的服务里,问题就大了。
1.3 暴露之后,真正危险的是什么
经常有人问:我就跑个 AI Agent 玩,也不存什么值钱数据,暴露了会怎样?
问题比你想的严重。第一,OpenClaw 能调用工具、能操作浏览器、能执行代码,攻击者拿到入口之后,可以用你的 Agent 去跑任务、消耗你的 API 额度,账单上会出现莫名其妙的费用。第二,如果宿主机的权限设置不当,攻击者能通过接口执行命令,进而把服务器变成挖矿或发消息的肉鸡。第三,日志里残留的密钥会被自动化脚本捞走,用于调用你的 OpenAI、Anthropic 等账号。很多人在部署 OpenClaw 时用的都是自己的主账号 Key,一旦被捞走,损失的可就不只是这台机器了。
所以说,暴露名单之所以会滚到 25 万这个量级,不是攻击手段有多高明,而是太多人把“能用”当成了“安全”。
2. 先照镜子:怎么确认你的电脑在没在“名单”里
2.1 三种典型的暴露“信号”
在动手加固之前,先判断自己的部署到底是否安全。我总结过三种典型的暴露信号,对号入座就行。
第一种:监听地址显示0.0.0.0或::。这说明 OpenClaw 服务对所有网络接口开放。如果你的服务器有公网 IP,那基本等于裸奔。如果监听的是127.0.0.1,那至少只有本机能访问,问题不大。
第二种:云厂商控制台的“安全组”或“防火墙”里存在入站规则0.0.0.0/0,并且放行了 OpenClaw 对应的端口。很多新手为了方便,直接把所有端口都开放了,这是最容易自查也最容易修复的一项。
第三种:日志里出现频繁的外部连接记录。如果你发现日志里有很多来源 IP 不是你自己家宽带的连接尝试,那就说明已经被外部扫描器盯上了。典型表现是短时间内大量请求,甚至带有一堆奇怪的路径探测字符串。
2.2 一条命令记住你的“服务面”
最简单的方法是查本机端口监听状态。Linux 和 macOS 上可以用:
ss -tlnp | grep -E "3000|8000|3501"把后面的端口换成你自己的服务端口就行。ss输出的最后一列如果是0.0.0.0:3000,那就说明服务对所有网卡开放;如果看到127.0.0.1:3000,说明只对本机开放。
Windows 用户可以用:
netstat -ano | findstr LISTENING再配合“资源监视器”或 PowerShell 的Get-NetTCPConnection查看对应 PID 的监听地址。
查完之后,还要确认出口 IP。如果你想知道“这台机器从公网看来是什么样的”,在服务器上跑一条:
curl ifconfig.me拿到公网 IP 之后,再对照刚才查到的监听端口。只要监听地址包含0.0.0.0,并且云防火墙或本地防火墙没有阻止入站,那恭喜你,基本就在“名单”里了。
我是个比较老派的人,平时自测还会用公网测绘平台查一下自己的 IP 和端口状态,看能不能直接定位到服务指纹。这类工具只用来查自己的资产,不要拿它去扫别人的网段,这个边界心里要有数。
3. 本地算力方案:OpenClaw 配 Ollama,不再把密钥交给第三方 API
3.1 先破除一个误解:“只能用 API 接入跑算力”是错的
很多搜索 OpenClaw 相关热词的人都在问同一个问题:是不是只能用接入 API 的方式调用大模型,本地算力行不行?
答案是:完全可以在本地跑。OpenClaw 的模型接入层一般兼容 OpenAI 格式的 API,而 Ollama 启动之后本来就提供一个本地 OpenAI 兼容接口。也就是说,你完全可以把 OpenClaw 的模型后端指向 Ollama,让所有推理都发生在你自己的电脑上。这样不仅省去了申请外部 API 的繁琐,还不用担心 Key 泄漏导致账单被刷爆。
本地方案最大的价值是“闭环”。OpenClaw 跑在你自己机器上,Ollama 跑在你自己机器上,请求全走内网回环地址,不经过第三方服务器,钥匙根本不会出现在公网链路里。
3.2 实际操作:Ollama 部署与 OpenClaw 指向本机
先说通用步骤。当前版本项目文档里的环境变量名可能略有差异,但逻辑是一样的:OpenClaw 需要一个模型服务地址,你把地址填成 Ollama 的本地地址即可。
第一步,安装并启动 Ollama:
curl -fsSL https://ollama.com/install.sh | sh ollama pull qwen3:14b ollama serveollama serve默认监听127.0.0.1:11434,这就已经限定了只能本机访问。这个默认行为其实很安全,也是我一直推荐在本地跑的原因。
第二步,在 OpenClaw 配置里把模型供应商设为 Ollama 或 OpenAI 兼容模式,把 Base URL 指向:
http://127.0.0.1:11434/v1并填入一个随便写的本地 Key(多数兼容模式只是做一个格式校验,不强制真实验证)。
第三步,验证连通性。最简单的做法是跑一条普通任务,观察 Ollama 的模型加载日志是否出现请求记录。如果 Ollama 终端里能看到 prompt 输入,并且 OpenClaw 能返回结果,就说明闭环成功。
这里给一个重要的实践注释:本地模型的效果和参数量直接相关。如果电脑配置一般,不要盲目拉 70B 级别的大模型,选 7B 到 14B 的量化版本更稳定。做代码任务可以选专门针对代码训练的模型,做普通 Agent 任务则选通用对话模型。每台机器情况不一样,建议先拉一个小模型做流程验证,再根据响应速度决定是否升级。
3.3 安卓部署和 Termux 的真相
“openclaw 安卓部署”“如何用 termux 安装 openclaw 手机版”这类搜索热度很高,我也被问过很多次。我的看法是:能装,但要分清你装的是什么。
Termux 本质是一个安卓上的 Linux 终端环境。它里面确实可以安装 Node.js LTS 版本,也可以下载 OpenClaw 的运行时依赖,跑命令本身没有问题。但你要清楚,手机上的瓶颈不在安装,而在算力。即使手机内存达到 12G,跑 Ollama 大模型也远比不上一台桌面电脑,更别说长时间运行导致的发热和电池损耗。
我比较推荐的“安卓玩法”是把手机当作远程控制端,而不是算力端。你在自己的高性能 PC 或服务器上运行 OpenClaw + Ollama,手机上通过浏览器或 SSH 访问同一局域网内地址,这样既体验了移动控制的便捷,又规避了手机算力不足的尴尬。
如果你坚持要在 Termux 里跑完整部署,至少要做好三件事:安装 Termux 后先换可用软件源;用pkg install nodejs-lts git python装好基础环境;启动时用termux-wake-lock防止手机休眠把进程杀掉。即便如此,我也建议只跑轻量演示任务,不要把手机部署当成生产主力。
4. 从部署到能用:技能、电商与 ROS 2 场景里的正确姿势
4.1 Skill 机制:让 OpenClaw 从“聊天机器人”变成“干活员工”
部署完模型后端,很多人就停在了“能对话”这一步。但 OpenClaw 这类 Agent 真正有价值的地方是技能扩展,也就是社区里经常听到的openclaw skill。
Skill 的例子很好理解:假设你有一个“查商品价格”的任务,没有技能时,你只能口头命令 OpenClaw 打开浏览器逐个操作;有了技能后,你可以把一个脚本封装给它,命令变成一句“用价格查询技能处理这个链接”,OpenClaw 就会按照脚本逻辑去抓取、解析并返回结构化结果。
一个最小可用的 Skill 通常包含一个描述文件和一个执行脚本。描述文件用 YAML 声明技能的名称、用途、参数和入口命令,执行脚本则是普通的 Python 或 Node.js 文件。下面是一个非常基础和通用的结构示意:
name: price_checker description: 给定商品链接,返回当前价格和库存状态 input: - name: url type: string required: true run: python3 scripts/price_check.py对应的price_check.py从标准输入读取参数,然后执行请求、解析页面并输出 JSON。OpenClaw 拿到输出后,会把它作为下一次决策的上下文。这个机制说穿了并不复杂,但它把“能力边界”从自然语言提示词硬约束到了可运行的代码里,这就是 Agent 从“能聊天”到“能干活”的关键分水岭。
4.2 电商场景:为什么这么热,以及怎么落地
在搜索热词里,openclaw 电商反复出现。原因是电商领域有大量可自动化的重复劳动:查价格、比库存、同步订单状态、整理商品参数、库存盘点。这些事用传统脚本写起来繁琐,用 Agent 加技能的方式去调度,就顺滑很多。
我建议从三个步骤开始落地:
第一步,把每个重复任务拆成一个 Skill。不要试图做一个“万能电商助手”,要做一个“查价助手”,再做一个“对账助手”,拆分得越细,越容易调试和验证。
第二步,给 Skill 设计清晰的输入输出。比如查价技能,输入是商品链接,输出是价格、库存、上架状态结构化字段。这样 OpenClaw 后续可以把这些结果拼到邮件、表格或者企业聊天工具里。
第三步,注意电商平台的反自动化策略。很多商城有登录风控、滑块验证、IP 频控。你部署 OpenClaw 的时候,一定不要在电商页面频繁快速点击,也不要让技能脚本里的并发请求数过高。这个不是 OpenClaw 本身的问题,是任何自动化工具在真实互联网环境里都要面对的规则问题。
4.3 ROS 2 与 Gazebo:rosclaw 是什么,能做什么
搜索热词里还有一条很有意思:rosclaw openclaw ros2 humble gazebo。这是最近社区里把 OpenClaw 接到机器人仿真环境的玩法,本质上是用 ROS 2 作为 OpenClaw 与机器人交互的“关节”。
ROS 2 Humble 是目前很常见的机器人操作系统版本,Gazebo 是配套的仿真环境。正常流程是:在 Ubuntu 22.04 上安装 ROS 2 Humble,启动一个带差速机器人的 Gazebo 场景,然后通过技能把 OpenClaw 接到 ROS 2 的话题发布端上。这样 OpenClaw 生成“前进一米”的指令,技能脚本调用ros2 topic pub /cmd_vel给仿真机器人,机器人就在仿真环境里动了。
这里面最容易犯的错是环境变量混乱。ROS 2 的source /opt/ros/humble/setup.bash必须在你执行任何 ros2 命令之前做好,技能脚本也要先检查ROS_DOMAIN_ID和RMW_IMPLEMENTATION是否一致,否则最常见的结果就是“Agent 说走了一米,Gazebo 里纹丝不动”。
对着机器人仿真场景我再提醒一句:当 OpenClaw 能控制实体机器人时,“实例暴露”的风险就从信息泄露升级成了物理风险。这种场景下端口加固、身份认证和操作审计就比单纯聊天部署重要得多,一定不要图方便把控制端裸挂在公网上。
5. 防“裸奔”加固四件事,缺一件都别说是安全的
5.1 把监听地址改回127.0.0.1
这是成本最低、效果最明显的加固动作。OpenClaw 部署在本地电脑或内网服务器上时,优先把它绑定到回环地址,只允许本机访问,需要远程访问时再通过反向代理转发。Docker 部署情况下,最安全的写法是:
docker run -p 127.0.0.1:3000:3000 openclaw-image这样容器端口 3000 通过宿主机 127.0.0.1 映射,公网根本访问不到,只有本机能连。云服务器用户不要嫌这一步多事,本地服务挂公网端口,等于在办公室里贴了一张“欢迎进来坐坐”的告示。
5.2 用反向代理加访问控制,而不是直连端口
如果你确实需要在公司或家里远程使用 OpenClaw,不要直接暴露原始端口,应该加一层反向代理。推荐 Caddy 或 Nginx,配合基本身份验证和 HTTPS。Caddy 的优势是自动申请证书,配置更短;Nginx 则更通用,适合和已有服务共存。
用 Nginx 做一个最基本的转发示例:
server { listen 443 ssl; server_name agent.example.com; ssl_certificate /etc/nginx/ssl/agent.crt; ssl_certificate_key /etc/nginx/ssl/agent.key; location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }这一步解决两件事:一是把 OpenClaw 从公网上隐藏到代理后面,二是让所有外部流量都走 HTTPS,避免参数在网络上明文传输。如果你不想搞域名证书,也可以用带auth_basic的 Nginx 配置,效果一样是把陌生人挡在门外。
5.3 云安全组与本地防火墙做最小白名单
云服务器用户一定要养成“仅放行必要端口”的习惯。不要为了省事把入站规则配成0.0.0.0/0的全开状态,更不要所有端口全放。正确做法是安全组只放行 80/443 这类对外服务的端口,OpenClaw 的原始端口只允许来自你自己 IP 或内网。
本地防火墙也可以做同样的事,Ubuntu 上可以这样:
sudo ufw allow from 你的固定IP to any port 3000 sudo ufw enable只把自己的办公网 IP 放进白名单,其他的外部访问一律拒绝。写脚本或配置时别用ufw allow 3000这种形式,那等于对全网开放,配了等于没配。
5.4 密钥轮换与日志清理
不管模型后端是 Ollama 还是外部 API,都要管好密钥。建议在配置里使用环境变量而不是硬编码,并且不要把.env文件提交到 Git。如果你曾经在裸奔状态下部署过 OpenClaw,不管有没有被扫描记录,都建议立刻去对应的大模型平台把 API Key 吊销,然后重新生成。
生成新密钥的时候可以用系统自带工具:
openssl rand -hex 32另外要检查日志配置,避免把请求里的密钥、密码等敏感字段打出来。我见过不少服务默认打印完整请求头,结果 Authorization 字段里的 Key 全在日志里躺了一整晚。把日志输出等级调到 WARN 或 ERROR,日常运行没必要留太多 DEBUG。
6. “暴露”这件事没有一次性解,只有默认姿势
回到开头那个 25 万的数字。为什么会有这么多实例“裸奔”?核心原因是很多部署者把“服务能跑起来”当成终点,而不是把“服务能安全地跑很久”当成目标。对 OpenClaw 这种自带代码执行和工具调用能力的 Agent 来说,安全不是加分项,是默认项。
我在实际部署中形成的习惯是:每次启动 OpenClaw 之前,先检查监听地址;启动之后,跑一次端口自检;退出之前,看一眼日志里有没有异常的外部来源 IP。这套动作加起来不到三分钟,却能避免绝大部分的“裸奔”事故。
最后再分享一个小技巧:把端口自检写成一个 alias,比如在.bashrc里加一行alias portsafe='ss -tlnp | grep -E "LISTEN"',以后部署任何新服务都能先照一眼。OpenClaw 确实是个好用的 Agent 项目,但前提是你能控制住它往公网伸出去的每一条网线。把这篇文章里的四件事做完,再谈把它应用到电商、ROS 2 或者其他场景里,才踏实得多。