公网暴露llama.cpp实例风险
公网直接暴露 llama.cpp 实例且未开启鉴权,等于把 GPU 算力免费送给互联网上的任何人。
最近一个运维案例中,服务器上的推理接口被大量陌生请求刷爆,CPU 和 GPU 持续跑满,网络带宽耗尽,月度账单大幅上涨。
事后排查发现,服务绑定了 0.0.0.0,端口直接开放,API 没有任何身份校验。
本文从这类未鉴权导致算力被盗的案例出发,讲清风险原理,并给出从检查、封堵到验证的完整实操步骤,零基础用户也能照着执行。
攻击者如何白嫖你的算力?
llama.cpp 自带 HTTP server 接口,启动后默认监听本地。
只要改成 0.0.0.0 并暴露到公网,而 /v1/chat/completions、/v1/embeddings 等接口没有 token 校验,任何人都能直接调用。
攻击者用脚本扫描全网 8080、8081 等常见端口,发现响应特征后,就能把你的模型当成免费 API 使用。
轻则消耗 GPU 算力,重则泄露模型数据或污染你正在运行的任务。
第一步:检查你的实例是否裸奔
先确认当前服务是怎么启动的。
如果启动参数里有 --host 0.0.0.0 或 --listen 0.0.0.0,就属于公网暴露。
再从另一台机器上测试一下:
curl -s http://你的服务器IP:8080/v1/models
如果直接返回模型列表 JSON,比如 {"object":"list","data":[...]},说明接口没有鉴权,任何人都能访问。
如果返回 401 或提示需要 api key,则暂未暴露。
注意测试时别在服务器本机测试,要用另一台设备或手机流量访问公网 IP,才能确认外网可达。
第二步:封堵未鉴权访问
核心思路就两条:开启鉴权 和 限制访问来源。
开启 API Key 鉴权
llama.cpp 的 server 支持 --api-key 参数,启动时加入:
./llama-server --model ./models/your-model.gguf --host 0.0.0.0 --port 8080 --api-key 你的强随机密钥
强随机密钥可以用 openssl rand -hex 32 生成,不要用 123456 这类弱口令。
限制访问来源
如果只有你自己或固定办公 IP 使用,可在防火墙层白名单放行。
以 UFW 为例:
ufw allow from 你本机IP to any port 8080
ufw deny 8080
注意规则顺序:先放行白名单,再拒绝全部。
iptables 同理,做好顺序即可。
用反向代理做二次校验
生产环境建议把服务绑到内网,再通过 Nginx 暴露公网。
Nginx 层配置 Basic Auth 或 token 校验,即使 API 自身鉴权被绕过,还有一层拦截。
第三步:避坑这些操作
第一,不要依赖改端口。
换成 18080 只能降低被扫描概率,无法防止扫描器全端口探测。
第二,API Key 不要写在命令行里。
进程列表和 shell 历史都会泄露,建议通过环境变量传入。
第三,防火墙规则顺序很重要。
如果先执行了 ufw deny 8080,再执行 ufw allow,后者通常无法生效,因为 UFW 默认按顺序匹配。
第四,记得改默认 bind 地址。
如果只是本机调试,保持 127.0.0.1 就不要改,只有需要远程访问才绑定 0.0.0.0。
第四步:验证防护是否生效
改完后从另一台机器做三组测试:
# 不带 key,预期 401
curl -i http://你的服务器IP:8080/v1/models
# 带错误 key,预期 401
curl -i http://你的服务器IP:8080/v1/models -H "Authorization: Bearer wrongkey"
# 带正确 key,预期 200 和模型列表
curl -i http://你的服务器IP:8080/v1/models -H "Authorization: Bearer 你的强随机密钥"
前两条返回 401,最后一条返回 200,说明鉴权已经生效。
再用防火墙白名单的机器测试,确认能访问;
非白名单 IP 访问会超时或连接拒绝。
另外可以检查服务日志,观察启动时是否正确加载了 api-key 配置,以及是否有外部 IP 的 401 尝试记录。
如果看到大量 401,说明攻击者还在扫描,但已经被挡在门外。
常见疑问:这样配置会影响正常调用吗?
只要在请求头里带上 Authorization: Bearer 你的密钥,正常调用完全不受影响。
如果是用 llama.cpp 官方客户端或 OpenAI SDK,在 base_url 和 api_key 里分别填上服务器地址和密钥即可。
建议把密钥写进环境变量或配置文件,避免明文出现在代码仓库里。
如果你正在处理公网暴露 llama.cpp 实例风险,建议先按本文步骤执行检查,再完成鉴权和防火墙配置,最后逐一验证。
遇到不确定的地方,优先看 llama.cpp 官方文档中 server 部分的参数说明。