公网访问加固
nginx 反代 AI 控制台的标准姿势与验收清单
分层加固
1. 服务侧:只监听本机 + 设密码
json
{
"web_host": "127.0.0.1",
"web_port": 9899,
"web_password": "<强密码>"
}web_host 保持 127.0.0.1,对外的入口只有 nginx。
2. nginx 侧:反代 + 必要头
nginx
location / {
proxy_pass http://127.0.0.1:9899;
proxy_http_version 1.1;
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;
# WebSocket / 流式输出必须放行,否则"页面能开但对话不动"
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 600s;
proxy_buffering off;
client_max_body_size 32m; # 上传文件、语音
}3. 门禁:子请求鉴权
团队版用门户会话做门禁(详见服务器部署):
nginx
location / {
auth_request /portal/api/check; # 401 则跳登录
error_page 401 = @to_portal;
proxy_pass http://127.0.0.1:9899;
}
location @to_portal { return 302 /portal/; }4. 响应脱敏(可选但推荐)
即使有鉴权,也建议让配置读取接口不返回明文密钥(例如返回 sk-****),
避免"任何一次日志/截图/前端缓存就泄露 Key"。
中等强度:来源限制
nginx
# 只允许公司出口 IP 访问控制台
location / {
allow 203.0.113.10;
deny all;
proxy_pass http://127.0.0.1:9899;
}移动办公较多时,可以改为"仅 VPN 网段可访问"。
验收清单(逐条打勾,别靠感觉)
- [ ] 未登录访问
https://域名/→ 302 到登录页(而不是直接看到对话界面) - [ ] 直接访问
https://域名/api/config→ 未登录被挡 - [ ] 服务端口从公网不可直连(
nc -vz 公网IP 9899应失败;只在服务器本机 127.0.0.1 能用) - [ ] 页面上不出现明文 API Key
- [ ] HTTPS 证书有效且自动续期(
acme.sh --cron/ 面板任务正常) - [ ] 重启服务器后服务与门户都能自动拉起
- [ ] 防火墙与云安全组都放行了 80/443,且只放行必要端口
- [ ] 备份任务存在,并且实际恢复演练过一次
注意
"端口不通"要查三层:云厂商安全组、本机防火墙(iptables 与 firewall-cmd 是两套东西)、
以及服务是否真的监听在预期的地址上。只查安全组是最常见的误判。
常见误区
| 误区 | 事实 |
|---|---|
| "改个端口别人就扫不到" | 端口扫描很便宜;鉴权才有意义 |
| "内网不用管" | 内网横向移动同样致命 |
| "有密码就安全了" | 密码 + HTTPS + 最小暴露面才是 |
| "备份了就行" | 没恢复演练过的备份不算备份 |