前言
传统方式暴露VPS上的服务需要开放端口、配置防火墙、申请SSL证书,步骤繁琐且有安全风险。Cloudflare Tunnel是Cloudflare提供的免费隧道服务,可以将VPS上的本地服务通过Cloudflare网络安全地暴露到互联网上,不需要开放任何端口,还自动获得DDoS防护和SSL证书。本文教你如何在VPS上配置Cloudflare Tunnel。
一、Cloudflare Tunnel的优势
- 无需开放端口:服务通过出站连接暴露,防火墙不需要开放任何入站端口
- 自动HTTPS:自动获取SSL证书,无需手动配置
- DDoS防护:流量经过Cloudflare网络,自动获得企业级DDoS防护
- 隐藏真实IP:对外只暴露Cloudflare的IP,保护VPS真实IP
- 免费使用:Cloudflare免费计划即可使用
- 支持任意TCP/UDP服务:不只是HTTP,还可以暴露SSH、数据库等
二、准备工作
- 一个域名,已托管到Cloudflare(NS指向Cloudflare)
- 一个Cloudflare账号(免费注册即可)
- VPS上安装好需要暴露的服务(如网站、面板等)
三、安装cloudflared
cloudflared是Cloudflare Tunnel的客户端工具。
Debian/Ubuntu
# 下载并安装
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb
# 验证安装
cloudflared --version
CentOS/RHEL
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-x86_64.rpm
sudo rpm -i cloudflared-linux-x86_64.rpm
通用二进制
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
chmod +x cloudflared-linux-amd64
sudo mv cloudflared-linux-amd64 /usr/local/bin/cloudflared
四、创建Tunnel
方式一:通过Cloudflare Dashboard创建(推荐新手)
1. 登录Cloudflare Zero Trust
访问 https://one.dash.cloudflare.com ,使用你的Cloudflare账号登录。
2. 创建Tunnel
- 左侧菜单 > Networks > Tunnels
- 点击 “Create a tunnel”
- 选择 “Cloudflared” 类型
- 为Tunnel取一个名称,如
my-vps - 点击 “Save tunnel”
3. 安装connector
Dashboard会显示一条安装命令,复制并在VPS上执行:
cloudflared service install eyJhIjoixxxxx...很长的token...
执行后cloudflared会作为系统服务自动运行。
4. 配置公共主机名
在Dashboard的 “Public Hostname” 部分添加:
| 设置项 | 值 |
|---|---|
| Subdomain | blog(或其他子域名) |
| Domain | yourdomain.com |
| Service Type | HTTP |
| Service URL | localhost:80 |
点击保存后,blog.yourdomain.com 就会通过Tunnel指向VPS上的 localhost:80。
方式二:通过命令行创建
1. 登录Cloudflare
cloudflared tunnel login
浏览器会打开Cloudflare授权页面,选择你的域名并授权。
2. 创建Tunnel
# 创建Tunnel
cloudflared tunnel create my-vps
# 查看已创建的Tunnel
cloudflared tunnel list
3. 配置路由
# 将域名指向Tunnel
cloudflared tunnel route dns my-vps blog.yourdomain.com
4. 创建配置文件
mkdir -p ~/.cloudflared
nano ~/.cloudflared/config.yml
tunnel: my-vps
credentials-file: /root/.cloudflared/<tunnel-id>.json
ingress:
# 博客网站
- hostname: blog.yourdomain.com
service: http://localhost:80
# 管理面板(如1Panel)
- hostname: panel.yourdomain.com
service: http://localhost:8888
# SSH访问
- hostname: ssh.yourdomain.com
service: ssh://localhost:22
# 其他TCP服务
- hostname: db.yourdomain.com
service: tcp://localhost:3306
# 兜底规则(必须放在最后)
- service: http_status:404
5. 测试并启动
# 测试配置
cloudflared tunnel ingress validate
# 测试运行
cloudflared tunnel run my-vps
# 安装为系统服务(开机自启)
cloudflared service install
sudo systemctl enable cloudflared
sudo systemctl start cloudflared
五、通过Tunnel访问SSH
Cloudflare Tunnel支持暴露SSH服务,让你可以通过域名安全地SSH连接VPS。
配置Tunnel端
在config.yml中已包含SSH服务配置:
- hostname: ssh.yourdomain.com
service: ssh://localhost:22
配置客户端
在你本地电脑上安装cloudflared,然后配置SSH:
编辑 ~/.ssh/config:
Host yourdomain.com
ProxyCommand /usr/local/bin/cloudflared access ssh --hostname %h
User root
Port 22
然后直接SSH连接:
ssh yourdomain.com
首次连接会打开浏览器进行Cloudflare身份验证。
这种方式的好处是SSH端口不需要对公网开放,所有连接都经过Cloudflare的零信任认证。
六、高级配置
保护敏感服务
对于管理面板等敏感服务,可以在Cloudflare Zero Trust中配置访问策略:
- 进入 Access > Applications
- 创建Application,关联你的Tunnel域名
- 配置策略:要求邮箱验证、IP白名单等
# config.yml - 使用Cloudflare Access保护
ingress:
- hostname: panel.yourdomain.com
service: http://localhost:8888
originRequest:
noTLSVerify: true
暴露多个服务
一个Tunnel可以暴露多个服务,每个服务使用不同的子域名:
ingress:
- hostname: blog.yourdomain.com
service: http://localhost:80
- hostname: cloud.yourdomain.com
service: http://localhost:8080
- hostname: monitor.yourdomain.com
service: http://localhost:3001
- hostname: panel.yourdomain.com
service: http://localhost:8888
- service: http_status:404
使用Path路径区分服务
也可以用路径区分同一域名下的不同服务:
ingress:
- hostname: app.yourdomain.com
path: /api/*
service: http://localhost:3000
- hostname: app.yourdomain.com
service: http://localhost:8080
- service: http_status:404
七、管理与维护
# 查看Tunnel状态
sudo systemctl status cloudflared
# 查看日志
sudo journalctl -u cloudflared -f
# 重启服务
sudo systemctl restart cloudflared
# 更新cloudflared
sudo cloudflared update
sudo systemctl restart cloudflared
八、常见问题
Tunnel连接后服务访问很慢?
Cloudflare免费计划不保证速度。可以在Cloudflare Dashboard中切换不同的Cloudflare数据中心节点试试。部分地区的Cloudflare节点到国内速度一般,可以搭配优选IP使用。
可以不用Cloudflare Tunnel暴露服务吗?
可以。传统方式是直接开放端口+Nginx反代+Let’s Encrypt证书。Cloudflare Tunnel的优势在于不需要开端口、自动HTTPS、隐藏真实IP。如果你的VPS本身就有公网IP且不怕暴露,直接用Nginx反代也可以。
Tunnel断线怎么办?
cloudflared安装为系统服务后会自动重连。如果频繁断线,检查VPS网络是否稳定。可以在config.yml中添加:
retries: 5
和Nginx反代冲突吗?
不冲突。很多场景下Nginx反代和Cloudflare Tunnel可以配合使用:Tunnel负责暴露到外网,Nginx负责本地的反代和负载均衡。
总结
Cloudflare Tunnel是暴露VPS服务的最佳方式之一,不需要开放端口、自动获得HTTPS和DDoS防护,安全性和便利性都远超传统方案。对于刚买便宜VPS的新手来说,Cloudflare Tunnel省去了配置防火墙、申请证书等繁琐步骤,几分钟就能让服务安全上线。