大模型内网转公网HTTPS安全接入 配置笔记
整体架构
内网容器 vLLM:8001
↓ Autossh 加密反向隧道
公网云服务器 127.0.0.1:18001
↓ 独立Nginx + HTTPS + 密钥鉴权
公网统一入口:https://llm.litearch.cn/v1
核心规则:
- 公网只开放 80、443、22,严禁放行 8001/18001
- 子域名
llm.litearch.cn独立Nginx配置,不与博客混用 - 博客GitHub Action自动构建不影响LLM接口配置
一、公网云服务器配置(ubuntu@VM-0-10-ubuntu)
1. 域名解析
域名:litearch.cn
新增A记录:
- 主机记录:
llm - 解析地址:云服务器公网IP
- 已备案子域名无需额外备案
2. SSL证书申请
sudo certbot --nginx -d llm.litearch.cn
证书自动续期,无需手动维护。
3. Nginx 独立站点配置
配置文件路径:/etc/nginx/sites-available/llm-service
server {
listen 443 ssl;
server_name llm.litearch.cn;
ssl_certificate /etc/letsencrypt/live/llm.litearch.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/llm.litearch.cn/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
# 接口访问鉴权密钥
if ($http_authorization != "Bearer LITEARCH_LLM_2026_SAFE_KEY") {
return 401;
}
location / {
proxy_pass http://127.0.0.1:18001;
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;
proxy_connect_timeout 60s;
proxy_read_timeout 120s;
}
}
server {
listen 80;
server_name llm.litearch.cn;
return 301 https://$host$request_uri;
}
启用配置:
sudo ln -s /etc/nginx/sites-available/llm-service /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
4. 解决Nginx域名冲突
清理 litearch.conf 中所有 llm.litearch.cn 多余server块,只保留主博客域名配置,避免端口域名冲突。
5. 安全组/防火墙规则
仅放行:
- 22 :SSH运维
- 80 :HTTP证书验证、自动跳转
- 443 :HTTPS公网接口
禁止放行:18001、8001
二、内网模型容器配置(root@d58125c354a4)
1. vLLM 启动命令(任意路径可执行)
CUDA_VISIBLE_DEVICES=0 PORT=8001 /root/Documents/code/python/scripts/serve_qwen3_32b.sh
服务监听:127.0.0.1:8001
2. 内网容器免密登录云服务器
# 生成密钥
ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519
# 推送公钥到云服务器免密
ssh-copy-id -i ~/.ssh/id_ed25519.pub ubuntu@llm.litearch.cn
3. 永久反向隧道(断线自动重连)
# 安装工具
apt install autossh -y
# 启动反向隧道:内网8001 → 云机本地18001
autossh -M 0 -N -R 127.0.0.1:18001:127.0.0.1:8001 ubuntu@llm.litearch.cn
关闭旧隧道:
pkill -f autossh
三、连通性测试命令
1. 云服务器本地测试隧道
curl http://127.0.0.1:18001/v1/models
2. 公网接口测试
curl -X POST https://llm.litearch.cn/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: XXXX" \
-d '{
"model": "Qwen/Qwen3-32B",
"messages": [{"role": "user", "content": "你好"}]
}'
四、接入调用配置
基础信息
- 接口地址:
https://llm.litearch.cn/v1 - 模型名称:
Qwen/Qwen3-32B - API Key:
EMPTY
Python 调用示例
from openai import OpenAI
client = OpenAI(
base_url="https://llm.litearch.cn/v1",
api_key="XXXX"
)
response = client.chat.completions.create(
model="Qwen/Qwen3-32B",
messages=[{"role": "user", "content": "你好"}]
)
print(response.choices[0].message.content)
五、安全强制规范
- 绝不对外放行 18001/8001 端口,只走443 HTTPS
- 所有公网接口必须加
Bearer密钥鉴权 - 同事仅接口调用,无云服务器/内网服务器SSH账号权限
- 子域名独立Nginx配置,不混入博客配置,避免被GitHub Action覆盖
- SSH禁用密码登录、改端口、仅密钥登录,防爆破
六、日常运维常用命令
- 重启LLM服务(内网服务器端):
CUDA_VISIBLE_DEVICES=0 PORT=8001 /root/Documents/code/python/scripts/serve_qwen3_32b.sh - 重启隧道(云服务端):
pkill -f autossh && autossh -M 0 -N -R 127.0.0.1:18001:127.0.0.1:8001 ubuntu@llm.litearch.cn - Nginx检查重载(云服务端):
sudo nginx -t && sudo systemctl reload nginx - 查看隧道进程(云服务端):
ps aux | grep autossh
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 kipleyarch@gmail.com