部署 AI 工具前,先把 VPS 安全搞扎实。不管是跑 Ollama、Open WebUI,还是折腾 Claude Code、Hermes Agent、n8n,一旦端口裸奔、SSH 弱口令、防火墙没开,你的 VPS 分分钟变成矿机或肉鸡。主机选技术博客整理了 10 项必须做的安全设置,适合所有跑 AI 应用、AI Agent 和自动化工作流的场景。

1. 修改 SSH 默认端口并禁用 root 密码登录
22 端口是扫号机的重点目标。先改端口,再上密钥。
sed -i 's/#Port 22/Port 22022/' /etc/ssh/sshd_config
sed -i 's/PermitRootLogin yes/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
systemctl restart sshd
改完后用新端口登录测试,确认没问题再关旧连接。密钥对生成可以参考 `ssh-keygen -t ed25519`,然后把公钥扔到 `~/.ssh/authorized_keys`。
2. 配置 UFW 或 iptables 防火墙只放行必要端口
AI 工具通常需要 80/443(反向代理)、11434(Ollama API)、3000(Open WebUI)、5678(n8n)等。防火墙只开这些,其余全关。
ufw default deny incoming
ufw default allow outgoing
ufw allow 22022/tcp # SSH 新端口
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 11434/tcp # Ollama
ufw allow 3000/tcp # Open WebUI
ufw allow 5678/tcp # n8n
ufw enable
注意:Ollama API 和 n8n 的 Webhook 端口如果只在内网调用,可以用 `ufw allow from 你的内网IP to any port 11434` 限制来源。
3. 禁止 ping 和端口扫描响应
很多扫描器靠 ICMP 发现主机。简单屏蔽:
echo "net.ipv4.icmp_echo_ignore_all=1" >> /etc/sysctl.conf
sysctl -p
如果线上需要监控,可以只允许特定 IP 的 ping。
4. 配置 fail2ban 防止暴力破解
SSH 改端口后仍有概率被扫,fail2ban 能自动封禁尝试次数过多的 IP。
apt install fail2ban -y
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
systemctl enable fail2ban –now
对于 AI 工具的 Web 界面(比如 Open WebUI 的登录页),也可以加 jail 规则,但注意别把自己封了。
5. 使用非 root 用户运行所有 AI 服务
root 权限过大,一旦服务被攻破,整个 VPS 就完了。创建一个专用用户:
useradd -m -s /bin/bash aiadmin
usermod -aG docker aiadmin # 如果用到 Docker
然后在 `~aiadmin/.ssh/authorized_keys` 里放你的公钥。以后所有服务(Ollama、n8n、Open WebUI)都用 `sudo -u aiadmin` 或 `docker run –user` 来跑。
6. 为 Docker 容器设置资源限制和只读文件系统
AI 工具大多跑在 Docker 里,但默认容器能写根文件系统。加参数限制:
docker run -d \
–memory="4g" \
–cpus="2" \
–read-only \
–tmpfs /tmp \
–tmpfs /var/run \
-p 11434:11434 \
ollama/ollama
`–read-only` 让容器无法写文件,日志和临时数据通过 `–tmpfs` 映射到内存。如果服务需要持久化数据(如模型、数据库),用 `-v` 挂载卷,并确保卷目录权限正确。
7. 配置自动安全更新
很多漏洞是通过系统包更新的,别等手动。用 `unattended-upgrades` 自动打补丁:
apt install unattended-upgrades -y
dpkg-reconfigure –priority=low unattended-upgrades
选择“是”即可。同时建议每天凌晨重启一次(如果服务能接受短暂中断),用 `crontab -e` 加一行:
0 4 * * * /sbin/reboot
8. 限制 API 端口的公网暴露
像 Ollama 默认监听 0.0.0.0:11434,如果直接暴露公网,任何人都能调用你的模型。两种方案:
•只监听本地:修改 Ollama 启动参数 `OLLAMA_HOST=127.0.0.1`,然后通过 Nginx 反向代理加 Basic Auth 或 IP 白名单。
•用防火墙限制来源:`ufw allow from 你的静态IP to any port 11434`。
n8n 的 Webhook 同理,不要在公网暴露 Webhook 端口,除非你用了 API Key 验证。
9. 启用 Nginx 反向代理并强制 HTTPS
AI 工具的 Web 界面(Open WebUI、n8n、Hermes Agent)建议都走 Nginx 反代,并申请 Let's Encrypt 证书。
nginx
server {
listen 443 ssl;
server_name ai.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/ai.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ai.yourdomain.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
使用 `certbot` 自动续期证书,并加一个 HTTP 到 HTTPS 的重定向。
10. 定期审计日志和监控异常连接
日志是发现入侵的第一道防线。安装 `logwatch` 或 `goaccess`,每天收邮件摘要。同时用 `netstat -tunlp` 检查监听端口,看有没有不认识的服务。
netstat -tunlp | grep LISTEN
lastb | head -20
建议每周手动跑一次,或者用 `wazuh` 做集中式安全监控(小 VPS 用 `ossec` 也可以)。
老鸟叮嘱
•别偷懒用默认密码:任何 AI 工具的管理后台,第一件事就是改默认管理员密码。Open WebUI 默认没有密码,必须设置。
•API Key 别硬编码:用环境变量或 `.env` 文件,并且 `.env` 不要提交到 GitHub。
•Docker 网络模式:如果多个容器需要通信,用自定义 bridge 网络,不要用 `–network host`,否则所有端口都暴露。
•备份:安全设置再好,也挡不住手误。定期备份模型文件、数据库和配置文件,备份到另一台机器或对象存储。
FAQ
Q1:部署 AI Agent(如 Hermes Agent)需要开放哪些端口?
A:通常 Agent 通过 API 调用,不需要额外开放端口。如果 Agent 有 Web 控制台(比如 n8n),就只开那个端口。Agent 本身监听本地回环即可。
Q2:我用的是阿里云/腾讯云,安全组和 UFW 都要配吗?
A:双重保险。云厂商的安全组是外层的,UFW 是系统内层的。建议安全组只放行需要的端口,UFW 也做同样限制。
Q3:Ollama 模型下载很慢,安全设置会影响下载速度吗?
A:不影响。防火墙只限制入站连接,出站下载模型不受影响。如果下载慢,可以换镜像源或使用代理。
Q4:跑 Claude Code 或 Codex 需要 VPS 有 GPU 吗?
A:Claude Code 和 Codex 是 API 调用型,不需要本地 GPU,普通 VPS 即可。只有本地跑模型(如 Ollama)才需要 GPU 或高性能 CPU。
Q5:n8n 的 Webhook 怎么安全暴露?
A:建议用 Nginx 反代,加 Basic Auth 或 IP 白名单。如果必须公网访问,给 Webhook 加一个随机后缀路径,比如 `/webhook/abc123`,不要用默认路径。
Q6:我改完 SSH 端口后连不上了怎么办?
A:如果防火墙没放行新端口,或者 SSH 配置语法错误,你可能会被锁。务必先开一个新终端窗口测试连接,确认正常后再关闭旧会话。如果真连不上,通过云控制台的 VNC 或救援模式进去修复。
转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/9932.html 商家投稿邮箱:zhujixuanblog@qq.com
