首页 / 文档 / 安全 / 公网访问加固

公网访问加固

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 + 最小暴露面才是
"备份了就行" 没恢复演练过的备份不算备份