我帮人排查过几次VPS被入侵的情况,事后看日志,问题几乎都出在同一个地方:Web服务直接暴露在公网端口上,没有任何身份验证。AI Agent这类工具尤其危险,它有执行代码、调用API、操作文件的权限,一旦被未授权访问,损失可能很大。
Cloudflare Tunnel解决的就是这个问题。它让VPS主动向Cloudflare建立出站连接,用户通过你的域名访问服务,整个过程不需要在VPS上开放任何入站端口。
工作原理
传统方式:用户 → 服务器IP:端口 → 服务
Cloudflare Tunnel:用户 → Cloudflare → 加密隧道 → VPS本地服务
VPS的防火墙可以完全关闭所有入站端口(除了SSH),服务器真实IP不会暴露,扫描器扫不到任何开放端口。
准备工作
三件事需要提前确认:VPS已安装并运行Hermes(或其他需要访问的服务)、有一个域名并且已经添加到Cloudflare管理(即DNS托管在Cloudflare)、Cloudflare账号。
假设Hermes本地运行在http://localhost:3000,以下步骤把它安全地暴露到https://ai.yourdomain.com。
配置步骤
安装cloudflared:
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb
cloudflared --version
登录Cloudflare账户,会打开一个授权链接,在浏览器里完成授权:
cloudflared tunnel login
创建Tunnel,名字随意:
cloudflared tunnel create hermes-tunnel
执行完会输出Tunnel ID,同时在~/.cloudflared/目录下生成一个JSON凭证文件,记住这个文件的路径。
把子域名绑定到Tunnel:
cloudflared tunnel route dns hermes-tunnel ai.yourdomain.com
创建配置文件:
nano ~/.cloudflared/config.yml
写入以下内容,把JSON文件路径替换成你实际的路径:
tunnel: hermes-tunnel
credentials-file: /root/.cloudflared/你的tunnel-id.json
ingress:
- hostname: ai.yourdomain.com
service: http://localhost:3000
- service: http_status:404
测试配置是否正确:
cloudflared tunnel ingress validate
运行Tunnel测试访问:
cloudflared tunnel run hermes-tunnel
浏览器打开https://ai.yourdomain.com,能看到Hermes界面说明配置成功。
设置开机自启
测试没问题之后,用systemd管理让它持续运行:
sudo cloudflared service install
sudo systemctl enable cloudflared
sudo systemctl start cloudflared
sudo systemctl status cloudflared
安全加固(必做)
Tunnel配置好之后,在VPS上关闭所有不必要的入站端口:
sudo ufw default deny incoming
sudo ufw allow 22/tcp # 保留SSH
sudo ufw enable
sudo ufw status
这样VPS上只有SSH端口对外开放,Hermes的3000端口完全不可见,扫描器什么都找不到。
叠加Cloudflare Zero Trust访问控制是更进一步的保护。进入Cloudflare控制台,找到Zero Trust → Access → Applications,添加你的ai.yourdomain.com域名,设置访问策略。可以要求通过Google账号、GitHub账号或邮箱验证才能访问,只有你(或你指定的人)能打开这个页面。
这个组合的效果是:即使有人知道你的域名,没有通过Zero Trust验证也看不到任何内容,VPS的真实IP也完全隐藏。
常见问题
Tunnel启动后域名访问超时,检查config.yml里的本地服务地址和端口是否正确,确认Hermes确实在运行:
curl http://localhost:3000
如果返回正常内容,问题在Tunnel配置;如果连接拒绝,Hermes没有正常运行。
日志查看:
sudo journalctl -u cloudflared -f
凭证文件找不到,检查config.yml里的路径是否和实际文件路径一致:
ls ~/.cloudflared/
JSON文件应该在那里,文件名就是Tunnel ID。
性能影响
实测Cloudflare Tunnel会增加约20到50ms的额外延迟,Cloudflare会把请求路由到最近的边缘节点再转发到VPS。对于Dashboard访问、API调用这类操作,这个延迟几乎没有感知。
Cloudflare Tunnel的基础功能完全免费,Zero Trust也有免费额度,对个人用户来说足够。
这套方案(Tunnel + Zero Trust + UFW关闭所有入站端口)是2026年自托管AI工具的推荐安全配置,比开放端口加BasicAuth要安全得多,配置复杂度也不高,一次设置好之后不需要再维护。