本地部署大模型,如何防止被非法调用?:本地大模型安全防护
自己搭了个大模型服务(比如 Llama、ChatGLM、通义千问),本来只想内部用,结果发现有人通过公网直接调你的 API?
这种情况并不少见。
本文从零开始,教你用最简单、最可靠的方法给本地大模型服务加几道锁,彻底防止非法调用。
第一步:先给 API 加上密钥认证
不管模型是用什么框架启动(vllm、ollama、FastChat 等),第一步一定是开启 API 密钥校验。
以 vLLM 为例,启动时加上 --api-key 参数:
python -m vllm.entrypoints.openai.api_server \
--model /path/to/model \
--api-key your-secure-key-here
ollama 默认不开启鉴权,可以在环境变量里设置:
export OLLAMA_AUTH_TOKEN="your-secure-key"
ollama serve
如果用的是 OpenAI 兼容的 API 封装,大部分都支持配置 API_KEY 环境变量。
设置完后,所有请求必须携带 Authorization: Bearer your-secure-key-here 才能成功。
验证方法: 不带密钥直接 curl 测试,返回 401 错误就代表生效。
第二步:用 IP 白名单限制来源
密钥只能防住没有凭证的访问,但如果密钥泄露或你希望只让公司内网访问,必须加 IP 白名单。
2.1 使用 iptables 限制(Linux 通用)
假设你的大模型服务监听端口是 8000,只允许内网段 192.168.1.0/24 和特定公网 IP 203.0.113.5 访问:
# 允许内网
sudo iptables -A INPUT -p tcp --dport 8000 -s 192.168.1.0/24 -j ACCEPT
# 允许指定公网 IP
sudo iptables -A INPUT -p tcp --dport 8000 -s 203.0.113.5 -j ACCEPT
# 拒绝其他所有
sudo iptables -A INPUT -p tcp --dport 8000 -j DROP
注意: 保存规则,重启后依然生效。
不同发行版保存方式不同,CentOS 用 service iptables save,Ubuntu 推荐用 iptables-persistent。
2.2 如果用了宝塔面板
在“安全”菜单里,点击“添加端口规则”,端口填模型服务端口,来源 IP 设为“指定 IP”,然后填入允许的 IP 或网段。
其他 IP 自动屏蔽。
第三步:用 Nginx 反向代理做二次过滤
如果模型服务已经开放,或者你想更灵活地控制访问(比如按路径限制、限制请求频率),建议在模型前面加一层 Nginx。
Nginx 配置示例(监听 443 并转发到本地 8000,同时限流):
upstream model_backend {
server 127.0.0.1:8000;
}
server {
listen 443 ssl;
server_name your.domain.com;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
# 限流:每个 IP 每秒最多 5 个请求
limit_req_zone $binary_remote_addr zone=modellimit:10m rate=5r/s;
location / {
limit_req zone=modellimit burst=10;
# 可再加一层 IP 白名单,仅允许以下 IP
allow 192.168.1.0/24;
allow 203.0.113.5;
deny all;
proxy_pass http://model_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
这样即使有人拿到你的接口地址,非白名单 IP 直接返回 403,暴力请求也会被限流。
避坑指南(高频问题)
Q:加了 API 密钥和 IP 白名单是不是就够了?
A:基本够用。但如果模型暴露在公网且密钥比较复杂,可以不加白名单。如果密钥泄露,白名单才是最后防线。建议两项都用。
Q:内网 IP 经常变化,白名单怎么维护?
A:可以使用云厂商的安全组或防火墙管理器(如 firwalld)动态更新,也可以写脚本定期从信任机器拉取当前公网 IP。
Q:用了 Nginx 反向代理后,对方还是能直接访问后端端口?
A:必须让后端服务只监听 127.0.0.1 或内网地址,不暴露到公网。例如 vLLM 启动时加 --host 127.0.0.1。
Q:限流配置会误杀正常用户吗?
A:rate=5r/s 可根据你的实际使用情况调整。建议先用 burst=20 测试,稳定后再收紧。
效果验证:逐层检查
- 验证密钥认证: 用不带密钥的请求测试,应返回 401。
- 验证 IP 白名单: 从非白名单 IP 访问(比如用手机热点),应被拒绝(iptables 返回无响应,Nginx 返回 403)。
- 验证限流: 短时间内连续发送请求,Nginx 应返回 503。
- 检查端口暴露: 用在线端口扫描工具扫你的公网 IP,除了 80/443,不应看到模型服务端口。
实际部署时,建议把以上三步都走一遍,并定期检查日志(/var/log/nginx/access.log 或 journalctl)看是否有异常请求。
坚持这样做,你的本地大模型基本不会被非法调用了。